Commit Graph

78555 Commits

Author SHA1 Message Date
Vyctor H. Brzezowski dd57cfb6c1 fix(ui): show catalog labels in hidden section settings (#122320)
* test(ui): reproduce hidden catalog id labels

* fix(ui): label hidden session catalogs

* test(ui): capture hidden catalog label evidence

* test(ui): harden hidden catalog label proof
2026-08-12 02:18:05 -03:00
Vyctor H. Brzezowski 0295b7ab54 fix(ui): gate model shortcuts by search focus (#122316)
* improve(ui): unify model picker shortcut hints

* fix(ui): gate model shortcuts by search focus

* fix(ui): focus model trigger on open
2026-08-12 02:14:47 -03:00
Peter Steinberger 526ae6d944 fix(macos): honor While Using location permission (#122435) 2026-08-11 22:12:56 -07:00
Peter Steinberger 61ab6a8f9d feat(gateway): make suspend/resume operator-usable end to end (#122100)
* feat(gateway): make suspend/resume operator-usable end to end

A prepared Gateway now accepts authenticated WebSocket connects while
keeping every method except gateway.suspend.* fenced, so a fresh CLI or
controller process can resume a suspension instead of dead-ending on a
rejected upgrade until the two-minute lease expires. Restart drain,
worker ingress, and desktop-observe streams stay fully closed.

The gateway client surfaces non-101 upgrade responses (bounded body
read) as typed retryable errors instead of an opaque 1006 close, and
new openclaw gateway suspend / resume commands drive the whole
handshake, including bounded --wait polling with blocker output.

Live-verified on an isolated dev gateway: prepare, SIGSTOP/SIGCONT
freeze, resume, over-TTL expiry self-heal, conflict and mismatch paths.

* refactor(gateway-client): move wire-client contract types to protocol-client-contract

The connectError addition pushed protocol-client.ts over the 700-line
max-lines gate; split the adapter-facing contract types into their own
module instead of suppressing.

* refactor(gateway-client): keep contract-internal option types unexported

Knip deadcode gates reject exported types with no importer; the connect
and close decision shapes are only referenced inside the contract module.

* chore(plugin-sdk): refresh gateway-runtime API baseline after rebase

* fix(gateway-client): preserve hello type after rebase

* test(gateway): support websocket upgrade rejection events

* test(gateway): expect connection errors in close info

* fix(gateway): keep prepared-suspension connects control-only

Address ClawSweeper review: node and worker connects stay refused while
suspension is prepared (only operator control connects pass), and the
CLI never issues another suspend prepare after its --wait deadline.
2026-08-11 22:12:53 -07:00
Sarah Fortune 00fc1bd123 fix(slack): scope enterprise channel and user policies by workspace (#122346)
* fix(slack): scope channel policies by workspace

* fix(slack): scope user policies by workspace

* fix(slack): preserve workspace policies at ingress

* test(slack): use canonical workspace ids

* chore(slack): remove stale allowlist import

* fix(slack): require workspace-scoped grid policies

* test(slack): scope enterprise policy fixtures

* style(slack): format workspace policy changes

* fix(slack): preserve workspace policy wildcards

* fix(slack): retain workspace system-event policies

* fix(slack): scope bot policy identities

* fix(slack): retain workspace in group policy

* fix(slack): preserve workspace DM allowlists

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-11 22:09:46 -07:00
Peter Steinberger a7e4065dd7 fix: compaction resolves undated model refs (#122422)
* fix(agents): unify tiered model resolution for chat and compaction

Manual /compact failed with Unknown_model when the agent model was
configured as an undated ref (e.g. anthropic/claude-haiku-4-5): the chat
run resolved models through a two-tier path (discovery-free lookup, then
prepared stores with bundled static-catalog fallback) while both
compaction entry points made a single bare resolveModelAsync call and
dead-ended before the static catalog could resolve the undated id.

resolveTieredModel is now the canonical resolution owner used by the
chat run, direct compaction, and queued compaction; the duplicated
chat-only tier logic and both bare compaction lookups are removed.
Regression test proves chat and manual compaction resolve the same
undated configured model through the shared owner.

* fix(agents): satisfy lint and test-types on tiered resolution call sites

Drop the redundant ?? {} spread fallbacks (spreading undefined is a
no-op) and give the test registry mock its real (provider, modelId)
signature for check:test-types.
2026-08-11 22:08:54 -07:00
Peter Steinberger bad4d34982 test(agents): remove aggregate-lane noise from src/agents suites (#122432)
Supervisor-capture tests asserted real telegram/slack channel ids, so
their pass/fail depended on which channel plugins the selected vitest
lane loads (stubs when focused, real normalizers under unit-fast);
switch to a neutral synthetic channel. Two embedded-runner tests
carried a shared literal /tmp/openclaw.sqlite storePath — one actually
opened it, colliding with stale artifacts across parallel runs; both
now use realpath'd auto-cleaned per-test temp dirs.

Evidence in PR #122164 body; pre-fix aggregates failed 12/1202 (cli)
and 4/4750 (embedded), post-fix green in default and shuffled order.
2026-08-11 22:08:42 -07:00
Peter Steinberger 1c46d517c4 fix(ui): confirm WhatsApp logout (#122437)
Require an account-bound confirmation before deleting WhatsApp credentials, and revalidate Gateway ownership plus account state after the modal resolves.
2026-08-11 22:07:35 -07:00
Peter Steinberger dac940bf3a refactor(openai): split realtime voice by layer (#122414)
* refactor(openai): split realtime voice by layer

* refactor(openai): delete dead realtime auth branches

* chore(lint): ratchet max-lines baseline after realtime-voice split

* style(openai): prune split leftovers
2026-08-11 22:06:53 -07:00
Peter Steinberger 7ecad45a7d refactor(context-engine): retire legacy host param default (#122434) 2026-08-11 21:57:46 -07:00
Ayaan Zaidi 141f943a41 fix(delivery): clear resolved ambiguity notices (#122438)
Clear stale uncertainty debt when the same final reaches an authoritative terminal outcome, preventing false notices on the next inbound turn.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-12 10:25:47 +05:30
Peter Steinberger e30df72045 fix(worker): keep source bundles npm-installable (#122430) 2026-08-11 21:50:56 -07:00
Peter Steinberger f6459a3255 refactor(ui): split chat thread into transcript owners (#122420)
* refactor(ui): split chat thread into transcript owners

* refactor(ui): delete orphaned pinned-messages surface

* chore(lint): ratchet max-lines baseline after chat-thread split

* fix(ui): tighten transcript owner type boundaries

* refactor(ui): prune pinned-message orphans
2026-08-11 21:49:47 -07:00
Peter Steinberger b82ad646a5 fix(delivery): preserve suppressed send outcomes (#122421)
* fix(delivery): preserve suppressed send outcomes

Preserve authoritative durable-send suppression outcomes so task, subagent, and exec followups no longer report false delivery or duplicate ambiguous adapter dispatches.

* fix(delivery): keep suppression reason internal

Derive the outbound projection from the existing durable batch result union so the repair does not change the public plugin SDK contract.

* fix(delivery): avoid retrying ambiguous task updates

Advance the state-change event cursor after an adapter returns no identity so a possibly visible progress notification is not sent twice; intentional suppression remains retryable.
2026-08-11 21:47:44 -07:00
Peter Steinberger a3b2700dff fix(deps): bump @openclaw/fs-safe to 0.5.5 for win32 zero-inode identity (#122427) 2026-08-11 21:46:22 -07:00
Peter Steinberger cb52ded58d refactor(telegram): split native commands by executor (#122419)
* refactor(telegram): split native commands by executor

* refactor(telegram): deduplicate DM-thread target session

* chore(lint): ratchet max-lines baseline after telegram commands split

* test(telegram): fix native command split checks
2026-08-11 21:45:17 -07:00
Peter Steinberger fc31a157cc refactor(gateway): remove orphan testing aliases (#122433) 2026-08-11 21:44:51 -07:00
Peter Steinberger 722e20b675 test(agents): prune final Responses duplicates (#122424)
* test(agents): prune final Responses duplicates

* fix(tooling): honor inclusive compat removal dates
2026-08-11 21:22:42 -07:00
Peter Steinberger a89b88ec0e docs(qqbot): point install docs at the Tencent package (#122417)
The externalization left the docs inventory seed and the channel page
advertising the retired @openclaw/qqbot npm package; the catalog already
resolves qqbot to @tencent-connect/openclaw-qqbot. Regenerates the
plugin reference and inventory pages from the corrected seed.
2026-08-11 21:20:00 -07:00
Josh Avant 35d764076e fix(audit): ignore inherited execution identity evidence (#122418)
* fix(audit): require owned admission data

* docs(agents): preserve owned admission invariant
2026-08-11 23:19:17 -05:00
Peter Steinberger f6fff4f7fd refactor: canonicalize aliases and classify test suites (#122407)
* refactor: use canonical re-export names

* fix(test): classify suite support as test source

* fix(agents): retarget gateway stub session-entry import

* test(gateway): retarget session-utils mock keys after alias removal
2026-08-11 21:18:34 -07:00
Peter Steinberger 6b0be0215f refactor(ui): split new-session page into draft owners (#122413)
* refactor(ui): split new-session page into draft owners

* refactor(ui): delete duplicated draft plumbing

* chore(lint): ratchet max-lines baseline after new-session split
2026-08-11 21:15:32 -07:00
Peter Steinberger fc45a0f1e6 fix(update): show tracked status for detached deployments (#122415)
* fix(update): track main from detached deployments

* test(update): use canonical temp directory helper

* test(update): keep detached tracking regression compact
2026-08-11 21:15:15 -07:00
Ayaan Zaidi ec4ae78b75 fix(agents): generate session titles with runtime-owned auth (#122163)
Use the selected harness for isolated title generation, including native Codex auth.
Retry failed dashboard titles from the first user message without overriding manual names.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-12 09:42:16 +05:30
Peter Steinberger 0e6f38178a refactor(ui): simplify model effort profile flow (#122412)
* refactor(ui): simplify model effort profile flow

consolidate the Gateway profile shape, remove New Session's synthetic row, and retain boundary regression coverage.

* fix(gateway): preserve thinking projection order

Keep deterministic response bytes while consuming the canonical thinking profile.
2026-08-11 21:08:26 -07:00
Peter Steinberger 630aac9b25 feat(onboard): label CLI candidates with subscription vs API-key auth (#122140)
Detected Codex/Claude Code CLI candidates now say whether they ride a
flat-rate subscription login (ChatGPT, Claude) or a metered API key, so
picking one is an informed billing decision for an always-on assistant.
Codex classification parses `codex login status` output per
codex-rs/cli/src/login.rs; Claude uses prompt-free credential-file and
env/apiKeyHelper signals only (never the keychain). Unknown states keep
the plain 'logged in'. Display-only: ranking and defaults unchanged.
2026-08-11 21:02:32 -07:00
Vyctor H. Brzezowski 2a1eba7713 fix(ui): show local project icons in the chat header (#122406)
* fix(ui): resolve project icons from deterministic paths

Prepare project icon bytes during chat startup and serve only the process-stable snapshot. Keep all filesystem work asynchronous and lift the breadcrumb trail onto the topbar's optical axis.

* fix(ui): keep project icon paths web-focused

Drop the IDE-specific icon convention so every candidate remains an explicit web project path.

* fix(ui): preserve project icon compatibility

Restore existing web icon paths and refresh bounded session snapshots when they are served. Keep the IDE-specific path excluded per the final product decision.
2026-08-12 00:52:44 -03:00
Peter Steinberger 4401ff2a92 refactor(macos): remove final private test seams (#122202)
* test(macos): remove final private test seams

* chore(macos): refresh native i18n inventory
2026-08-11 20:42:45 -07:00
Peter Steinberger 9fea5281b2 test(doctor): remove duplicate process coverage (#122410)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 20:38:49 -07:00
Peter Steinberger 96f3a4e461 test(cli): make help-exit process failures self-diagnosing (#122205)
CI run 31515400879 (checks-node-compact-small-1) failed the run-main
import-failure test as an opaque "expected null to be 1": the deadlock
guard had fired with the child still alive, but the guard rejection
carried the captured child output only as hidden error properties and
the tests asserted on failure.code blindly, discarding the startup
trace lines that pinpoint where the child stopped.

runCliProcess now takes expectedExitCode and throws self-describing
errors for all failure identities (guard fired, signal death, wrong
exit code) with bounded tails of the child stderr/stdout embedded in
the message. The CliProcessFailure try/catch pattern is deleted
file-wide; formatter regression tests protect the diagnostic contract.
2026-08-11 20:35:23 -07:00
Peter Steinberger ae2158c0da fix(cloud-workers): start source bundles with vendored packages (#122400)
* test(qa): prove cloud worker mid-turn loss

* fix(cloud-workers): prune vendored workspace dependencies

* test(qa): keep SSH fixture type private
2026-08-11 20:32:54 -07:00
joshavant 69983f8011 fix: retain ingress recovery after settlement failure 2026-08-11 22:27:11 -05:00
joshavant 1079ccf41d fix: preserve custom debounce completion progress 2026-08-11 22:27:11 -05:00
joshavant db28ac2d48 test(signal): cover merged ingress failures 2026-08-11 22:27:11 -05:00
joshavant d4f8553a0c fix: retry debounced ingress failures before adoption 2026-08-11 22:27:11 -05:00
Vyctor H. Brzezowski 5583459475 improve(ui): use diff icon for session changes (#122399) 2026-08-12 00:26:22 -03:00
Vincent Koc 2d75a2d328 fix(delivery): settle exact sends dispatched under a producer claim (#121587)
Exact-reconciliation sends skipped pre-send promotion, so dispatch cleared the producer claim without publishing the platform send attempt identity. The post-send ack then failed its ownership guard with "Delivery platform claim was lost", settling provably delivered sends as unknown; since #121833 that ambiguity surfaces as a spurious "couldn't confirm my previous reply" recovery notice. Dispatch now atomically promotes the producer claim into the active attempt and publishes the attempt identity, so successful sends settle and lease renewals keep working. Adds a boundary regression pinning unknown_after_send evidence across a later unclaimed batch dispatch.

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-12 03:21:59 +00:00
Peter Steinberger b024f01171 test(plugin-sdk): avoid duplicate full API render (#122402)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 20:19:59 -07:00
Vyctor H. Brzezowski fe1dafbada fix(ui): show nested session parent in chat header (#122335)
* fix(ui): show nested session parent in chat header

* fix(ui): cap nested chat breadcrumb width

* test(ui): avoid breadcrumb geometry shadowing

* chore(ui): keep breadcrumb comment issue-agnostic
2026-08-12 00:18:11 -03:00
Peter Steinberger 38a5390e2e fix(agents): never restore a retired worktree via a generated name (#122393)
sessions.create reset-in-place persists the retired worktree's removedAt
before the RPC resolves, but a successor worktree create that rolled the
same random crustacean slug (1/420) hit nameIsUnavailable's owner-match
bypass and silently restored the retired registry record, clearing
removedAt and reviving the old branch (flaked
server.sessions.create.test.ts reset-in-place).

Generated names (title slugs and random slugs) now treat the caller's
removed records as collisions and take a numeric suffix; explicit
worktree names keep their documented reuse/restore semantics.
2026-08-11 20:02:26 -07:00
openclaw-mantis[bot] 4bd56a316b chore(i18n): refresh native locales (#122355)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-11 20:00:14 -07:00
Peter Steinberger 6f657d3b4b test(agents): restore ACP spawn suite isolation (#122392)
Amp-Thread-ID: https://ampcode.com/threads/T-019fee8d-665d-707b-a380-23f2a6a1ce03

Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 19:56:14 -07:00
joshavant c3e3a09fe6 chore(plugin-sdk): refresh API baseline 2026-08-11 21:52:21 -05:00
joshavant 8c1880a54a docs(agents): preserve invoker evidence invariant 2026-08-11 21:52:21 -05:00
joshavant 4ccf7d0dfa fix(audit): validate raw invoker evidence 2026-08-11 21:52:21 -05:00
joshavant 2d9f64f872 fix(audit): preserve unknown invoker evidence 2026-08-11 21:52:21 -05:00
Vyctor H. Brzezowski 56e6221a81 fix(ui): align chat disclosure gutters (#122286) 2026-08-11 23:40:36 -03:00
Peter Steinberger 66b92e9136 test(config): drop duplicate runtime migration probe (#122381)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 19:32:49 -07:00
Shakker 8efbefe4f6 chore: refresh companion API baselines (#122380) 2026-08-12 03:26:33 +01:00
Shakker 05d0d980d8 fix: fence companion context snapshots 2026-08-12 03:26:33 +01:00