Commit Graph

66940 Commits

Author SHA1 Message Date
Peter Steinberger
851156af3b feat: animate the OpenClaw mascot across web, iOS, and Android
Ports the openclaw.ai hero mascot animation (body float 4s, eye blink 3s,
antenna wiggle 2s, staggered claw snaps 4s) to every product surface that
shows the logo:

- web: ui/public/favicon.svg now carries SMIL animations, so every <img>
  usage (login gate, sidebar brand, agent avatar fallback) animates with
  no markup changes; CSS animations do not run in <img>-loaded SVGs.
- iOS: new OpenClawMascotView renders the canonical 120x120 vector via
  Canvas + TimelineView (30fps, honors Reduce Motion); OpenClawProMark
  uses it in onboarding, sidebar, and command center. Static PNG imageset
  deleted (watch app keeps its own copy).
- Android: new OpenClawMascot composable (PathParser + infinite
  transitions, honors the OS animator scale) replaces the static vector
  drawable in onboarding and the chat/shell/voice headers, with tint
  support for the monochrome header silhouettes. Drawable deleted.
2026-07-04 20:14:34 -07:00
Peter Steinberger
fcd7eb6130 feat(android): terminal settings screen hosting the gateway terminal page 2026-07-04 20:07:56 -07:00
Peter Steinberger
211e0d7263 feat(ios): Terminal hub destination embedding the gateway terminal page 2026-07-04 20:07:19 -07:00
Peter Steinberger
9c7848928f feat(control-ui): full-screen terminal-only view mode for mobile WebViews 2026-07-04 20:07:18 -07:00
Peter Steinberger
bafdec9868 fix: preserve codex transcript ownership (#100160)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 20:04:43 -07:00
WhatsSkiLL
1a23b266ef [AI-assisted] fix(android): polish Voice text truncation (#100060) 2026-07-04 22:59:42 -04:00
Peter Steinberger
2ec765edea fix(auto-reply): deliver model directive acknowledgements (#100151) 2026-07-05 03:57:11 +01:00
Peter Steinberger
4d181b62a9 fix(status): hide healthy plugin summary (#100143)
* fix(status): hide healthy plugin summary

* fix(status): hide healthy plugin summary
2026-07-04 22:55:23 -04:00
Peter Steinberger
194d85e891 fix(ui): chat workspace panel leaves an empty gap when collapsed (#100088)
* fix(ui): remove reserved gap when chat workspace rail is collapsed

* fix(ui): remove reserved gap when chat workspace rail is collapsed
2026-07-04 22:53:27 -04:00
Ayaan Zaidi
b34c188f8f fix(agents): surface Claude CLI thinking token progress 2026-07-04 19:43:11 -07:00
Ayaan Zaidi
32d791fee3 fix(auto-reply): bridge queued CLI reasoning streams 2026-07-04 19:43:11 -07:00
Jeff Sutherland
1945a8e5de Warn on shared Slack Socket Mode connections (#79938)
* Warn on shared Slack Socket Mode connections

* fix(slack): harden shared socket diagnostics

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 22:41:18 -04:00
cxbAsDev
f400eb718f fix(tui): isolate embedded event listener failures (#100117)
* fix(tui): suppress unhandled rejection from async agent event handler

* fix(tui): isolate embedded event listener failures

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 22:40:49 -04:00
Vincent Koc
58d707fbed fix(infra): avoid session warning duration double rounding 2026-07-05 04:37:43 +02:00
Gio
55683d23e3 test(policy): avoid Object.groupBy in fix metadata coverage 2026-07-04 19:34:17 -07:00
Gio
ab90e3a922 chore(policy): normalize fix recommendation formatting 2026-07-04 19:34:17 -07:00
Gio Della-Libera
28316c8c07 policy: keep recommendations out of attestations 2026-07-04 19:34:17 -07:00
Gio Della-Libera
0af35c1477 policy: keep fix recommendations policy-owned 2026-07-04 19:34:17 -07:00
Gio Della-Libera
6f7d1427c6 policy: emit fix recommendations in json 2026-07-04 19:34:17 -07:00
Gio Della-Libera
f466ebc00c policy: classify doctor fix recommendations 2026-07-04 19:34:17 -07:00
Amir
1efc7270cd fix(cli): include aliases in shell completion (#99419)
* fix(cli): shell completion omitted command aliases like capability, chat, and cron create

* fix(cli): route the dead exec-approvals root alias and single-source alias path expansion

* fix(cli): complete nested aliases in Bash

Co-authored-by: Jack-dev-ops <chen.zegui@xydigit.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Jack-dev-ops <chen.zegui@xydigit.com>
2026-07-04 19:33:00 -07:00
Ayaan Zaidi
eb2f9bece7 fix(agents): persist spill metadata for elision recovery
Preserve fullOutputPath plus partial-spill metadata when oversized tool-result details are summarized for persistence. This keeps aggregate elision from relabeling capped or source-truncated web_fetch spill files as complete after reload.
2026-07-04 19:26:16 -07:00
Ayaan Zaidi
235f18def5 fix(agents): spill truncated web fetch output
Write truncated web_fetch extracted content to owner-only private temp files using the shared Full output footer contract. Spills use the wrapped untrusted-content form, cap recoverable content at 2,000,000 chars, and label capped or source-truncated spills as partial instead of full output.
2026-07-04 19:26:16 -07:00
Ayaan Zaidi
ad826faf0d fix(agents): preserve spill pointers through tool-result elision
Keep aggregate elision recoverable by preserving existing spill pointers only when the original model-visible footer already disclosed the path. This commit also keeps partial-spill markers honest, handles JSON-escaped footers, and resolves full-clear markers from the original tool-result message after partial aggregate shrinking.
2026-07-04 19:26:16 -07:00
Peter Steinberger
adf25f853c fix(ui): add chat transcript top spacing (#100144)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 19:24:25 -07:00
NIO
b4f09fe7fa fix(qa-lab): bound suite runtime gateway JSON response reads (#99165)
Summary:
- The PR replaces QA Lab suite gateway `fetchJson` success-path `response.json()` with shared `readProviderJsonResponse` and adds an oversized-response regression test.
- PR surface: Source +1, Tests +33. Total +34 across 2 files.
- Reproducibility: yes. Current main still has the unbounded `response.json()` success path in `fetchJson`, an ... l proof for oversized streamed bodies, early cancellation, normal parsing, and the focused regression test.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(scripts): satisfy oxlint in qa-lab suite gateway bound proof
- PR branch already contained follow-up commit before automerge: fix(qa-lab): bound suite runtime gateway JSON response reads
- PR branch already contained follow-up commit before automerge: chore: drop local proof script from qa-lab gateway bound PR

Validation:
- ClawSweeper review passed for head 8c0eb49fcb.
- Required merge gates passed before the squash merge.

Prepared head SHA: 8c0eb49fcb
Review: https://github.com/openclaw/openclaw/pull/99165#issuecomment-4868175663

Co-authored-by: NIO <nocodet@mail.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Approved-by: takhoffman
2026-07-05 02:16:25 +00:00
Narahari Raghava
7d3cfa85dc fix(infra): roll session warning durations across unit boundaries (#100096)
* fix(infra): formatDuration rolls over near-boundary values to the next unit

The raw float was checked against the boundary before rounding, so values
like 59.5s, 59m30s, and 23h59m30s rounded up to "60 seconds", "60 minutes",
and "24 hours" in session maintenance warning messages instead of "1 minute",
"1 hour", and "1 day". Round first, then check the unit boundary.

Closes #99978

* fix(infra): fix formatDuration progressive rollover in session maintenance warning

Round seconds first, then promote to the next unit only when the
rounded lower unit reaches its overflow threshold (60s->min, 60m->hr,
24h->day). The previous approach compared raw milliseconds against the
unit boundary before rounding, causing half-unit values like 30s, 30m,
and 12h to promote one unit too early.

Closes #99978

* test(infra): expose formatDuration via testing export for direct verification

* ci: retrigger checks

* ci: retrigger checks

* test(infra): keep duration formatter private

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-04 19:02:30 -07:00
Vincent Koc
48d12dcc8d chore(plugin-sdk): refresh API baseline hash 2026-07-05 03:54:37 +02:00
Peter Steinberger
31cf660319 fix(chat): hide duplicate channel delivery mirrors (#100136) 2026-07-04 21:53:32 -04:00
Peter Steinberger
ea5d4b7943 chore: enable array fill lint rule (#100122)
* chore: enable array fill lint rule

* chore: enable array fill lint rule

* chore: enable array fill lint rule
2026-07-04 21:51:08 -04:00
qingminlong
9b78ec8d6f fix: keep subagent truncation within max length (#100013) 2026-07-04 18:48:23 -07:00
WhatsSkiLL
b550c829b2 [AI-assisted] fix(android): polish home overview layout (#100059)
* fix(android): polish home overview layout

* chore(android): refresh native i18n inventory

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-04 21:42:36 -04:00
Yuya Hirayama
fe8234621e Fail closed when Slack mention detection is unavailable (#91584)
* fix(slack): fail closed when mention detection is unavailable

* fix(slack): coordinate app mention retry history

* fix(slack): reject user-token mention identity

* fix(slack): reject user-token mention identity

---------

Co-authored-by: OpenClaw Agent <openclaw-agent@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 21:36:53 -04:00
Peter Steinberger
1b8d837674 fix(tui): preserve queued prompt lifecycle (#100123)
Allow busy TUI sessions to forward prompts into the configured queue while
keeping queued-turn admission, cancellation, restart, and transcript ownership
consistent across the TUI, Gateway, and followup queue.

Co-authored-by: Sebastien Tardif <sebtardif@ncf.ca>
2026-07-04 21:15:28 -04:00
moguangyu5-design
3dff585de6 fix(agents): use CJK-aware token estimation for tool results (#95447)
* fix(agents): use CJK-aware token estimation for tool results

Preserve the conservative 2 chars/token ratio for non-CJK tool results,
while using the accurate 4 chars/token ratio for CJK-heavy tool results.
This avoids false context-overflow errors for CJK content without changing
behavior for Latin/ASCII tool results.

- Add estimateCjkRatio() helper to cjk-chars.ts
- Choose tool-result chars-per-token based on CJK ratio (threshold 0.5)
- Add regression tests for CJK, mixed, and non-CJK tool results

* fix(agents): cover JSON and fallback payloads in CJK ratio pass

* test(agents): fix type cast for non-serializable tool-result regression

* fix(agents): make CJK tool-result estimates monotonic

---------

Co-authored-by: moguangyu5-design <moguangyu5-design@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-04 18:15:24 -07:00
Peter Steinberger
1437f79d0c feat(ui): adopt shared libterminal browser runtime (#100128) 2026-07-04 21:03:10 -04:00
Gio Della-Libera
7bb686c140 Doctor: expose systemd linger findings (#97514)
Expose an opt-in Doctor lint finding for Linux Gateway hosts where a loaded user-level systemd gateway unit has systemd lingering disabled.\n\nValidation:\n- Targeted Doctor health contribution tests passed locally.\n- Exact-head hosted checks passed on 65ec5a0acf, including QA Smoke CI, Real behavior proof, security/CodeQL, check-shrinkwrap, and selected CI shards.\n- Crabbox Azure proof exercised a loaded user systemd gateway unit with Linger=no and observed the expected lint warning.\n\nCo-authored-by: giodl73-repo <166990625+giodl73-repo@users.noreply.github.com>
2026-07-04 17:59:41 -07:00
Vincent Koc
2e7ffca8ff fix(core): preserve UTF-8 byte truncation boundaries 2026-07-04 17:48:21 -07:00
Peter Steinberger
aaaa8030bf docs(onboard): fix stale signal-cli, daemon runtime, and allowlist claims in onboarding reference 2026-07-05 01:46:28 +01:00
Peter Steinberger
b3a74ccc3a docs(acp): correct permission-prompt error class in troubleshooting table
The non-interactive permission failure surfaces as acpx's
PermissionPromptUnavailableError, not AcpRuntimeError; acpx 0.11.2 throws
it unwrapped (isGenericInternalAcpErrorMessage only matches "Internal
error"). Matches the corrected fact in the acp-agents-setup rewrite.

Pre-commit hook bypassed with formatting proof: repo oxfmt + Mintlify
accordion repair already run on the file (worktree has no node_modules).
2026-07-05 01:44:42 +01:00
Peter Steinberger
d460635185 fix(browser): point Playwright 501 error at existing docs anchor 2026-07-05 01:44:19 +01:00
Peter Steinberger
73fc0f5c5f fix(channels): expose inbound media download failures [AI-assisted] (#100119)
* fix(channels): expose inbound media download failures

* fix(msteams): correlate attachment references
2026-07-04 20:28:52 -04:00
Narahari Raghava
161c4581a7 fix(gateway): truncateCloseReason drops partial UTF-8 code point instead of emitting mojibake (#100047)
* fix(gateway): truncateCloseReason drops partial UTF-8 code point instead of emitting mojibake

Buffer.subarray at a raw byte offset can cut inside a multi-byte UTF-8
sequence. Node decodes the dangling continuation bytes as U+FFFD (3 bytes
each), so the re-encoded result can exceed the intended maxBytes cap —
violating the RFC 6455 close-reason size contract and surfacing garbled
text to clients.

Back up from the cut point to the nearest UTF-8 sequence start before
slicing (UTF-8 continuation bytes match 10xxxxxx; skip them).

Closes #99976

* fix(lint): remove unnecessary non-null assertion on Buffer index

* ci: retrigger checks
2026-07-04 17:25:30 -07:00
Vincent Koc
890f4efc88 fix(qa-channel): handle metadata-free final replies
Fix qa-channel final reply preview delivery when a harness or plugin path calls deliver without dispatcher metadata. Verified with remote Testbox proof plus hosted PR checks.
2026-07-04 17:23:52 -07:00
Hana Chang
4ec7842be0 feat(slack): add ignoreOtherMentions channel config (#53467)
* feat(slack): add ignoreOtherMentions channel config

Mirrors the existing Discord `ignoreOtherMentions` option for Slack
channels. When set on a channel entry, drop channel/group/MPIM messages
that mention another user or subteam but not this bot — the inverse of
`requireMention`. Useful in busy channels where the bot would otherwise
reply to side conversations.

Implementation lives in `prepareSlackMessage` right after the
`allowBots: "mentions"` bot-drop gate and before the `shouldRequireMention`
non-mention drop, so it integrates with the new `messageIngress` ingress
pipeline. The gate is conditional on `canDetectMention` (botUserId
resolvable via `auth.test` or explicit mention regexes configured) to
avoid false drops when we have no reliable way to tell bot vs non-bot
mentions apart.

Slack implicit mentions (thread participation) are intentionally NOT
respected here — they fire for every message in a bot-participated
thread, so honoring them would defeat the feature in any active thread.
The gate matches on `wasMentioned` (explicit) and `hasAnyMention`, with
the existing `shouldBypassMention` override (e.g. authorized commands)
also respected.

Includes config types, zod schema, channel-config resolution,
prepare-message implementation, full test coverage in
`prepare.test.ts`, regenerated channel + docs baselines, and Slack
docs entry.

* refactor(slack): harden other-mention filtering

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 20:08:14 -04:00
Rohang2005
03fe813d1e fix(slack): forward per-agent identity overlay on heartbeat and runtimeSend (#84297) (#84335)
* fix(slack): preserve agent identity on heartbeat sends

Co-authored-by: Rohang2005 <rohan.ganesh05@gmail.com>

* fix(slack): preserve identity when custom icons fail

* fix(slack): reuse accepted identity across chunks

* fix(slack): narrow identity fallback input

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-04 20:05:47 -04:00
TwinsLee
568237b3ab fix(feishu): emit non-empty value schema for bitable write tools (#94547) (#94990)
Type.Record(Type.String(), Type.Any()) serializes via TypeBox to an empty nested value schema (patternProperties: { "^.*$": {} }). AWS Bedrock's strict tool-schema validation rejects the empty sub-schema, breaking all agent turns for Bedrock-backed Anthropic users with Feishu bitable tools enabled.

Replace the three affected free-form field maps (create_record, update_record, create_field) with an explicit non-empty FlexibleFieldValue value schema that still accepts any JSON value. Type.Unknown() is avoided because it also serializes to an empty schema. Adds regression coverage asserting the emitted value schema is non-empty.

Co-authored-by: TwinsLee <1460694+TwinsLee@users.noreply.github.com>
2026-07-04 17:05:32 -07:00
Dallin Romney
bfffa950d7 refactor(plugin-sdk): consolidate tool result helpers (#99740)
* refactor(plugin-sdk): consolidate tool result helpers

* docs(plugin-sdk): tighten tool result guidance

* refactor(feishu): use tool results directly
2026-07-04 16:50:44 -07:00
Dallin Romney
c2fc7aa28a refactor: consolidate exact keyed async queues (#99691)
* refactor: consolidate keyed async queues

* chore: refresh merge-ref CI

* refactor: encapsulate keyed queue ownership
2026-07-04 16:45:07 -07:00
Peter Steinberger
7608d38597 improve(ui): flatten chat tool-call rows into scannable list (#99763)
Tool calls in Control UI chat rendered as triple-nested cards: activity
group card + tool-shell bubble chrome + gradient summary pill with a
0 8px 22px drop shadow. Collapsed rows now render as flat single-line
rows with ellipsis, the activity group uses a flat header plus a left
rule, and expanded detail keeps soft tinted blocks without card chrome.
Also deletes the dead legacy .chat-tool-card__details/__output CSS and
the unused renderToolCardSidebar path with its never-taken
renderToolDataBlock branches.

Closes #99760
2026-07-04 19:42:59 -04:00