Commit Graph

14 Commits

Author SHA1 Message Date
Peter Steinberger 568b920b21 feat(lint): enforce import ordering and deduplication (#124730)
* refactor(imports): dedupe and hoist imports

* feat(lint): enforce import/no-duplicates and import/first
2026-08-16 11:44:52 -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
Peter Steinberger 3a55867ea1 fix(gateway): bound stalled session subscriptions (#121164) 2026-08-11 10:10:20 -07:00
Omar Shahine 2b3009f718 fix(gateway): preserve node invoke dispatch provenance (#117139)
* fix(gateway): preserve node invoke dispatch provenance

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* fix(gateway): preserve timeout precedence

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* fix(gateway): mark wake-path disconnect as not dispatched

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* fix(gateway): mark plugin dispatch after send

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

* build(browser): regenerate Copilot runtime

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6381c461-11aa-4700-8648-4da1393e1c59
2026-08-01 21:22:51 +00:00
Vincent Koc 20e68e01df fix(gateway): sign device proofs with challenge time (#116679) 2026-07-31 16:45:53 +08:00
Shakker 2cdedd7eeb test: isolate gateway sequence lifecycle coverage 2026-07-29 20:05:56 +01:00
Shakker ab3f52c367 fix: reset gateway event sequence on reconnect 2026-07-29 20:05:56 +01:00
Peter Steinberger fde4658bf6 fix(ui): recover sessions and dashboards after prolonged outages (#115654)
* fix(ui): recover long-running sessions and dashboards

* fix(ui): expose browser-safe gateway timers

* refactor(ui): keep browser timer surface minimal

* refactor(gateway): extract pending request state

* fix(ci): refresh browser runtime and format baseline

* fix(ci): exclude generated plugin outputs from targeted lint

* fix(ui): bound long-running connection and pane lifecycles

* refactor(ui): split long-running lifecycle regression coverage

* fix(ui): bound long-running media and lint ownership

* fix(security): preserve explicit workspace disable denylist

* fix(ci): preserve plugin manifest fallback lint
2026-07-29 10:09:51 -04:00
Peter Steinberger ad36646ed1 fix(gateway): reconnect nodes after transient socket failures (#115539)
* fix(gateway): reconnect nodes after transient socket failures

* fix(browser): refresh bundled gateway reconnect runtime

* fix(gateway): preserve callback-owned reconnect state
2026-07-29 01:15:26 -04:00
Peter Steinberger d239a59d82 fix(ui): make Control UI ownership and permissions reliable (#115364)
* fix(ui): unify connection-owned gateway event dispatch

* fix(qa): keep hosted UI smoke evidence truthful

* fix(ui): make mobile navigation drawer an accessible modal

* refactor(ui): centralize settings search destinations

* fix(ui): own chat media resource lifecycles

* fix(ui): unify sidebar session scope ownership

* refactor(ui): remove obsolete navigation backdrop styles

* refactor(ui): isolate dashboard provider lease capabilities

* fix(ui): centralize gateway operator permissions

* style(ui): format gateway event regressions

* fix(ui): render live dashboard permissions immediately

* fix(ui): enforce approval grant authority

* fix(gateway): fence retired sockets after event gaps

* fix(ui): isolate sidebar gateway fixtures across shared workers

* test(ui): isolate singleton-sensitive browser suites

* fix(ui): retire stale catalog pagination on gateway reconnect

* fix(ui): restore drawer focus after native dialog dismissal

* fix(ui): seed drawer threads and preserve modal focus ownership

* fix(ui): isolate nested native drawer overlay lifecycle

* test(ui): prove isolated dashboard lease authorization

* fix(ui): bound settled managed image resources

* fix(ui): type native modal focus and shared test helper

* fix(ui): correct approval mock types and trim dead export

* fix(ui): keep settings section metadata private

* fix(qa): keep hosted coverage regression within lint limit

* refactor(ui): keep catalog presence in its session data owner

* fix(browser): regenerate bundled copilot runtime

* test(ui): split board lease authorization regressions

* fix(ui): snapshot gateway listener fanout without redundant spread

* fix(ui): bind chat media subscriptions to image lifetime

* fix(ui): extract overlay access lifecycle

* fix(ui): restore guarded media after Lit reconnection

* test(ui): localize board lease fixture title

* fix(ui): reuse system approval fixture labels

* test(ui): narrow managed media lifecycle source

* fix(ui): prevent retired board gateway clients from rolling back leases

* fix(ui): expose pairing to pairing-scoped operators

* fix(ui): preserve legacy device pairing access

* fix(ui): preserve responsive sidebar ownership

* fix(ui): preserve responsive navigation and prove media ownership

* fix(ui): retire revoked catalog and refresh pairing grants

* test(ui): align typed catalog fixtures with main
2026-07-28 16:42:05 -04:00
Peter Steinberger 98b8a18b4c fix(node): harden reconnect and local inference cancellation (#115033)
* fix(node): harden reconnect and local inference cancellation

* fix(browser): refresh bundled gateway client

* fix(gateway): preserve restart after reconnect reset

* fix(node): preserve tracked remote command ownership
2026-07-28 04:18:51 -04:00
Peter Steinberger 6d4082ef97 fix(ui): prevent unsafe custodian nudge answers (#111430)
* fix(ui): harden custodian nudge actions

* refactor(ui): split custodian page helpers

* fix(ui): classify custodian nudge delivery

* fix(ui): ignore stale custodian question replies

* fix(ui): restore rejected custodian questions

* fix(ui): preserve custodian wizard uncertainty

* refactor(ui): keep nudge text helper private

* test(ui): model uncertain custodian delivery

* fix(ui): scope delayed custodian dismissals

* fix(ui): retain in-flight custodian nudges

* fix(ui): block nudges during hosted wizard input

* chore(protocol): regenerate gateway models
2026-07-19 11:10:41 -07:00
Peter Steinberger f87a74602a refactor(gateway): simplify canonical WebSocket client (#106316)
* refactor(gateway): simplify canonical websocket client

* refactor(gateway): keep protocol options internal
2026-07-13 05:34:57 -07:00
Peter Steinberger 7c9b8baa2b refactor(gateway): consolidate TypeScript WebSocket clients (#106113)
* refactor(gateway): unify websocket clients

* fix(gateway): preserve adapter lifecycle behavior

* test(gateway): keep reconnect proof black-box

* chore(gateway): satisfy shared client lint

* refactor(gateway): keep protocol decisions internal

* refactor(gateway): preserve shared reconnect supervision

* test(gateway): use canonical browser barrel

* fix(gateway): resolve browser retry workspace source

* refactor(gateway): tighten shared protocol types
2026-07-13 03:08:21 -07:00