Commit Graph

69178 Commits

Author SHA1 Message Date
Monkey-wusky
8ebb1d2aec fix(sessions): complete tail-read windows despite short positional reads (#108655)
* fix(sessions): complete tail-read windows despite short positional reads

Replace single-shot handle.read() calls in two session tail-read
paths with readFileWindowFully so multibyte-range positional reads
do not silently return incomplete tail data on network filesystems.

- readRecentTranscriptTailLinesAsync: tail-window read for recent
  session messages now loops until the requested window fills
- readLastMessagePreviewFromOpenTranscriptAsync: last-message
  preview tail read now loops until the requested window fills

The same readFileWindowFully helper was introduced in #108253 and
expanded with a sync variant in #108127 (both by sunlit-deng).

* fix(sessions): complete sync title preview reads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:25:55 -07:00
Peter Steinberger
3280a0df9a test(retry): port negative matrix for provider-wrapped statuses
Ports the unique coverage from #108126 onto the parser landed via #106850:
wrapped 401/403/404 and quota-exhausted 429 stay non-retryable, an
envelope embedded in user text is ignored, and a short-window wrapped
429 retries. Credit @zhanxingxin1998.
2026-07-16 11:22:13 +01:00
Peter Steinberger
76a236da5f fix(ci): harden release validation gates (#108798)
* fix(ci): harden release validation gates

* fix(apns): keep tombstones in strict SQLite schema

* fix(ci): isolate PR publication transport
2026-07-16 03:21:08 -07:00
pick-cat
60040d86b2 fix: normalize provider keys during model config merge (#95722)
* fix: normalize provider keys during model config merge

* fix: normalize source-managed provider keys when reapplying secret markers

Make enforceSourceManagedProviderSecrets canonicalize provider keys with
normalizeProviderId so mixed-case (e.g. "OpenAI") source config still matches
the canonical "openai" generated provider. Without this, the trim-only source
lookup misses, the source SecretRef marker is never reapplied, and resolved
runtime secret values leak into generated models.json.

Adds plan-level regressions in models-config.runtime-source-snapshot.test.ts
covering mixed-case apiKey and header source configs.

* fix: use Array#toSorted in mixed-case provider regression tests

oxlint(no-array-sort) flagged the new test assertions for using
.sort() on Object.keys(...). Switch to .toSorted() to keep the
check-lint shard green.

* style(agents): oxfmt models-config provider merge files

* fix(agents): define provider key collision precedence

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 03:20:20 -07:00
Peter Steinberger
8dd204e4fc fix(installer): retry transient Windows npm failures 2026-07-16 11:19:41 +01:00
dongdong
a88ff7a6ba fix: show config mutations in migrate text previews (#108556)
* fix: show config items in migrate text preview

* test(migrate): protect config preview redaction

Co-authored-by: JasmineZhangHM <277513763+JasmineZhangHM@users.noreply.github.com>

---------

Co-authored-by: JasmineZhangHM <277513763+JasmineZhangHM@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:19:01 -07:00
NIO
67699ddd82 fix(browser): do not sticky-adopt policy-blocked openTab targets (#105301)
* fix(browser): do not sticky-adopt policy-blocked openTab targets

* test(browser): narrow sticky redirect proof

Co-authored-by: NIO <hu.genshen@xydigit.com>

* fix(browser): validate tab adoption after navigation

Co-authored-by: NIO <hu.genshen@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:18:27 -07:00
Alix-007
00be90dae7 fix(sandbox): bound common installer downloads (#108805) 2026-07-16 03:18:02 -07:00
Peter Steinberger
f89c624ebb fix(reef): bound inbox WebSocket frames (#108886) 2026-07-16 03:17:52 -07:00
Peter Steinberger
49f7749223 fix(sandbox): stabilize remote hardlink checks (#108879) 2026-07-16 03:17:41 -07:00
wangmiao0668000666
8090cb1c64 fix(discord): honor abortSignal during gateway READY retry backoff (#108561)
* fix(discord): honor abortSignal during gateway READY retry backoff

* fix(discord): avoid __testing alias to satisfy Knip production scan

* test(discord): make READY abort proof deterministic

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

* fix(retry): support unref abort sleeps

Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 03:14:46 -07:00
Peter Steinberger
27065a65b7 fix(scripts): survive pr worktree teardown in lock release and self-heal stale registrations (#108870) 2026-07-16 03:13:44 -07:00
Peter Steinberger
05c2701e3d refactor(plugin-sdk): share widget HTML validation helpers (#108807)
* refactor(plugin-sdk): add widget HTML helpers

* refactor(plugins): share widget HTML validation
2026-07-16 03:13:29 -07:00
Alix-007
e3e071f8c1 fix(installer): bound PowerShell download stalls (#108791) 2026-07-16 03:13:26 -07:00
Peter Steinberger
5bb905caa8 test(state): cover APNs STRICT repair (#108875)
* fix(state): mark APNs tombstones strict

* chore: remove manual changelog entry
2026-07-16 03:04:46 -07:00
Peter Steinberger
8f1760b667 test(discord): restore OpenClawConfig type import in channel.policies.test.ts
The max-lines split dropped the type-only import that two casts still
use, failing check-test-types.
2026-07-16 02:54:06 -07:00
zhanxingxin1998
4bc84db398 fix(cron): allow clearing failure alert routing fields (#108578)
* fix(cron): clear failure alert routing fields

Send explicit nulls for cleared Control UI failure-alert overrides and accept those clears only in cron update patches.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* test(cron): satisfy serialized alert patch types

Narrow the serialized failure-alert fixture before asserting its cleared fields.

Co-Authored-By: OpenAI Codex <noreply@openai.com>

* fix(cron): clear failure alert overrides

Co-authored-by: 詹幸心0668001037 <zhan.xingxin@xydigit.com>

---------

Co-authored-by: OpenAI Codex <noreply@openai.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:52:19 -07:00
wahaha1223
df72216580 fix(onepassword): reject oversized service account token files (#108596)
* fix(onepassword): reject oversized service account token files

* fix(onepassword): clarify oversized token errors

Co-authored-by: wahaha1223 <0668001153@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:48:49 -07:00
Peter Steinberger
b28070543a test(discord): split channel target resolver tests (#108857) 2026-07-16 02:48:15 -07:00
Peter Steinberger
06795a669b test(discord): extract mock call helpers (#108853) 2026-07-16 02:47:30 -07:00
Peter Steinberger
e4f4b93b10 feat(mac): playful hard-hat working mascot during setup and updates (#108735)
* feat(mac): playful hard-hat working mascot during setup and updates

The mascot gets a new .working mood: it dons a safety hard hat, hammers
away with impact sparks while setup work is in flight, and pauses every
few seconds to wipe its brow. Used on the onboarding "Getting things
ready" page and the post-update window instead of the generic thinking
mood. Lives in shared OpenClawKit so iOS can adopt it too.

* chore(i18n): refresh native inventory line for mascot view
2026-07-16 02:45:19 -07:00
Peter Steinberger
b8c1ab1979 test(discord): split channel policy describes out of channel.test.ts
channel.test.ts crossed the max-lines lint budget (1002 > 1000) after
#108584; move the mock-free bindings/security/groups describes into
channel.policies.test.ts instead of suppressing.
2026-07-16 02:42:32 -07:00
Peter Steinberger
91f57a3159 fix(clawrouter): normalize Perplexity tool schemas and harden dynamic model cache (#108758) 2026-07-16 02:39:33 -07:00
Peter Steinberger
f5bb19e028 fix(state): make apns_registration_tombstones STRICT
The canonical schema gate rejects non-STRICT tables, failing every
gateway-suite shard since #108543 added the tombstones table without
STRICT. Align it with every sibling table and regenerate the schema
mirror.
2026-07-16 02:28:29 -07:00
Peter Steinberger
57ae43a89c fix(ci): harden full release validation 2026-07-16 10:26:29 +01:00
Josh Avant
e322edccfa fix(discord): resolve named agent delivery targets (#108584)
* fix(discord): resolve agent delivery targets

* fix(outbound): preserve heuristic target fallback

* fix(outbound): keep delivery helpers private
2026-07-16 02:13:10 -07:00
Leandre Chamberland-Dozois
5c1857fc55 fix(android): stop killing long chat runs with hardcoded timeouts (#106863) (#106864)
* fix(android): stop killing long chat runs with hardcoded timeouts

Two independent timeouts made any agent turn longer than ~2 minutes fail
when started from the Android app, while the same turn worked over
Telegram (#106863):

- chat.send hardcoded timeoutMs=30000, which the gateway turns into the
  server-side run expiry; the maintenance sweep then aborts longer runs
  ("CLI run aborted" / "Embedded agent failed before reply"). Omit the
  override so app runs get the configured default like other channels.

- armPendingRunTimeout declared a timeout after 120s even when the
  refreshed history snapshot confirmed the run was still in flight,
  showing a spurious error and dropping the optimistic bubble mid-run.
  Re-arm the timer in that case; terminal events and the server-side
  expiry remain the liveness backstop.

Fixes #106863

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

* chore(i18n): sync native inventory after ChatController line shifts

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

* test(android): run ChatController on backgroundScope in reconnect tests

The pending-run watchdog now re-arms while a run is confirmed in flight,
so reconnect scenarios that end with a restored in-flight run keep a
timer coroutine alive. Launch the controller on runTest's
backgroundScope so that timer is cancelled at test end instead of
failing the suite with UncompletedCoroutinesError.

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

* fix(android): bound pending-run watchdog recovery

Distinguish applied, superseded, and failed history refreshes so recovered runs neither expire during a newer authoritative load nor rearm forever after refresh failure.

Co-authored-by: Léandre Chamberland-Dozois <lchamberland-dozois@hotmail.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:12:45 -07:00
Alix-007
47dd90c5ea fix(ci): bound Android SDK downloads (#108723) 2026-07-16 02:12:07 -07:00
xingzhou
cb7f37d0fa fix(oc-path): reject oversized non-ASCII path URIs (#108576)
* fix(oc-path): reject oversized non-ASCII path URIs

* test(oc-path): cover exact UTF-8 byte limit

Co-authored-by: zhang-guiping <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:11:39 -07:00
Peter Steinberger
00d20fb798 test(discord): isolate conversation runtime spies 2026-07-16 10:08:02 +01:00
Alix-007
f0720a856d fix(e2e): time out npm registry upstream requests (#108718) 2026-07-16 02:06:25 -07:00
Abner Shang
5ad0d4d6c0 fix: avoid false restart failure during startup migrations (#105544)
* fix: wait for startup migrations on restart

* fix: honor restart readiness caller context

* fix: preserve restart service identity

* fix: refresh readiness context after repair

* fix: bound migration restart wait by wall clock

Co-authored-by: Abner Shang <abner.shang@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:04:49 -07:00
RileyJJY
b5377757d7 fix(agents): cap aggregate pressure warning dedupe cache with LRU eviction (#108667)
* fix(agents): cap aggregate pressure warning dedupe cache with LRU eviction

* fix(agents): bound tool-result warning dedupe

* fix(agents): keep warning cache limit internal

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 02:02:52 -07:00
Alix-007
81e626a6d1 fix(e2e): bound MinGit asset downloads (#108741) 2026-07-16 02:02:09 -07:00
VectorPeak
eb31350442 fix(twitch): preserve intraword underscores in outbound text (#108548)
* fix(twitch): preserve intraword underscores

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

* fix(twitch): tighten underscore emphasis boundaries

Preserve multiline emphasis stripping and combining-mark identifiers.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@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-16 02:00:30 -07:00
Peter Steinberger
b8a6341617 test: publish run-with-env readiness after signal setup (#108787) 2026-07-16 02:00:15 -07:00
loong954
804de49dda fix: prevent stale plugin installs from blocking lifecycle commands (#107691)
* fix(plugins): handle ENOTDIR gracefully in npm-project-roots

The listManagedPluginNpmProjectRootsSync and listManagedPluginNpmProjectRoots
functions only caught ENOENT errors when reading the projects directory,
but an ENOTDIR error (when a file path is mistakenly used as a directory)
would propagate unhandled and crash the CLI.

Replace the local isMissing helper with the shared isNotFoundPathError from
infra/path-guards.ts, which already covers both ENOENT and ENOTDIR.

Fixes #107467

* test(plugins): use managed temp directory fixture

* chore: keep release notes out of contributor PR

* fix(plugins): restore not-found path guard export

* fix(plugins): normalize Windows managed install paths

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-16 01:59:48 -07:00
Alix-007
5cd9243465 fix(ci): bound Windows Testbox phone-home requests (#108755) 2026-07-16 01:57:53 -07:00
Peter Steinberger
9da11f7c3f fix(scripts): report retained pr-lock evidence and clearer artifact validation errors (#108785) 2026-07-16 01:55:33 -07:00
Alix-007
8a21f640e3 fix(ci): bound release resume tarball downloads (#108766) 2026-07-16 01:54:50 -07:00
snowzlmbot
fdaae75645 fix(ui): expose derived session titles accessibly (#96267)
* fix(ui): improve accessible session history picker

* fix(ui): clean session picker ARIA semantics

* fix(ui): preserve derived titles after session patches

Reuse the most recent sessions.list options when refreshing after sessions.patch so derived-title hydration survives normal patch flows. Add unit and browser E2E coverage for patch refreshes retaining readable sidebar titles.

* test(ui): split session list option coverage

---------

Co-authored-by: snowzlmbot <snowzlmbot@users.noreply.github.com>
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:53:37 -07:00
Peter Steinberger
723d12fd4c refactor(apns): move registrations to shared SQLite (#108543)
* refactor(apns): move registrations to SQLite

* fix(apns): satisfy strict migration typing

* chore(apns): remove obsolete lint suppression

* chore: prune APNs max-lines baseline

* refactor(apns): keep store internals private

* fix(apns): preserve stored relay origins

* fix(apns): advance versions across deletion

* fix(apns): harden legacy state import

* fix(apns): redact legacy import errors

* fix(apns): reserve version successor

* fix(apns): bound legacy timestamp imports

* refactor(apns): extract payload builders
2026-07-16 01:52:15 -07:00
Alix-007
b7270eccc6 fix(e2e): bound Windows prerequisite metadata fetches (#108698) 2026-07-16 01:51:26 -07:00
Peter Steinberger
de17534779 fix(docs): render taxonomy closing tags 2026-07-16 04:50:41 -04:00
Alix-007
ea3ac194f4 fix(ci): bound Mantis runner IP discovery (#108699) 2026-07-16 01:50:22 -07:00
zengLingbiao
c2b73a0a01 fix(envelope): accept timestamp 0 in formatEnvelopeTimestamp (#106407)
* fix(envelope): accept timestamp 0 in formatEnvelopeTimestamp

formatEnvelopeTimestamp used if (!ts) to check for missing timestamps,
which incorrectly rejected the valid numeric timestamp 0 (Unix epoch).
Replace the falsy check with an explicit undefined/null check so 0 is
treated as a valid timestamp value.

* refactor(auto-reply): tighten epoch timestamp fix

Exercise the public envelope path with an exact epoch result and keep the missing-value guard aligned with its declared input type.

Co-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:50:08 -07:00
Alix-007
0b7f4ccb72 fix(ci): bound Telegram QA OIDC requests (#108701) 2026-07-16 01:49:15 -07:00
Peter Steinberger
a5d1d9e473 fix(openai): harden codex catalog, routing opt-out, and WHAM half-open reprobe (#108683)
- Align OAuth model-discovery client_version with the pinned @openai/codex
  package (contract test ties it to extensions/codex/package.json).
- Static OAuth fallback advertises only the proven GPT-5.6 subscription
  route (Sol); Terra/Luna come from live discovery when entitled. (#105445)
- Honor the deprecated whole-agent agentRuntime openclaw opt-out for
  implicit Codex plugin installation; explicit model policy still wins. (#95131)
- Half-open reprobe for long WHAM subscription blocks: bounded 45-minute
  background probes with durable claims, generation checks, and process
  dedupe so restored capacity unblocks profiles early. (#107262)
2026-07-16 01:48:54 -07:00
pick-cat
6c11d261e2 fix(feishu): add chunk-idle timeout to inbound media download (#106541)
* fix(feishu): add chunk-idle timeout to inbound media download

* fix(feishu): extract media chunk-idle helper under LOC ratchet

* fix(feishu): keep only used media idle export for knip/lint

* test(feishu): add executable negative control for stalled media hang

* test(feishu): avoid dangling underscore in negative control

* test(feishu): add production-path idle proof with real saveMediaStream

* fix(feishu): drop await in media idle finally so timeout escapes stalled Readable

The finally block's `await iterator.return()` blocked the timeout error
from propagating when the source is a real Node.js Readable.
Readable async-iterator `return()` does not settle on stalled streams,
so awaiting it made the whole idle timeout a no-op for that boundary.

Add Lark SDK boundary tests with real Readable streams (stalled,
progressing, multi-chunk) and production-path proof.

* fix(feishu): thread canonical Feishu timeout through media download

Derive the per-chunk idle timeout from resolveConfiguredHttpTimeoutMs()
so the established Feishu HTTP-timeout policy (env var, account config,
default) is preserved instead of a hardcoded 30s fallback.

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

* fix(feishu): restore sanitizeFileNameForUpload export lost in cherry-pick

The extraction commit (extract media chunk-idle helper) removed the
export from media.ts and the let declaration from media.test.ts during
the cherry-pick because origin/main does not export this function.

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

* fix(feishu): destroy stalled source on chunk-idle timeout

Destroy the underlying Readable source when the idle timer fires so the
Lark SDK stream and its HTTP resource close instead of leaking. Previously
only iterator.return() was called without awaiting it, which dropped the
cleanup promise on stalled Node Readables without releasing resources.

Add assertions in tests and proof that the source Readable is destroyed
after timeout.

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

* fix(feishu): drop unused export and compact timeout calls to stay under LOC ratchet

Removes the `export` from sanitizeFileNameForUpload (never imported outside
media.ts and its test) and uses a local `save` wrapper in
saveFeishuResponseMedia to keep the chunk-idle timeout calls single-line so
media.ts stays under its baseline. The test no longer imports the
now-private helper.

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

* chore: trigger CI after rebase onto main

* chore: trigger CI after rebase onto main

* test(feishu): add HTTP loopback proof for media chunk-idle destroy

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

* fix(feishu): clear media idle proof oxlint

* fix(feishu): bound stalled inbound media streams

Co-authored-by: Pick-cat <huang.ting3@xydigit.com>

* test(feishu): avoid promise executor return

Co-authored-by: Pick-cat <huang.ting3@xydigit.com>

* fix(feishu): keep media timeout authoritative

Co-authored-by: Pick-cat <huang.ting3@xydigit.com>

---------

Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 01:48:44 -07:00
Peter Steinberger
9d4652a46c refactor: make update runtime preflight result explicit (#108760) 2026-07-16 01:48:29 -07:00