Commit Graph

77647 Commits

Author SHA1 Message Date
Peter Steinberger e61ba9c1ea fix(scripts): fall back to local check:changed lanes on full Crabbox provider outage (#121323)
Recognize Crabbox workload-routing provider exhaustion as a pre-dispatch backend outage so check:changed runs its documented local fallback.

The observed full provider-chain outage previously exited 2 without running local lanes.

The existing command-exit veto still runs first, so a remote run that actually executed and failed remains fail-closed.
2026-08-09 19:06:01 -07:00
Peter Steinberger 50026f1031 refactor(core): canonicalize record guards on normalization-core (#121331)
* refactor(core): canonicalize record guards on normalization-core

* chore(plugin-sdk): refresh API baseline
2026-08-09 19:05:13 -07:00
Peter Steinberger 3d5f916523 fix(protocol): align fallback reason schemas (#121334)
Worker live events rejected tls_certificate fallback payloads because duplicated closed reason lists had drifted. Establish one canonical dependency-light fallback vocabulary and share its explicit TypeBox schema across worker and cron protocol boundaries.
2026-08-09 19:02:23 -07:00
Sarah Fortune 732108d973 feat(slack): add workspace routing for Enterprise Grid actions and events (#121014)
* fix(slack): preserve team scope for deferred actions

* refactor(slack): use typed Bolt team context

* refactor(slack): preserve deferred action IDs

* refactor(slack): treat team IDs as opaque

* refactor(slack): keep deferred action diff focused

* fix(slack): enable scoped enterprise interactions

* fix(slack): keep event scope at listener boundary

* test(slack): model Bolt enterprise interaction context

* refactor(slack): normalize listener team context

* refactor(slack): pass modal event scope directly

* test(slack): preserve interaction harness argument types

* refactor(slack): pass shortcut event scope directly

* refactor(slack): pass action event scope directly

* fix(slack): scope enterprise slash commands

* test(slack): disambiguate slash harness scope

* fix(slack): type slash block suggestions

* fix(slack): preserve option text literal

* fix(slack): keep scope helpers private

* fix(slack): fall back from slash response URLs

* fix(slack): clarify Web API post message call

* fix(slack): scope post message lint suppression

* fix(slack): preserve event scope export after rebase

* fix(slack): preserve team-bound modal session routing

* fix(slack): retain modal direct-message routing

* fix(slack): preserve modal delivery compatibility

* docs(slack): mark enterprise tool actions supported

* docs(slack): align enterprise support with runtime

* test(slack): align enterprise interaction registration

* fix(slack): support Grid channel create and rename events

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-10 02:02:15 +00:00
Peter Steinberger f805ad0354 refactor(extensions): remove unused compatibility exports (#121338) 2026-08-09 19:01:38 -07:00
Peter Steinberger 64695e5024 chore: detect export name collisions (#121300)
* chore(scripts): add export-name-collision check with debt baseline

* chore(scripts): allowlist per-module test-hook export idiom

* chore(scripts): recognize const forwarders, harness files, and JS sources in collision check
2026-08-09 18:58:28 -07:00
Peter Steinberger c3a0d3e58a test(android): enforce shared talk config contract (#121333) 2026-08-09 18:55:04 -07:00
Kevin Lin 96c5aa86f2 fix(codex): keep Slack turns running when a plugin is disabled (#120312)
* fix(codex): isolate plugin activation failures

* fix(codex): report rejected plugin installs

* refactor(codex): isolate app-server RPC errors

* fix(codex): classify terminal plugin install rejections
2026-08-09 18:54:28 -07:00
Peter Steinberger f4e62523af fix(update): preserve upstream after pinned dev updates (#121328) 2026-08-09 18:50:12 -07:00
Peter Steinberger 2f97e8c9eb fix(gateway): deliver scoped global session events (#121166)
Centralize global session subscription keys by agent, preserve the default-agent raw global compatibility path, and let authoritative observer audiences reach their selected sockets without changing the public gateway broadcast contract.
2026-08-09 18:50:08 -07:00
Peter Steinberger 620fcd0e27 refactor(plugins): make manifests own config ui hints (#121329) 2026-08-09 18:48:49 -07:00
Peter Steinberger a6c410ef51 fix(agents): preserve retries after failed rate-limit rotation (#121325) 2026-08-09 18:46:06 -07:00
Peter Steinberger 5207c4765d feat(ui): float task-suggestion cards top-right with copy-prompt action (#121259)
* feat(ui): float task-suggestion cards top-right with copy-prompt action

- Float a compact tray in .chat-main__conversation with absolute positioning, min(400px, 100% - margins) sizing, elevation, and internal scrolling.
- Remove the icon column, keep dismiss in the header row, and move a compact split button to the bottom-right.
- Add Copy prompt to the menu via shared copyToClipboard, copying the raw prompt while display-only sanitization remains documented inline.

Release note: Suggested-task cards now float as compact cards at the chat top-right and offer Copy prompt in the action menu.

* style(ui): neutral grey task-suggestion card and actions

Drop the accent-tinted card border/background, mute the eyebrow, and use default grey button treatment for the split control per operator direction.

* fix(ui): ungate copy-prompt and surface clipboard outcomes

- Menu now always renders with the client-local Copy prompt while acceptance-mode items stay capability+scope gated (addresses ClawSweeper finding 1).
- Copy success shows a transient Copied label and failures surface through the pane error path (finding 2).
- Task-suggestion pane logic extracted to chat-pane-task-suggestions.ts and the tray adapter moved into the component to keep files under the 700-line cap.

* fix(ui): test task suggestions through tray adapter

* test(ui): cover task-suggestion clipboard failure

* test(ui): split task-suggestion pane coverage

* chore(ui): raise startup JS budget for task-suggestion card feature

QA-profile measurement was 324617-324620 B versus the 324608 B effective budget; this owner-directed PR #121259 bump follows the baseline file’s documented feature-growth precedent.

* chore(ui): raise startup JS ceiling to 318 KiB for task-suggestion cards

The fixed 317 KiB ceiling (324608 B) was within ~20 B of CI-measured startup bytes after accumulated main drift; the task-suggestion card feature crossed it. Ceiling raised with in-file maintainer-approval comment per its own convention; ratchet baseline set to CI-measured 324626 B.

* fix(ui): keep task-suggestion copy available read-only

Remove the stale accept-or-dismiss tray guard now that Copy prompt is a client-local action. Keep Gateway-backed accept and dismiss controls independently gated, with a regression for operators who can only list suggestions.

* test(ui): cover list-only task-suggestion copy

Update the mocked-Gateway E2E to match the repaired read-only behavior: the suggestion remains visible, its mutating Start action is disabled, and Copy prompt stays available.
2026-08-09 18:45:47 -07:00
Peter Steinberger ba5895a976 test(discord): remove duplicate inbound context contract (#121318) 2026-08-09 18:28:14 -07:00
Peter Steinberger b05a308351 refactor(agents): consolidate prompt and stream attempt steps (#121305)
* refactor(agents): consolidate prompt-phase attempt steps

* refactor(agents): move stream transport into settlement module

* refactor(agents): remove absorbed stream transport step

* test(agents): preserve merged prompt mock exports
2026-08-09 18:25:43 -07:00
Vyctor H. Brzezowski 32ced3053d fix(ui): scope the Control UI cursor convention to app-like display modes (#121258)
* fix(ui): scope the Control UI cursor convention to app-like display modes

The app-chrome cursor convention from #103357/#103411 was applied
unconditionally, so an ordinary browser tab lost the pointer hand on
buttons, menus, tabs, rails, selects and accordion summaries — the only
hover affordance a page owns. The convention is correct for the installed
window the manifest declares ("display": "standalone"), not for every
window the same bundle is served into.

base.css now owns one policy token, --cursor-action, selected by display
mode: pointer by default, the desktop arrow under standalone, minimal-ui
and window-controls-overlay. A low-specificity rule maps generic
actionable controls onto that token, restoring the affordance on the
surfaces #103411 stripped bare, while every component rule that owns a
semantic cursor (not-allowed, disabled, grab, resize, zoom-in, text,
wait) keeps winning without !important.

The 92 cursor: pointer declarations that had drifted back into ui/src
since July now consume the token instead of hardcoding the hand, so they
stop contradicting the policy in an installed window. Real hyperlinks
keep the pointer in every mode. The pre-boot mount fallback repeats the
policy locally because it must render when the bundle fails to load.

Closes #121242

* test(ui): run the cursor policy browser test in the node-driven project

ui/vitest.config.ts routes Playwright-from-Node .browser.test.ts files to the
unit-node project; without registering the new cursor policy test there, the
in-browser chromium project tried to import it and failed on node:fs/playwright.

* fix(ui): keep the desktop arrow in the native app hosts

The macOS dashboard embeds the Control UI in a plain web view, which
reports `display-mode: browser`, so the display-mode-only policy would
have handed it the browser-tab pointer. It already announces itself with
`openclaw-native-macos`/`-nav`/`-web-chrome` on `<html>`, the same markers
`ui/src/styles/layout.css` matches on, so the policy reads those too.
2026-08-09 22:23:00 -03:00
Peter Steinberger 9066ba948a fix(gateway): accept tls_certificate in worker-live fallback reason schema (#121285)
* fix(gateway): accept tls_certificate in worker-live fallback reason schema

* chore(gateway): refresh plugin SDK API baseline

* test(gateway): move worker-live failover conformance guard
2026-08-09 18:21:29 -07:00
Peter Steinberger 1c95854163 refactor(media): fold per-kind alias shells into per-concern modules (#121302)
* refactor(media): fold per-kind alias shells into per-concern modules

* test(ci): retarget media test inventories after shell fold
2026-08-09 18:19:38 -07:00
Vito Cappello 7d129279a4 fix(agents): prevent requester settle while child is still running (#120601)
* fix(agents): keep requester settle attached to live children

* fix(agents): gate requester settle on terminal children

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
2026-08-09 18:19:22 -07:00
Peter Steinberger a3b4c0aa71 fix(acp): preserve source runtime ownership for bound turns (#110261) 2026-08-09 18:12:26 -07:00
Peter Steinberger 3c09da59f6 test(sessions): remove assertion-free history kick probe (#121310) 2026-08-09 18:08:16 -07:00
Peter Steinberger 6f4c8bfb6d refactor(agents): move swarm family into subagents/swarm (#121295) 2026-08-09 18:06:43 -07:00
Peter Steinberger ada95a20c1 docs(concepts): add session synchronization and attachment guide (#121091)
* docs(concepts): add session synchronization and attachment guide

* docs: mark session attachment page schema

* docs: distinguish gateway and local TUI sessions
2026-08-09 18:06:18 -07:00
Jason (Json) 0b663e7a62 fix(plugins): preserve legacy runtime-doctor imports (#121220)
* fix(plugins): preserve legacy runtime doctor imports

* fix(plugins): map legacy doctor package types
2026-08-09 19:01:49 -06:00
Peter Steinberger d7cdb2e60b fix(sessions): fence lifecycle transcript writers (#121284) 2026-08-09 17:55:56 -07:00
Peter Steinberger 1fb5d4f101 fix(ui): coordinate settings mutations and visible refresh outcomes (#116940)
* fix(ui): coordinate model setup mutations

* refactor(ui): return model setup completion

* refactor(ui): extract model setup icon loader

* fix(ui): guard queued model setup dispatch
2026-08-09 17:55:35 -07:00
Peter Steinberger 90ae49a5e5 test(telegram): remove vacuous rate-limit assertion (#121292) 2026-08-09 17:53:20 -07:00
Peter Steinberger 6081685f77 test(gateway): exercise schema cache through handlers (#121298) 2026-08-09 17:49:10 -07:00
Peter Steinberger e934d5d650 test(agents): add golden failover classification corpus (#121289)
* test(agents): add golden failover classification corpus

* fixup! test(agents): add golden failover classification corpus
2026-08-09 17:44:56 -07:00
Peter Steinberger 0c70eeeeab fix(agents): count rate-limit profile rotations only when rotation happens (#121294) 2026-08-09 17:41:57 -07:00
Peter Steinberger ef167715e3 fix(update): bind managed handoffs to install root (#121288) 2026-08-09 17:32:02 -07:00
Peter Steinberger 15dc3de1ee test(telegram): fix vacuous stale-copy assertions (#121291) 2026-08-09 17:26:31 -07:00
Peter Steinberger 04b110b932 test(zalo): remove private rate-limit size seam (#121290) 2026-08-09 17:22:00 -07:00
Peter Steinberger c71c29ecae fix: preserve exec completion identity across poll and heartbeat (#120575)
* fix(agents): bind terminal polls to exact process

UUID-owned completion receipts and ProcessSession-bound finished snapshots prevent same-slug successor consumption.

* chore(plugin-sdk): refresh API baseline

Refresh declaration-closure hashes for the internal system-event receipt boundary.
2026-08-09 17:18:32 -07:00
Peter Steinberger cfe6ebcd1e fix(scripts): anchor hydrated tsx at checkout root (#121149)
Resolve pnpm's configured modules directory from the checkout root before TypeScript boot, preserving both environment spellings and canonical checkout/common-worktree fallbacks. Use Node package self-resolution from the hydrated tsx package so nested wrappers cannot change relative path semantics.
2026-08-09 17:15:27 -07:00
Vyctor H. Brzezowski f9eae0c276 fix(ui): confirm Devices pairing rejects and token revokes in-app (#121279)
* fix(ui): confirm Devices pairing rejects and token revokes in-app

Reject device pairing, reject node pairing, and revoke device token asked for
confirmation through native window.confirm from the shared Nodes operations
module. Embedded webviews without a dialog bridge return false for that call,
so all three actions ended with no dialog, no request, and no recorded reason.

Move the confirmations to DevicesPage, the visual owner, onto the canonical
showConfirmDialog helper already used for inventory removal, and give the copy
real i18n keys. The shared operations module now presents no UI at all.

* test(ui): drive the revoke confirmation through the in-app dialog

device-token-reconnect drove the revoke prompt through Playwright's native
dialog event, which no longer fires now that the page owns the confirmation.
2026-08-09 21:13:19 -03:00
Peter Steinberger 08507909ed fix(cli): guard remaining embedded state writers (#121282) 2026-08-09 17:09:35 -07:00
Sarah Fortune 6efd013c25 fix(slack): support Grid reaction and pin event listeners (#120944)
* fix(slack): support Grid reaction and pin events

* refactor(slack): isolate system event routing

* test(slack): align Grid event scope fixture

* refactor(slack): pass optional event scope directly

* fix(slack): support Grid member events

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-09 17:07:25 -07:00
Peter Steinberger af708e6628 test(ios): trim duplicate root shell mirrors (#121272) 2026-08-09 16:53:04 -07:00
Peter Steinberger 055a2dc6ce feat: continue dashboard sessions from CLI URLs (#120893)
* feat(cli): ingest session targets

* refactor(ui): remove gateway scope shim

* docs(cli): document session targets

* fix(cli): classify session target failures

* fix(cli): keep session target result private

* fix(cli): simplify timeout option warning

* build: declare session URL contract dependency

* fix(cli): parse bare session URL options symmetrically

* fix(cli): preserve command-owned URL arguments

* build: keep session URL contract build-only

* fix: address session URL review findings

* test: preserve session key mock exports

* fix: keep session URL helpers internal

* fix(tui): preserve URL agent for global sessions

* fix(tui): keep URL agent input internal

* fix(gateway): reconcile websocket protocol owner

* fix(attach): preserve global session agent ownership

* fix(attach): enforce global owner at grant boundary
2026-08-09 16:44:25 -07:00
Peter Steinberger 3bdfd60caa fix(media): accept mixed-case local file URLs (#121226) 2026-08-09 16:40:55 -07:00
Peter Steinberger 727e48240b fix(discord): preserve distinct interaction occurrences (#121155) 2026-08-09 16:37:51 -07:00
Peter Steinberger 68e77c5ea7 fix(gateway): accept noVNC extended clipboard framing (#121276)
[AI-assisted]
2026-08-09 16:32:26 -07:00
Peter Steinberger bd6c6aaef2 refactor(ws): consolidate raw WebSocket payload decoding (#121268)
* refactor(ws): consolidate raw data conversion

* fix(scripts): keep gateway client source-loadable

* refactor(ws): share plugin frame decoding
2026-08-09 16:32:18 -07:00
Peter Steinberger 1c9649afc4 fix(telegram): enforce recursive rich-message transport limits (#117020)
* fix(telegram): enforce recursive rich-message limits

* test(telegram): type rich message assertions

* refactor(telegram): build album fragments without map spread
2026-08-09 16:28:47 -07:00
Peter Steinberger 1b2920a520 improve(agents): avoid plugin registry rebuilds on auth refresh (#121250)
* perf(agents): reuse prepared plugin generation

* test(agents): verify plugin generation reuse

* test(agents): tighten plugin generation proof

* style(agents): format prepared runtime integration

* chore(plugin-sdk): refresh prepared runtime API baseline
2026-08-09 16:13:28 -07:00
Peter Steinberger 0f6de6a751 fix(agents): start subagent retention after execution completes (#121178)
## What Problem This Solves
Subagent archive deadlines were armed when a run was registered, allowing a long-running, paused, restored, or still-delivering child to expire before its execution and completion delivery actually finished.

## Why This Change Was Made
One canonical retention owner now computes archive eligibility from completed execution or finalized collector results, clears stale deadlines during paused lifecycles, and keeps the sweeper from reclaiming active or still-owned delivery records.

## User Impact
Long-running and yielded subagents remain available until their work and completion messages finish, while completed runs and collector groups are archived after the intended retention window.

## Context
Final exact-source trusted remote validation passed 220 focused tests, including actual archive end-to-end coverage, and a production/private-QA build spanning 11 bundler phases and 35 plugin closures. All six production files passed core type-aware lint, and targeted formatting passed. Production code decreases by three lines. This affects persisted subagent lifecycle and retention behavior, so explicit maintainer review is required before any merge.
2026-08-09 16:11:36 -07:00
Peter Steinberger cfb19c7054 fix(telegram): stabilize command menu ordering (#121239)
Preserve custom, native, plugin, and alias precedence while keeping the documented /skill fallback across local and Telegram-driven menu pressure.
2026-08-09 16:08:10 -07:00
Jason (Json) d9e43b147a fix: prevent startup failures from obsolete managed plugin shadows (#121261)
* fix: retire stale bundled plugin shadows after core updates

* test: type convergence call ordering
2026-08-09 17:00:24 -06:00
Peter Steinberger eb59c68436 fix(cli): reject blank configuration section filters (#121145)
## What Problem This Solves
Explicit blank or whitespace-only configure --section values were silently discarded by generic normalization, causing a scoped configuration request to unexpectedly launch the full setup wizard.

## Why This Change Was Made
The configuration-section parser now retains explicitly supplied blank values long enough to classify and report them as invalid, while preserving existing trimming and accepted-section behavior. The invalid-section message displays empty values clearly.

## User Impact
Operators who accidentally provide an empty section receive an actionable validation error instead of silently entering unrelated setup flows or changing the wrong configuration area.

## Context
Owner and independent reviewer exercised actual Commander-backed production paths with 13 and 12 passing assertions respectively. Regression coverage spans parser, command, and registered CLI boundaries. Existing oxfmt formatting and scoped whitespace checks passed; production code decreases by one line.
2026-08-09 15:53:04 -07:00