Commit Graph

82067 Commits

Author SHA1 Message Date
Dallin Romney 2fd3db332a fix(qa): use canonical scenario deadline grace 2026-08-24 16:06:26 -07:00
Dallin Romney 03cf96a326 fix(qa): reserve Matrix no-reply deadline headroom 2026-08-24 16:05:56 -07:00
Dallin Romney 6f41837471 fix(qa): reserve Matrix no-reply cleanup budget 2026-08-24 16:05:56 -07:00
Ben Badejo 9b36c8bc56 fix(docs): document OpenAI audio auth with OAuth (#128885)
Co-authored-by: Benjamin Badejo <ben@benbadejo.com>
2026-08-24 15:58:05 -07:00
Josh Lehman 5487f23468 perf(sqlite): avoid unnecessary snapshot workers (#128884) 2026-08-24 15:54:36 -07:00
Martin Cleary 7f24f54214 docs: require discussion for material SQLite changes (#128876) 2026-08-24 23:53:14 +01:00
Peter Steinberger b1b26be853 fix(ui): show when connected chats cannot receive live messages (#128865)
* fix(ui): surface failed live chat subscriptions

* test(ui): type live message subscription fixtures
2026-08-24 15:42:52 -07:00
Peter Steinberger c50f90251e fix(gateway): surface cloud workspace recovery failures (#128864)
* fix(gateway): record workspace recovery failures

Persist bounded, deduplicated recovery-attempt failures through the session transcript while preserving pending workspace result fences, and prefer current recovery errors over stale terminal reasons.\n\nRefs #128850

* fix(gateway): revalidate recovery transcript ownership

Recheck the canonical session mapping inside the queued transcript transaction so a rebound session cannot receive a stale workspace recovery diagnostic.\n\nRefs #128850
2026-08-24 15:38:25 -07:00
Vincent Koc 0d4e369b1c test(ui): scope Claude session selection to sidebar links (#128874)
* test(ui): scope Claude session link locators

* test(ui): keep Claude locator fix under lint cap
2026-08-24 15:24:18 -07:00
Josh Avant d74555299d fix(agents): keep Unicode filename reads inside workspace (#128873) 2026-08-24 15:03:32 -07:00
Peter Steinberger a30e310910 fix(browser): isolate parent and leaf CLI options (#128870) 2026-08-24 14:58:34 -07:00
RoboClaw 94bd567674 refactor(ui): flatten tasks page layout (#128853)
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-24 14:45:48 -07:00
Peter Steinberger 5f9fda20c9 fix(cron): route script notifications to their owning agent (#128856) 2026-08-24 14:26:01 -07:00
Peter Steinberger be509faf94 fix(cli): emit JSON parse errors for default-machine commands (#128861) 2026-08-24 14:15:23 -07:00
Vincent Koc c40e787309 fix(ci): preserve iOS Fastlane root after cd (#128854) 2026-08-24 14:06:37 -07:00
Peter Steinberger d48166515e fix(plugins): surface load errors in the default plugin list (#128849)
* fix(plugins): show load errors in the default plugin list

* fix(plugins): preserve disabled plugin descriptions
2026-08-24 14:02:07 -07:00
Peter Steinberger 97e732715a fix(slack): keep edited and deleted messages in their original threads (#128768)
* fix(slack): route threaded edits and deletes to their sessions

* fix(slack): tighten threaded-event assertion baseline
2026-08-24 14:00:52 -07:00
Peter Steinberger 5775cd3dfa fix(cli): explain empty capability listings (#128852) 2026-08-24 13:44:42 -07:00
Miorbnli 3a17d5993a fix: prevent $-pattern injection in prompt template and approval substitution (#123015)
* fix: prevent dollar-pattern injection in prompt template and approval substitution

Three call sites used String.replace/replaceAll with a string replacement
fed a runtime variable, causing dollar-amp/dollar-1/dollar-backtick
sequences in user-supplied args or approval ids to corrupt the rendered text.

Switch each to a function replacement so the value is treated literally:

- prompt-template-arguments: dollar-ARGUMENTS and dollar-@ substitution
  corrupted slash-command args containing dollar signs
- get-reply-inline-actions: bundle command template expansion had the
  same issue with normalizedArgs
- approval-reaction-runtime: approval id placeholder rendering mangled
  ids containing dollar signs; the iMessage sibling
  (extensions/imessage/src/approval-text.ts) already escapes this

* fix: rebase, drop unproven approval rewrite, add dollar regression

Address review: the approval placeholder helper has no canonical
/approve <id> producer in the plugin-SDK manual fallback path, so its
rewrite is unproven - revert it. Keep the two reachable prompt-template
fixes and add an owner-boundary regression covering literal dollar
sequences in dollar-ARGUMENTS and dollar-@ substitution (fails on the
old string replacement form, passes with the callback form).

* test(auto-reply): cover literal dollar bundle command arguments

* fix(agent-core): resolve prompt placeholders in a single substitution pass
2026-08-24 13:43:23 -07:00
Peter Steinberger bea8740981 fix(matrix): show edited messages in replies and thread context (#128763)
* fix(matrix): use edited messages in reply and thread context

* fix(matrix): narrow bundled edit records without assertions
2026-08-24 13:38:57 -07:00
Peter Steinberger 998128abd8 fix(reply): preserve distinct streamed location replies (#128846) 2026-08-24 13:28:09 -07:00
Peter Steinberger 2a39c50227 fix: make full verification hermetic across local environments (#128777)
* test: harden full verification fixtures

* test: resolve main fixture overlap
2026-08-24 13:26:00 -07:00
Peter Steinberger 9a15d4cbf9 fix(discord): keep forum attachments and receipts in their first thread (#128765)
* fix(discord): keep structured forum attachments in one thread

* test(discord): type forum delivery fixture sender
2026-08-24 13:17:06 -07:00
Peter Steinberger a99317ef97 refactor(gateway): unify bounded chat history across transports (#128844) 2026-08-24 13:06:06 -07:00
Peter Steinberger 9e98229678 fix(plugins): report Git commit updates when package version is unchanged (#128841) 2026-08-24 12:55:47 -07:00
Peter Steinberger b91f1ea6e0 fix(outbound): normalize valid attachment data URLs (#128823) 2026-08-24 12:54:26 -07:00
qingminlong 97cc8d6d34 docs: correct directory JSON failure envelope (#124989)
* docs: correct directory JSON failure envelope

* docs(cli): document canonical config and directory JSON failures

Preserve the contributor directory error-envelope correction and update config get to distinguish schema-valid unset paths from unknown paths while linking the shared canonical CLI JSON failure contract.

Co-authored-by: qingminlong <qing.minlong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-24 12:48:27 -07:00
RoboClaw b4c620b157 fix(ui): compact touch tool rows (#128839)
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-24 12:43:53 -07:00
Vladislav Smolensky 636b00cb04 fix(cli): normalize echoed binary tool outputs (#128699)
* fix(cli): image-heavy Claude CLI turns abort after about fifteen screenshots

The Claude CLI emits every image tool result twice in its stream-json
output: once inside `message.content[].tool_result.content[]` and once in
the `tool_use_result` field it echoes alongside the message. The
normalizer added in #119486 only walks the message copy, so the echoed
copy still counts against the 8 MiB per-turn raw-output budget and is
still retained in the live-turn line buffer.

Walk the whole parsed user record instead, so both copies are stubbed,
and cover the `tool_use_result.file.base64` shape the built-in image
read echoes. openclaw never reads `tool_use_result` (no references in
src), so nothing downstream changes.

[AI-assisted]

* fix(cli): make echoed-payload normalization stack-safe

Addresses the review finding on the recursive walker. The normalizer now
lives in its own module as one canonical entry point, walks the record
iteratively with an explicit stack, and falls back to raw accounting when
a record is too deeply nested for `JSON.stringify` to re-serialize.

Adds a 50,000-deep regression record, built as text because
`JSON.stringify` itself cannot serialize one that deep.

[AI-assisted]

* fix(cli): normalize Agent SDK REPL binary echoes

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-24 12:29:56 -07:00
ClawSweeper 798c21af7b feat(ui): search sessions and catalogs from command palette (#128356)
* feat(ui): search session context from command palette

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

* fix(ui): harden unified session search

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

* fix(ui): preserve control UI style budget

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

* feat(ui): search command palette catalogs

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

* fix(ui): surface incomplete palette searches

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

* fix(ui): distinguish incomplete transcript results

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-24 15:27:12 -04:00
Peter Steinberger 6fe4e11a78 fix(gateway): reuse verified GitHub profiles during outages (#128833) 2026-08-24 12:15:48 -07:00
Peter Steinberger e1a700840a fix(update): keep managed handoff as successor owner (#128212)
* fix(update): make managed handoff own successor

Park the exact native service before Gateway close and coalesce same-root handoff requests so only the detached updater can activate and restart.

* refactor(update): reuse restart ownership helpers

* test(gateway): isolate supervisor restart fixtures

* fix(update): cancel handoff before restart fallback

* fix(update): harden managed service handoff

* fix(update): use canonical SQLite opener

* fix(update): preserve lifecycle runtime boundaries
2026-08-24 11:56:20 -07:00
RoboClaw b0e8a985ee feat(ui): load owner sessions before shared roster (#128767)
* feat(ui): load owner sessions before shared roster

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

* fix(ui): preserve owner roster across refreshes

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
2026-08-24 11:50:36 -07:00
ClawSweeper a5b5920444 feat(ui): configure capabilities before session start [AI-assisted] (#128081)
* feat(ui): configure capabilities before session start

Reuse the active-chat Plus menu on new sessions, move Draft into it, and persist admin-scoped tool overrides before the initial turn. Closes #128079.

* test(ui): follow new-session Draft menu

* refactor(ui): reconcile new-session capability ownership

* fix(ui): gate terminal launch on capability overrides

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-24 11:47:12 -07:00
Vincent Koc 88f417d328 fix(ci): pin iOS Fastlane toolchain (#128735)
* fix(ci): pin iOS Fastlane toolchain

* fix(ci): enforce locked iOS Fastlane path

* fix(ci): route iOS docs through bundle

* fix(ci): pin all documented iOS Fastlane commands

* fix(ci): make iOS bundle selection canonical

* fix(ci): enforce the locked iOS Fastlane path

* fix(ci): pin Bundler in iOS wrapper

* fix(ci): require the iOS Fastlane Gemfile

* fix(docs): pin direct iOS Fastlane bundle
2026-08-24 11:45:05 -07:00
Peter Steinberger f533cde954 fix(update): verify complete Control UI assets (#128825) 2026-08-24 11:43:50 -07:00
Peter Steinberger bf83a4dde8 fix(node-host): recover worker hosting after transient initialization failures (#128798)
* fix(node-host): retry worker supervisor initialization

Clear failed initialization ownership for retry, retain valid container supervisors after transient reconciliation errors, and retry from the runtime until capacity becomes authoritative or shutdown cancels the lifecycle.\n\nRefs #128794

* fix(node-host): preserve permanent container mismatch failures

Keep durable engine and daemon-context mismatches on the actionable disabled path while retrying only transient supervisor reconciliation failures.\n\nRefs #128794

* fix(node-host): withdraw hosting on late context mismatch

Stop retrying when a later reconciliation attempt proves a permanent container context mismatch, close the supervisor, and withdraw worker hosting from runner inventory.\n\nRefs #128794
2026-08-24 11:06:52 -07:00
Ayaan Zaidi 5238648a3b fix(chat): show native commentary progress (#128793)
Preserve native provider commentary as keyed progress items across live delivery and history reloads while keeping cursor pagination reachable.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-24 17:58:26 +00:00
Peter Steinberger 3c2667ca40 fix(gateway): fill older chat pages without duplicate transcript storage (#128810)
* fix(gateway): page visible chat history without duplicate storage

* chore: keep release changelog owned by release automation
2026-08-24 10:43:59 -07:00
Ayaan Zaidi 614e084cf8 improve: serialize Telegram Mantis proofs (#128811)
Queue Telegram-visible Mantis proofs at workflow level so only one shared-user run allocates a runner at a time.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-24 23:10:45 +05:30
Peter Steinberger 86d2c35e2e fix(feishu): preserve captions after inferred voice degrades (#128771) 2026-08-24 10:38:26 -07:00
Vincent Koc 7d08e40e2f fix(qa): run explicitly selected Telegram RTT scenarios (#128795)
* fix(qa): support explicit Telegram RTT scenarios

* docs(qa): document Telegram RTT scenario selection

* fix(qa): expose Telegram RTT scenario in manual E2E

* fix(qa): gate historical Telegram downgrade proof
2026-08-24 10:26:30 -07:00
Peter Steinberger 56664c5cfb fix(codex): preserve GitHub tool capability (#128807) 2026-08-24 10:12:19 -07:00
Peter Steinberger d2d58a58c6 test(ui): split settings node suite by concern (#128788)
* test(ui): split settings node suite by concern

ui/src/app/settings.node.test.ts sat at 999 oxlint-counted lines against
the 1000-line max-lines cap, so any added assertion failed the core lint
shard — and, as in #128474, could pass locally while only the merge ref
tripped the cap.

Split the 42-test monolith along the surfaces it actually covers: the
base file keeps gateway URL derivation, tab-local token handling, and
per-gateway session scoping; preference persistence and layout
persistence move to dotted siblings, matching the existing
settings.sidebar-prefs.node.test.ts precedent. Test names and count are
unchanged (47 across the settings node suites, before and after).

The location/base-path/settings-fixture helpers and the storage
lifecycle hooks are now shared from ui/src/test-helpers/settings-node.ts
instead of being copy-pasted per file; sidebar-prefs drops its duplicate
copies too.

* test(node-host): write fake container-engine state atomically

checks-node-compact-large-3 failed twice on this branch in different
tests of node-worker-supervisor.container.test.ts, most recently with
"SyntaxError: Unexpected end of JSON input" raised from the fake engine's
load() while the supervisor ran `docker rm --force`.

The shim saved container state with a truncating fs.writeFileSync while
sibling shim invocations (rm, inspect, wait, ps) read the same path, so a
reader could observe the zero-length window and exit 1. Write to a
".pending" sibling and rename over the target instead; rename is atomic,
so readers always see a complete previous or next state. The ps handler
filters on the ".container.json" suffix, so pending files are ignored.

A concurrent write/read probe over the old pattern produced 2014 partial
reads in 212900; the same probe over write-then-rename produced 0 in
203468. Not reproducible end-to-end on macOS, where the truncation
window is far narrower than on the loaded Linux shard.
2026-08-24 10:10:19 -07:00
Peter Steinberger dbf4120742 fix(worktrees): stop repeated startup cleanup errors (#128761)
* fix(worktrees): collect ignored nested checkouts

* fix(worktrees): preserve ignored foreign repositories

* test(worktrees): cover empty ignored foreign repositories
2026-08-24 10:02:38 -07:00
ClawSweeper 29f39affc2 fix(agents): resolve terminal from admitted gateway (#128348)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
2026-08-24 12:46:14 -04:00
Shakker 0fc18f7447 fix: prevent stale transcript projections from publishing (#126947)
Fence transcript projections by source generation so stale rebuilds cannot publish or satisfy readers.

Refs #126914.
2026-08-24 17:38:34 +01:00
Shakker 59abf3de62 feat: persist stateful transcript display semantics (#126943)
Persist stateful transcript display semantics through one shared reducer for incremental and rebuilt projections.

Refs #126914.
2026-08-24 17:36:21 +01:00
Peter Steinberger 053b89d80f improve(ui): open short session links without extra lookup (#128778)
* perf(ui): remove short session route waterfall

* docs: clarify short link gateway requirement
2026-08-24 09:33:20 -07:00
Shakker 59a9221180 feat: persist bounded transcript display rows (#126939)
Persist bounded transcript display rows and lazy projection lifecycle in the per-agent SQLite store.

Refs #126914.
2026-08-24 17:28:49 +01:00