Peter Steinberger
7f9a46ea82
fix(gateway): recover chat when session subscriptions stop responding ( #126760 )
...
* fix(gateway): prevent stalled session subscriptions from freezing chat
* fix(gateway): retire timed-out session subscription leases
* fix(gateway): preserve subscription recovery failure cause
2026-08-20 11:06:26 -07:00
Peter Steinberger
bbbd70542b
feat(sessions): recover offline device placements ( #126284 )
...
* feat(sessions): recover offline device placements
* chore(protocol): refresh session placement models
* perf(ui): lazy-load session placement recovery
* test(ui): remove dropdown timing assertion
* test(ui): await committed cloud recovery route
* fix(sessions): complete explicit abandonment locally
* fix(sessions): fence lists by runner availability
* fix(ui): preserve canonical session freshness
* fix(sessions): preserve recovery contracts after rebase
* test(ui): await durable cloud recovery entry
* test(gateway): complete current runner fixtures
* fix(gateway): publish runner availability edges
* fix(ui): preserve shared session freshness
* fix(ui): preserve canonical sidebar session state
* fix(sessions): preserve abandoned partials and run-owned replies
* fix(sessions): resume durable abandonment retries
* test(gateway): compose provisioning replay with runner availability
* fix(sessions): publish recovered move transitions
2026-08-20 09:59:59 -07:00
Peter Steinberger
58f4c9a0a8
fix(gateway): stop permanent protocol retry loops ( #126600 )
2026-08-20 02:00:21 -07:00
Peter Steinberger
e47637809c
fix(ui): render one assistant reply when history and the terminal event race ( #126382 )
...
* fix(ui): render one assistant reply when history and the terminal event race
A finished run's reply reached the Control UI twice: the durable transcript
row and the pane's own terminal projection shared no identity, so the
projection reducer kept both and the transcript collapsed them behind the
"x2" duplicate badge. The gateway's chat final event carries no message id,
and a durable assistant row carries no run id, so the reducer's same-run
promotion could never match them. A WeakMap side channel hid the duplicate
only when history happened to be applied before the terminal event arrived,
which made the badge look intermittent.
The pane now admits the durable assistant row of the run it is finishing
through the reducer, attributed to that run, so the durable row adopts the
terminal projection in place; the reducer refuses to downgrade a row that
already carries a transcript id back to an id-less projection.
Splits the run-terminal bookkeeping tests into a sibling file to stay under
the max-lines ratchet.
* fix(ui): bind a late reply row to its run only when it carries that reply
The terminal tombstone outlives its run by design, so attributing every
unowned assistant row to it could stamp a delayed older row with a newer
run's id; the reducer then matched that row to the newer run's terminal
projection and replaced the answer the user should see. The tombstone now
claims only the row carrying the reply already projected for that run.
2026-08-19 11:33:22 -07:00
Peter Steinberger
9814b14c90
test: trim residual exact-subset assertions ( #126293 )
2026-08-19 03:41:20 -07:00
Peter Steinberger
d92ebbaf72
feat(gateway): reach a Gateway behind an identity-aware proxy from the CLI ( #125700 )
...
* feat(gateway): reach a Gateway behind an identity-aware proxy from the CLI
Operator CLI surfaces (tui, attach, call, probe, onboarding, and configure) can present configured gateway.remote.edgeAuth headers to an identity-aware proxy. Headers are origin-bound, WSS-only, never follow redirects, cannot set transport-owned headers, and are redacted. Identity-proxy upgrade rejections are classified and remediated instead of being reported as an unreachable gateway.
* test(gateway): cover config-aware probe calls
Keep status probe expectations aligned with the resolved configuration forwarded for origin-bound edge-auth resolution.
* fix(gateway): preserve edge auth across wizard saves and enforce wss before secret resolution
Preserve gateway.remote.edgeAuth only when the configured Gateway scope is unchanged, and reject non-WSS targets before resolving any edge-auth SecretInput.
2026-08-18 03:29:56 -07:00
Peter Steinberger
11ebdfc9c3
fix(gateway): normalize TLS certificate pins ( #125276 )
...
* fix(gateway): normalize TLS certificate pins
* test(gateway): use valid TLS pin fixtures
2026-08-17 06:02:56 -07:00
Peter Steinberger
2d3aaaa0d5
feat(node-host): support Cloudflare Access service tokens ( #125193 )
...
* feat(node-host): support Cloudflare Access service tokens
Carry SecretRef-backed, origin-bound Cloudflare Access credentials across node onboarding, gateway and worker connections, and node-owned worker transfers. Refs #125112 .
* chore: align changed gate after rebase
* test(node-host): keep access proof within lint budgets
* style(node-host): keep supervisor within line budget
* fix(node-host): omit absent access config
* fix(node-host): reject Access credentials on plaintext routes
* fix(node-host): reject plaintext before ref resolution
* test: cover Access log redaction over TLS
2026-08-17 04:12:27 -07:00
Peter Steinberger
8f145789b5
fix: diagnose gateways that cannot host nodes ( #125132 )
...
* fix(doctor): expose node hosting preconditions
* fix(doctor): use canonical string coercion
* fix(auth): narrow identity header rejection
2026-08-17 00:30:21 -07:00
Peter Steinberger
85baeecb57
refactor: consolidate record guards ( #124970 )
2026-08-16 19:34:57 -07:00
ClawSweeper
6c027ad5e1
fix(gateway): surface blocking startup progress ( #124309 )
...
Keep Gateway admission sidecar-gated while surfacing retryable startup progress in TUI and Control UI.
Unify deferred startup ownership and shutdown draining so late workers, plugin services, and sidecars cannot outlive transport teardown.
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com >
Co-authored-by: Ayaan Zaidi <hi@obviy.us >
2026-08-17 07:56:41 +05:30
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
dbad5e385d
refactor(workers): separate runner consent from capacity ( #124356 )
...
* refactor(workers): separate runner inventory state
* docs(runners): track inventory cleanup
* test(workers): use bundle-only launch wire
* test(workers): update optional inventory fixture
* test(workers): validate prewarm inventory capability
* fix(workers): version runner inventory cutover
2026-08-16 04:46:38 -07:00
Peter Steinberger
7f891f4a78
fix(ui): stale tabs keep dispatching after gateway updates ( #123882 )
...
* fix(ui): reject stale bundled clients at connect
* chore: keep release notes out of runtime fix
* fix(ui): preserve stale-build admission invariants
2026-08-14 17:05:10 -07:00
Peter Steinberger
58ab589da5
fix(ui): stale tabs restore terminals without owners ( #123660 )
...
* fix(ui): fence stale same-version clients by build
* test(ui): satisfy build identity lint guards
* fix(ui): complete build identity fencing
* chore: leave release notes to release prep
* test(ui): align build identity fixtures
* fix(ui): fence reconnects on pending worker
* test(ui): stabilize cross-platform update proof
* test(ui): satisfy service worker lint
* test(ui): preserve offline socket cohorts
2026-08-14 13:19:02 -07:00
Peter Steinberger
d19c7553dd
feat(computer-use): computer.act v2 action contract with capability-filtered tool ( #123544 )
...
* feat(computer-use): computer.act v2 action contract with capability-filtered tool
* fix(computer-use): break contract import cycle, bound model-visible elements, regen swift protocol
* test(computer-use): satisfy curly rule in schema-cap helpers
* fix(computer-use): satisfy type-aware lint on contract and tool
* test(gateway-protocol): keep connect-params suite under the line cap
2026-08-14 02:40:56 -07:00
Peter Steinberger
2f337adb8e
fix(tui): render each live assistant message once ( #123395 )
2026-08-13 18:06:22 -07:00
Peter Steinberger
7a4b5a0a41
feat(gateway): provision paired node session hosts ( #122966 )
...
* feat(gateway): provision paired node worker installs
* docs: record node local-install PR chain
* chore(protocol): regenerate node worker manifest models
* fix(gateway): resolve node worker build through the device runtime
Repairs a rebase artifact: startup referenced a stale deviceNodeRegistry
binding; the device runtime now owns the connected-node lookup via
resolveWorkerBuild.
2026-08-13 01:56:19 -07:00
Peter Steinberger
cef071582e
feat: let limited browsers request admin access ( #121459 )
...
* feat(gateway): add live device scope upgrades
* feat(ui): add limited-access upgrade flow
* fix(protocol): refresh Swift scope upgrade models
* perf(ui): lazy-load device scope upgrades
* fix(ci): complete scope upgrade generated surfaces
* perf(ui): lazy-load GitHub link hovercards
* fix(ui): keep admin repair guidance focusable
* fix(ui): gate and refresh scope upgrade banner
* refactor(ui): keep gateway client within line budget
* fix(ci): align rebased scope upgrade checks
* fix(ui): resolve scope upgrade in browser tests
* fix(gateway): honor refreshed scope upgrade deadline
* fix(gateway): honor refreshed scope upgrade deadline
* fix(gateway): coalesce scope upgrade waiters
* fix(ui): gate scope upgrade actions
* chore(plugin-sdk): refresh rebased API baseline
* fix(scope-upgrade): return canonical request ids
* fix(ui): preserve gateway event type binding
* fix(protocol): generate scope upgrade result models
* fix(ui): preserve scope upgrade recovery guidance
* chore(plugin-sdk): refresh rebased API baseline
* test(ui): avoid scope upgrade navigation race
* docs(control-ui): clarify scope upgrade approver
* test(gateway): align appended method counts
* chore(plugin-sdk): refresh rebased API baseline
* refactor(ui): keep place picker within line budget
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): refresh rebased API baseline
* fix(gateway): preserve scope-upgrade browser origin
2026-08-12 18:32:00 -07:00
Peter Steinberger
522f06ffc6
feat(worker): support direct Gateway connections ( #122683 )
...
* feat(worker): support direct gateway connections
* docs(plan): link node worker provider PR
2026-08-12 09:59:29 -07:00
Peter Steinberger
d44f70eb4b
feat(pairing): one-paste device pairing via oc-pair setup links ( #120768 )
...
* feat(pairing): one-paste device pairing via oc-pair setup links
Implements milestone 3 from docs/plan/runners.md.
* fix(pairing): sign bootstrap handshake, keep URL candidates, wire pairing countdown
* test(gateway): update client callsite guard
* fix(pairing): preserve setup URL context paths
* fix(ui): keep pairing help aligned with setup mode
* fix(pairing): isolate bootstrap credentials
* perf(ui): keep one-paste pairing within bundle budget
* refactor(pairing): isolate native pair URL prefix parsing
* fix(pairing): preserve candidate lifecycle state
* fix(pairing): retire shared credentials after bootstrap
* fix(pairing): apply rotated manifest through client owner
* test(pairing): prove bootstrap retirement across reconnect
* fix(pairing): preserve native gateway context paths
* fix(pairing): carry native context paths through reconnect
* fix(ios): preserve encoded gateway context path
* chore(plugin-sdk): refresh pairing API baselines
2026-08-12 02:01:33 -07:00
Peter Steinberger
b080dd1e76
refactor: consolidate coercion contracts ( #122458 )
...
* refactor: consolidate coercion contracts
Centralize exact string, record, numeric, date, Boolean, argument, and structured-error coercions while preserving call-site semantics.
Migrate canonical-name collisions and deprecated internal SDK bypasses, deleting 55 net production/tooling lines. Expand declaration ownership enforcement to 101 allowed helpers and add a narrow export-completeness audit.
* fix: preserve standalone script coercions
Keep copied Control UI tooling self-contained and retain the trusted release harness module-relative source seam when the harness runs against an old target cwd.
2026-08-11 23:26:37 -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
Peter Steinberger
f12fe48075
refactor(gateway): finalize kernel composition ( #122014 )
2026-08-11 04:54:54 -07:00
Peter Steinberger
3b3c540896
refactor: remove dead branches and test-only helpers ( #121345 )
...
* refactor: remove dead branches and test-only helpers
* fix: preserve codex cleanup error causes
* fix: preserve gateway error code compatibility
* chore: update plugin sdk api baseline
* docs: fix live cache runner path
2026-08-10 06:47:43 -07:00
Peter Steinberger
3a1f645228
fix(ui): prevent duplicate initial prompts during session startup ( #121498 )
...
* fix(ui): unify initial prompt handoff projection
Route create-time prompts through the canonical session projection so live persistence and delayed history adopt one stable bubble. Preserve inline attachment content across reconnects and authoritative identity handoff while removing duplicate matching and post-reducer mutation paths.
* fix(ui): preserve initial prompt projection contracts
* fix(ci): restore exact-head validation
2026-08-10 02:38:33 -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
0ef798d28d
fix(gateway): keep hello authorization aligned with RPC access ( #120888 )
...
* fix(gateway): separate socket and device token scopes
* chore(i18n): refresh native source baseline
* style(ios): keep gateway channel within lint limit
* refactor(gateway): simplify scope metadata decoding
* ci(ui): isolate real-gateway e2e suites
* docs(ci): align runner table formatting
* chore(plugin-sdk): refresh api baseline
* ci(ui): route real-gateway retries to hosted runners
* chore(plugin-sdk): repair generated api baseline
* test(ui): select Labs toggles by title
* fix(gateway): preserve stored scopes without wire metadata
2026-08-09 14:50:07 -07:00
Vincent Koc
587def9c9d
fix(gateway): keep new nodes compatible with older gateways ( #119981 )
...
* fix(gateway): keep new nodes compatible with older gateways
Punchcard-Session: golden-brook-lantern-zp
* fix(gateway): clear protocol compatibility check failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retire manifest before inventory refresh
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): keep new nodes compatible with older gateways
Punchcard-Session: golden-brook-lantern-zp
* fix(gateway): clear protocol compatibility check failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retire manifest before inventory refresh
Punchcard-Session: cobalt-timber-orchard-d1
* docs(gateway-client): describe compatible admission
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): ignore retired publication failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): keep new nodes compatible with older gateways
Punchcard-Session: golden-brook-lantern-zp
* fix(gateway): clear protocol compatibility check failures
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retire manifest before inventory refresh
Punchcard-Session: cobalt-timber-orchard-d1
* docs(gateway-client): describe compatible admission
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): ignore retired publication failures
Punchcard-Session: cobalt-timber-orchard-d1
* test(node-host): split optional publication coverage
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): retain latest rejected inventory
Punchcard-Session: cobalt-timber-orchard-d1
* chore(gateway-protocol): remove release-only changelog edits
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): normalize blank node host families
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): normalize node metadata before pairing
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): negotiate legacy node metadata
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): complete rolling node convergence
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): honor publication retry backoff
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): close rolling compatibility gaps
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): migrate node pairing rollback metadata
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): scope legacy support to wire admission
Punchcard-Session: cobalt-timber-orchard-d1
* test(gateway): type legacy hello protocol fixture
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): converge node protocol after upgrade
Punchcard-Session: cobalt-timber-orchard-d1
* fix(node-host): preserve publication retry backoff
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): honor latest node compatibility state
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): recover protocol negotiation after rollback
Punchcard-Session: cobalt-timber-orchard-d1
* fix(gateway): guard legacy metadata lookup
Punchcard-Session: cobalt-timber-orchard-d1
2026-08-09 13:16:37 +08:00
Peter Steinberger
c8cd98cf52
refactor(gateway): centralize connect failure classification ( #120505 )
...
* refactor(gateway): centralize connect failure classification
* fix(gateway): project connect failure into status JSON
* fix(protocol): restore remote-auth context in pairing remediation
* fix(gateway): classify generic probe failures by close reason
* fix(gateway): keep transport closes unreachable
* fix(gateway): preserve rate-limit diagnostics
* fix(gateway): preserve typed rate-limit failures
2026-08-08 18:34:01 -07:00
Peter Steinberger
47fd629c8d
feat(gateway): persist per-origin device auth ( #120533 )
...
* feat(gateway): add per-origin device auth
* fix(ui): remove unused gateway scope alias
* test(tui): split gateway chat coverage
* test(tui): update connection test routing
* fix(auth): preserve legacy device auth migration guard
2026-08-08 13:53:31 -07:00
Peter Steinberger
48639663b0
chore(release): prepare 2026.8.1 ( #120375 )
2026-08-07 18:44:12 -07:00
Xiaoshuai Zhang
72fd25d47d
fix(gateway): connect bootstrap clients to self-signed WSS ( #80204 )
...
* fix(gateway): propagate TLS pins to bootstrap clients
Co-authored-by: Xiaoshuai Zhang <dev@jetd.one >
Punchcard-Session: cobalt-brook-meadow-m9
* fix(gateway): keep TLS loader type private
Punchcard-Session: cobalt-brook-meadow-m9
* fix(gateway): preserve TLS pin transport policy
Punchcard-Session: cobalt-brook-meadow-m9
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org >
Co-authored-by: Xiaoshuai Zhang <dev@jetd.one >
2026-08-05 13:19:27 +08: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
8fdcdaba76
fix(talk): bound browser transcript ownership
2026-08-01 14:39:27 +08:00
Vincent Koc
20e68e01df
fix(gateway): sign device proofs with challenge time ( #116679 )
2026-07-31 16:45:53 +08:00
Vincent Koc
b015925bc3
test(core): remove dead and duplicate coverage ( #116641 )
...
* test(markdown): make code table style coverage assertive
* test(core): remove duplicate regression coverage
2026-07-31 11:48:46 +08:00
Shakker
2cdedd7eeb
test: isolate gateway sequence lifecycle coverage
2026-07-29 20:05:56 +01:00
Shakker
403a9b778b
test: cover gateway sequence reset on restart
2026-07-29 20:05:56 +01:00
Shakker
dbcd479007
test: cover gateway sequence reset on reconnect
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
Vincent Koc
38abf500ba
fix(update): stabilize cross-version dev upgrades ( #115651 )
...
* fix(e2e): stabilize cross-version Parallels upgrades
* fix(e2e): avoid inline macOS guest probes
* fix(e2e): detach Windows dev updates
* fix(e2e): detach macOS guest updates with Node
* fix(e2e): initialize skipped upgrade config
* fix(update): use partial clone for dev checkout
* fix(update): keep Windows dev checkouts clean
* fix(e2e): pin Parallels dev update targets
* fix(e2e): own Parallels gateway restarts
* fix(e2e): verify pinned Parallels checkouts
* fix(e2e): forward Parallels update budgets
* fix(e2e): use canonical provider auth choices
* chore: leave changelog to release automation
* test(ui): stabilize route waits on loaded runners
2026-07-29 19:52:34 +08: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
ad3f74f296
fix(chat): make web and terminal share one session state ( #115429 )
...
* fix(chat): consolidate web and terminal session state
* fix(chat): preserve live history across stale snapshots
2026-07-28 18:53:21 -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
18ecde3d9f
refactor(chat): keep web and terminal sessions synchronized ( #115377 )
...
* refactor(chat): unify web and TUI session synchronization
* refactor(chat): extract canonical projection and transcript owners
* test(gateway): verify private transcript store identity
* test(agents): protect public transcript storage boundary
* fix(chat): harden cross-client identity and subscription lifecycles
* fix(gateway-client): preserve type-safe release callback rejection
* test(ui): complete shared sidebar gateway fixture
2026-07-28 16:08:10 -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
f6131a4fbf
build(deps): remove npm shrinkwrap; mirror pnpm lock into transient package locks ( #114006 )
...
* build(deps): remove npm shrinkwrap; mirror pnpm lock into transient package locks
npm 12 removed shrinkwrap (command + tarball/root loading). Delete all 82
committed npm-shrinkwrap.json files and stop publishing lockfiles; keep
pnpm-lock.yaml as the single reviewed dependency boundary. The generator
becomes scripts/generate-npm-package-lock.mjs and feeds plugin bundling via
a transient package-lock.json + npm ci (works on npm 11 and 12). Tarball
validation treats the published 2026.7.2 beta train as a shrinkwrap
transition; self-update npm detection now uses install topology instead of
the shipped shrinkwrap.
* fix(deps): repair lint, deadcode, and test-type lanes for the npm 12 migration
- sort integrity comparisons with an explicit comparator (oxlint)
- keep resolveBunGlobalNodeModules module-local (knip unused-export gate)
- model npm pack --json as npm<=11 array / npm 12 name-keyed object
- default calver destructuring in the tarball test fixture
2026-07-26 01:29:55 -04:00