Commit Graph

82059 Commits

Author SHA1 Message Date
Josh Lehman 179cb1b4cb fix(cron): restrict scheduled authority to Codex owner 2026-08-24 18:37:39 -07:00
Josh Lehman 46312a4927 fix(cron): seal scheduled tool authority at host boundary 2026-08-24 16:06:31 -07:00
Josh Lehman 0a478dac8d fix(cron): reject unsealed scheduled bindings 2026-08-24 13:51:20 -07:00
Josh Lehman 570dcc9452 fix(cron): retire legacy authority after migration 2026-08-24 13:51:20 -07:00
Josh Lehman 411fce065f fix(cron): read legacy authority rows before migration 2026-08-24 13:51:19 -07:00
Josh Lehman 7094cda2f9 fix(cron): preserve scheduled bindings through normalization 2026-08-24 13:51:19 -07:00
Josh Lehman f44741691f fix(cron): preserve authority across downgrades 2026-08-24 13:51:19 -07:00
Josh Lehman d3e30d1ab9 fix(cron): bind projected exec authority to Codex 2026-08-24 13:51:19 -07:00
Josh Lehman e51ad6845e fix(cron): preserve Codex trigger exec authority 2026-08-24 13:51:19 -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
Peter Steinberger 4d8bfab33e fix(gateway): preserve cloud node ownership (#128780)
Keep durable cloud node bindings out of ordinary device placement until enrollment retirement is proven, and fail closed when worker ownership inventory cannot be read.\n\nRefs #128769
2026-08-24 08:53:12 -07:00
Peter Steinberger 28ee832da4 fix(gateway): stamp creation provenance on sessions.patch-created sessions (#128774)
The sessions.patch create path skipped createdVia and createdActor, making the creator own session invisible under createSessionListEntryFilter when gateway.roles sets sessions.others=none.

Thread resolveOperatorSessionCreation through sessions-patch-engine into projectSessionsPatchEntry and stamp only genuinely new rows, mirroring session-create-service. Preserve existing rows and placeholder aliases without restamping their provenance.

Add an owner-boundary regression proving the identified creator can see and update a patch-created session. Follow-up of #128548.
2026-08-24 08:52:32 -07:00
Peter Steinberger fc85d5fbfe docs: align systemd host tuning with managed policy (#128752) 2026-08-24 08:38:27 -07:00
Peter Steinberger a23e77b61a refactor(parallel): share search request lifecycle (#128775)
* refactor(parallel): share search request lifecycle

* refactor(parallel): keep request helpers private
2026-08-24 08:35:57 -07:00
openclaw-mantis[bot] 61bc753da3 chore(i18n): refresh native locales (#128759)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-24 08:21:09 -07:00
Peter Steinberger 70d7fb5771 refactor(tooling): remove test-only production helper exports (#128770) 2026-08-24 08:12:58 -07:00
Peter Steinberger 3dec4e3472 refactor(gateway): unify maintenance lifecycle ownership (#128766) 2026-08-24 08:09:33 -07:00
ClawSweeper a6a9f553d0 fix(ui): keep expanded panel controls clear (#128262)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-24 08:08:01 -07:00