Commit Graph

66940 Commits

Author SHA1 Message Date
Peter Steinberger
c56650352d fix(test): unit-fast tests inherit live host config (#100221)
* fix(test): make unit tests hermetic against host config and build state

Two host-state leaks made the full suite fail deterministically on developer
and agent machines while CI stayed green:

- Built checkouts: bundled-plugin manifest discovery prefers dist/extensions,
  which by design excludes externalized official plugins (e.g. qwen). Tests
  that depend on manifest-driven endpoint classification (DashScope cases in
  media-understanding and model-compat) failed in any checkout after
  pnpm build. test-env now pins OPENCLAW_BUNDLED_PLUGINS_DIR to the source
  extensions tree (with the vitest trust opt-in) so discovery matches CI
  regardless of local build state; discovery tests keep managing the env
  per case.

- unit-fast shards: setupFiles was empty, so auto-curated tests that read
  config saw the developer's real ~/.openclaw/openclaw.json; any key the
  branch schema rejects failed those tests. unit-fast and
  unit-fast-fake-timers now load a minimal env-isolation setup
  (test/setup.env.ts) that installs the isolated test home without the
  shared setup's module mocks.

* test: update unit-fast config contract for env-isolation setup

* fix(test): force unit-fast hermetic env isolation
2026-07-05 10:06:53 -07:00
Peter Steinberger
444d54c538 fix(ios): avoid inactive Voice Wake audio startup (#100370)
* fix(ios): avoid inactive voice wake audio startup

* fix(ios): avoid inactive voice wake audio startup

* fix(ios): avoid inactive voice wake audio startup
2026-07-05 09:58:28 -07:00
Peter Steinberger
3a3d4835c1 perf(test): defer plugin SDK compiler setup 2026-07-05 12:45:10 -04:00
Peter Steinberger
b4e0c5306c test(scripts): replace brittle temp-dir importer inventory with structural routing assertions
The 'routes top-level test helpers to importing repo tests' test froze the
full list of tests importing test/helpers/temp-dir.ts; any new importer broke
main's checks shard (twice on 2026-07-05). Assert routing structure instead:
scan-derived direct-importer lower bound, partition invariants, and per-file
consistency with single-target routing.
2026-07-05 17:41:44 +01:00
Ayaan Zaidi
2b7003d535 fix(clickclack): gate provenance stamping behind agentActivity opt-in 2026-07-05 09:32:37 -07:00
ragesaq
00f345a82b fix(clickclack): forward native activity callbacks
Allow ClickClack-owned progress rendering to receive item callbacks when source delivery is suppressed. This lets native agentActivity persist commentary and tool rows instead of relying on default progress texts.

HyperReview-Reflex: pass
HyperReview-Tier: light
HyperReview-Scope: staged-tree:e4d63a7648ad03f91fe81588cce783fd686b6488
HyperReview-Paths-SHA256: 94ae4829752bfdafc02191354cac5ae2a2ca9fc899ad02a7ced71d38829dd352
HyperReview-Reflex-Version: 0.3.3
HyperReview-Routed-To: none
2026-07-05 09:32:37 -07:00
ragesaq
67044ce7c7 feat(clickclack): normalize reasoning progress as commentary
ClickClack durable activity now treats preamble, commentary, analysis, thinking, and reasoning as streaming commentary segments. Reasoning-family lanes get a normalized Thinking label, while lifecycle frames stay hidden.

Why: native ClickClack needs Clickglass parity for commentary progress, tool calls, and final assistant delivery before the sidecar can be retired.

Validation:

pnpm tsgo:extensions

pnpm tsgo:extensions:test

pnpm exec oxlint extensions/clickclack/src/activity.ts extensions/clickclack/src/activity.test.ts

pnpm exec vitest run extensions/clickclack/src/activity.test.ts

HyperReview-Reflex: pass-with-conditions
HyperReview-Tier: light
HyperReview-Scope: staged-tree:ed2adf325ad5beffcb55d7c6b929b0be7a752b61
HyperReview-Paths-SHA256: e5499bb489781e9c4dd31828a71220bbe89c4e646011a7f31f5ce3b8db8d54c6
HyperReview-Reflex-Version: 0.3.3
HyperReview-Routed-To: none
HyperReview-Receipt-SHA256: 4d3480047c0b66556236cecde7dd3e199b57a027b8dd894acab47056d9be5b4c
2026-07-05 09:32:37 -07:00
ragesaq
a08ca5fc5d feat(clickclack): stamp model/thinking attribution onto agent posts
Wires replyOptions.onModelSelected so the resolved provider/model and
thinking level for each turn (including after fallback) are sent as
author_model / author_thinking fields on activity rows and the final
reply. Servers without these columns ignore the unknown JSON fields, so
the wire shape is backward compatible; servers that persist them get
per-message attribution.
2026-07-05 09:32:37 -07:00
ragesaq
9827fcc5c1 docs: regenerate docs_map for clickclack agent activity heading 2026-07-05 09:32:37 -07:00
ragesaq
339cc4f12a fix(clickclack): address review — docs, lint lanes, activity coalescing
- docs: document agentActivity option, the non-inherited agent_activity:write
  scope, default-off and best-effort degradation behavior
- activity: type the enqueue catch parameter as unknown (lint lane)
- activity: treat toolCallId as opaque; normalize only itemId lane prefixes
- activity: skip identical/stale-shorter commentary snapshots so no
  redundant PATCHes queue
- http-client: fail fast when createActivityMessage has no channel or
  conversation target; narrow mocked request bodies before JSON.parse
2026-07-05 09:32:37 -07:00
ragesaq
01b34139b1 feat(clickclack): publish durable agent activity rows (commentary + tool)
Opt-in per-account (agentActivity: true): the ClickClack channel extension
now mirrors streamed commentary and tool progress into durable
agent_commentary / agent_tool message rows via the existing
replyOptions.onItemEvent seam, coalesced so one logical step is one row.
Requires a bot token carrying the agent_activity:write scope; publishing
is best-effort and never interrupts final text delivery.
2026-07-05 09:32:37 -07:00
Peter Steinberger
e62cf76bd5 fix(ci): catch native-only mobile protocol drift (#100278)
* fix(ci): cover native-only protocol event drift

* fix(ci): ignore quoted Swift event constants
2026-07-05 09:23:45 -07:00
github-actions[bot]
06bf43083d chore(ui): refresh control ui locales 2026-07-05 16:22:32 +00:00
Gio Della-Libera
b1f3986b84 Doctor: expose write-config blocker findings (#100093)
* doctor: add write-config lint findings

* doctor: align write-config lint with config writes

* doctor: check config write directory permissions

* doctor: detect blocked config directory paths

* doctor: detect symlink config directory blockers

* doctor: require searchable config write parents
2026-07-05 09:18:34 -07:00
Peter Steinberger
70f2bef6b4 fix(ios): persist queued Watch replies (#100372)
* fix(ios): persist queued watch replies

Route Apple Watch quick replies through the durable, gateway-scoped Watch message outbox with restart-safe routing and deduplication.

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>

* fix(ios): preserve pre-upgrade Watch replies

Bind shipped notification prompts without routing metadata to the current Gateway once, while keeping explicit and persisted Gateway owners fail-closed.

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
2026-07-05 09:14:49 -07:00
Peter Steinberger
f607ba0691 feat(control-ui): session grouping with drag & drop and channel categorization (#100262)
* feat(control-ui): session grouping with drag & drop and channel categorization

* fix(control-ui): restrict session drag&drop to private session-key payloads

* chore(i18n): translate session grouping strings across control ui locales

* chore(protocol): regenerate swift gateway models for session category

* chore(protocol): regenerate swift gateway models for session category
2026-07-05 09:13:17 -07:00
Peter Steinberger
286d0b9fb3 fix(ci): bound hosted gate run pagination (#100332) 2026-07-05 08:55:05 -07:00
Peter Steinberger
535ad8a0c3 test(ios): import pairing protocol model (#100355)
* test(ios): import pairing protocol model

* test(ios): import pairing protocol model
2026-07-05 08:49:34 -07:00
Vincent Koc
a308e3b834 fix(qa): serialize channel-driver isolated smoke workers 2026-07-05 17:33:28 +02:00
Jason
95ebb3dc1e fix(tui): surface safe tool-validation abort diagnostics (#91002)
* fix(tui): show last tool-error summary on aborted runs

When a run ends while looping on tool-call validation errors the TUI showed
only "run aborted". Carry the last tool failure on the terminal lifecycle
metadata and render a sanitized one-line summary on the abort line, e.g.
"run aborted: edit tool validation failed: edits: must have required properties edits".
Argument dumps are stripped; with no summary it stays "run aborted".

Refs #90982

* fix(tui): secure abort validation diagnostics

* docs(changelog): move TUI fix to unreleased

* docs(changelog): aggregate TUI fixes

* fix(tui): scope abort validation diagnostics

* docs(changelog): restore unreleased spacing

* fix(tui): scope abort validation diagnostics

* fix(tui): scope abort validation diagnostics

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 08:30:20 -07:00
Peter Steinberger
33f7c17f23 [codex] Fallback when Windows gateway task exits early (#76245)
* fix(windows): bound clean scheduler exits before fallback

* test(windows): cover scheduled task startup fallback

* test(windows): assert startup fallback is not running
2026-07-05 08:19:33 -07:00
Gio Della-Libera
14b2ca11ff policy: repair automatic narrowing findings (#99690) 2026-07-05 08:11:38 -07:00
Peter Steinberger
f8016c44a4 fix(agents): prevent post-abort session lock leaks 2026-07-05 08:05:10 -07:00
Shakker
4074c8e743 fix: remove sidebar usage quota 2026-07-05 15:57:27 +01:00
Vincent Koc
6237580e3c fix(agents): wrap bundle MCP schema setup errors (#89619)
* fix(agents): attribute MCP schema compiler failures

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

* fix(mcp): preserve schema compiler error cause

* fix(mcp): retain direct schema compiler cause

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 07:54:51 -07:00
Peter Steinberger
00da1243a8 fix(ui): clear session labels across subscribed clients (#100266)
* fix(ui): reconcile cleared session labels

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry
2026-07-05 07:54:05 -07:00
Peter Steinberger
862de9f1a1 fix(pairing): advertise reachable Tailnet routes (#100317)
* fix(pairing): advertise reachable tailnet routes

* fix(pairing): satisfy native and SDK checks

* fix(ios): cancel stale pairing route probes

* test(pairing): document LAN-only Serve fallback

* fix(ios): preserve pairing result initializer
2026-07-05 07:43:43 -07:00
Peter Steinberger
17c0ad86cb [codex] Fix doctor completion cache plugin loading (#76235)
* fix(completion): make cache generation mode explicit

* test(completion): type spawned cache options

* fix(completion): require explicit cache binary name
2026-07-05 07:33:54 -07:00
Peter Steinberger
7613f6ebb3 fix(plugins): preserve jiti native module config (#100344) 2026-07-05 07:23:42 -07:00
Peter Steinberger
451de5854c docs(changelog): record WhatsApp delivery fixes (#100346) 2026-07-05 07:23:33 -07:00
github-actions[bot]
f0ecc16629 chore(i18n): refresh native locales 2026-07-05 14:22:16 +00:00
Masato Hoshino
ff759b3f1a fix(outbound): report honest message delivery status (#99928)
* fix(outbound): report delivery status in best-effort message send results

Best-effort sends (forced on for implicit message_tool_only source
replies) previously collapsed failed and partial_failed durable send
results into a success-shaped MessageSendResult, so agents saw a
normal-looking envelope while delivery had actually failed. Surface
deliveryStatus, a formatted error, sentBeforeError, and per-payload
outcomes without changing throw semantics.

* fix(outbound): centralize message delivery outcomes

Co-authored-by: masatohoshino <g515hoshino@gmail.com>

* docs(changelog): split aggregate entries from code landing

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 07:18:03 -07:00
Peter Steinberger
060a5dbf88 test(logging): reset diagnostic capture state 2026-07-05 07:15:07 -07:00
Vincent Koc
61ac4ec8a0 fix(plugins): keep openclaw chunks native in jiti (#88384)
* fix(plugins): keep OpenClaw chunks native in jiti

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

* docs(changelog): move plugin fix to unreleased

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 07:08:42 -07:00
Jun
3f1dea7875 fix(tui): render delta-only assistant streams (#83000)
* Fix delta-only assistant chat projection

* fix(tui): project delta-only assistant events

* fix(tui): sanitize merged assistant streams

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 06:59:40 -07:00
Peter Steinberger
2bc50d0656 feat: verify AI access during macOS onboarding before the first chat (#100288)
* feat(crestodian): add live-tested structured inference setup (detect/activate gateway RPCs)

* feat(macos): redesign onboarding around a verified Connect-your-AI step

* docs: describe the verified AI onboarding step and gemini setup ladder entry

* chore(macos): drop replaced OnboardingView+CrestodianSetup source

* fix(macos): keep the AI-detect error card from pairing with an unproven empty-state claim

* chore(protocol): regenerate Swift gateway models for crestodian.setup methods

* test(crestodian): give setup-inference mocks explicit params for test-types lane

* chore(i18n): sync native app string inventory for onboarding redesign

* chore(i18n): sync native app string inventory for onboarding redesign
2026-07-05 06:59:30 -07:00
Peter Steinberger
a5fdc07121 fix(ui): simplify grouped tool activity (#100318) 2026-07-05 06:56:58 -07:00
Vincent Koc
c3bcbf59b1 fix(plugin-sdk): refresh api baseline hash 2026-07-05 15:56:28 +02:00
Vincent Koc
16865d58ca fix(gateway): keep local CLI shared auth off device scopes (#96002)
* fix(gateway): keep local CLI shared auth off device scopes

* fix(gateway): preserve auth-none CLI device identity

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 06:52:56 -07:00
Deepak Jain
8a698108e0 fix(pre-commit): use single pytest dependency specifier (#91276)
[pytest>=8, <9] is parsed as two items; pip fails on '<9'.
Use ["pytest>=8,<9"] so pip gets one valid PEP 440 spec.
Pre-commit-only fix from closed #39109.
2026-07-05 06:51:26 -07:00
Leonidas Lux
42464de58d fix(whatsapp): restore malformed credentials from backup (#99070)
* fix(whatsapp): wrap JSON.parse with try-catch in auth store and test helpers

Add defensive try-catch around JSON.parse calls in WhatsApp extension
to prevent crashes from corrupted state files.

- restoreCredsFromBackupIfNeeded: wrap creds.json/backup validation
  JSON.parse with try-catch; corrupted creds.json now properly falls
  through to backup restoration instead of skipping it entirely
- updateLastRouteMock: wrap JSON.parse with try-catch, initialize
  empty store on corrupted file

* test(whatsapp): add regression test for malformed creds.json longer than one byte

- Add a focused regression test for the exact case ClawSweeper
  flagged: readWebCredsJsonRawSync returns non-null content for
  files with stat.size > 1, so malformed JSON like "{x" (2 bytes)
  reaches JSON.parse — the inner try-catch now catches the parse
  failure and falls through to backup restoration
- Without this patch, JSON.parse("{x") throws to the outer catch
  and restoreCredsFromBackupIfNeeded returns false, skipping backup

🦞 diamond lobster: L2 evidence (real function call + real filesystem objects)

Ref. https://github.com/openclaw/openclaw/pull/99070

* fix(whatsapp): restore malformed creds from backup

Co-authored-by: LeonidasLux <LeonidasLux@users.noreply.github.com>

* docs(changelog): defer credential recovery entry to aggregate

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: LeonidasLux <LeonidasLux@users.noreply.github.com>
2026-07-05 06:50:28 -07:00
Peter Steinberger
cd305b3b0c fix(tui): run new sessions through lifecycle hooks (#100241)
* fix(tui): run new sessions through lifecycle hooks

Co-authored-by: chunqiu <caopu@bupt.edu.cn>

* test(tui): wait for idle before PTY new-session checks

* docs(changelog): defer TUI batch entries

---------

Co-authored-by: chunqiu <caopu@bupt.edu.cn>
2026-07-05 06:48:05 -07:00
Bartok
ccdbb70cf0 fix(whatsapp): preserve bot-authored quote replies (#94879)
* fix(whatsapp): cache bot's own outbound messages for quote metadata

When a user swipe-replies to a message the bot itself sent, the outbound
quote-key lookup misses the inbound-only metadata cache and falls back to
fromMe:false with the replying user's JID as participant. That mismatched
quoted.key is silently dropped by WhatsApp Desktop, so the bot's reply
bubble never renders there (it renders on Android, which is more lenient).

Cache quote metadata for the bot's own outbound messages at the send
choke point (rememberOutboundMessage) with fromMe:true and the bot's own
participant JID (group only; omitted for direct chats, matching WhatsApp
semantics). Future swipe-reply lookups then build a correct quoted.key.

Closes #91445.

* fix(whatsapp): preserve outbound quote metadata

Co-authored-by: Bartok9 <danielrpike9@gmail.com>

* docs(changelog): defer quoted replies entry to aggregate

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 06:47:50 -07:00
Peter Steinberger
ba821e7220 fix(models): resolve provider-qualified aliases (#100209)
* fix(models): resolve provider-qualified aliases

Co-authored-by: Sahil Satralkar <62758655+sahilsatralkar@users.noreply.github.com>

* docs(changelog): defer TUI batch entries

---------

Co-authored-by: Sahil Satralkar <62758655+sahilsatralkar@users.noreply.github.com>
2026-07-05 06:44:54 -07:00
Peter Steinberger
245092dc3a feat(ios): add Apple Watch voice turns (#100283)
* feat(ios): add Apple Watch voice turns

* chore(ios): sync native i18n inventory

* fix(ios): preserve Watch message label
2026-07-05 06:40:03 -07:00
Vishal Jain
4c42815348 fix(whatsapp): bound reconnect catch-up replies (#80642)
* fix(whatsapp): bound reconnect catch-up replies

Co-authored-by: Vishal Jain <jainvishal2212@gmail.com>

* docs(changelog): defer reconnect entry to aggregate

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 06:34:57 -07:00
github-actions[bot]
80801be738 chore(ui): refresh control ui locales 2026-07-05 13:33:08 +00:00
Peter Steinberger
db96218c05 feat(ui): show context usage details (#100264)
* feat(ui): show context usage details

* fix(ui): translate context usage labels

* fix(ui): translate context usage labels

* test: route e2e tempfile helper dependencies

* chore: drop superseded test routing change

* chore: drop superseded test routing change

* chore: drop superseded test routing change
2026-07-05 06:24:05 -07:00
Peter Steinberger
c3b479b8e2 fix(voice-call): auto-respond to webhook transcripts (#100255)
Co-authored-by: dvy <dvy@users.noreply.github.com>
2026-07-05 06:21:45 -07:00
Peter Steinberger
f9e194e4a1 fix(ui): keep login recovery accessible 2026-07-05 06:13:00 -07:00