Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
242 commits
Select commit Hold shift + click to select a range
f5dbcb2
fix(ci): pin coordinator source revision
vincentkoc Jul 12, 2026
d9213f8
fix(image): verify crabbox release archive
vincentkoc Jul 12, 2026
c764890
fix(terminal): confirm one-shot input delivery
vincentkoc Jul 12, 2026
d119c8f
fix(runtime): reject unroutable profile ids
vincentkoc Jul 12, 2026
80c56dc
fix(terminal): send attributed commands atomically
vincentkoc Jul 12, 2026
192e102
fix(actions): honor live relay availability
vincentkoc Jul 12, 2026
e14d408
fix(app): reconcile browser history state
vincentkoc Jul 12, 2026
4e02e97
fix(vnc): harden authentication and input keysyms
vincentkoc Jul 12, 2026
0be23dd
fix(cards): persist run claims atomically
vincentkoc Jul 12, 2026
ed40ea5
fix(actions): fence concurrent session updates
vincentkoc Jul 12, 2026
ae7afc8
fix(events): reject lossy JSON values
vincentkoc Jul 12, 2026
3d21dc1
fix(routes): reject malformed session ids
vincentkoc Jul 12, 2026
c3c7cf2
fix(terminal): retain shared input state
vincentkoc Jul 12, 2026
d419a86
fix(auth): revoke session grants atomically
vincentkoc Jul 12, 2026
48944ce
fix(macos): harden private desktop sharing
vincentkoc Jul 12, 2026
15cc13a
fix(vnc): harden protocol state transitions
vincentkoc Jul 12, 2026
eb5df98
fix(sandbox): preserve refreshed session ownership
vincentkoc Jul 12, 2026
3c2d6ef
fix(runtime): retain superseded workspace cleanup
vincentkoc Jul 12, 2026
e5b7fbb
docs(changelog): record audit hardening
vincentkoc Jul 12, 2026
6bd3205
style(terminal): format input dispatch
vincentkoc Jul 12, 2026
c6641c9
test(macos): use explicit token placeholder
vincentkoc Jul 12, 2026
54193ad
fix(macos): normalize native broker schemes
vincentkoc Jul 12, 2026
40eb46b
fix(terminal): negotiate input acknowledgements
vincentkoc Jul 12, 2026
7317e0f
fix(actions): fence blocked work states
vincentkoc Jul 12, 2026
0a81c81
fix(http): validate deeply nested JSON iteratively
vincentkoc Jul 12, 2026
a897983
fix(vnc): preserve ASCII keysyms in composed input
vincentkoc Jul 12, 2026
aca2537
fix(runtime): preserve opaque fixed profile ids
vincentkoc Jul 12, 2026
74e04a2
fix(runtime): clean reservation archives before rollback
vincentkoc Jul 12, 2026
f461439
fix(macos): preserve network and clipboard semantics
vincentkoc Jul 12, 2026
ceabb9b
fix(terminal): keep established sockets alive
vincentkoc Jul 12, 2026
fc4862d
fix(macos): serialize private share lifecycle
vincentkoc Jul 12, 2026
da26a14
docs(changelog): expand audit compatibility notes
vincentkoc Jul 12, 2026
d9bf41f
fix(macos): refresh clipboard state before dedupe
vincentkoc Jul 12, 2026
39e0ee4
fix(vnc): validate authentication and format transitions
vincentkoc Jul 12, 2026
01ab3dd
fix(actions): fence registration against read state
vincentkoc Jul 12, 2026
f1c145f
fix(macos): decode X11 Unicode keysyms
vincentkoc Jul 12, 2026
a2b312c
fix(macos): preserve empty clipboard notifications
vincentkoc Jul 12, 2026
ec1f52f
fix(cards): classify duplicate claims before capacity
vincentkoc Jul 12, 2026
b2bdeaf
docs(changelog): complete audit hardening notes
vincentkoc Jul 12, 2026
a018a30
fix(terminal): return after empty confirmed input
vincentkoc Jul 12, 2026
654f0e4
fix(macos): remove hosts after listener failure
vincentkoc Jul 12, 2026
bc6648f
fix(vnc): force idle pixel format boundaries
vincentkoc Jul 12, 2026
5f9911e
docs(changelog): record final audit fixes
vincentkoc Jul 12, 2026
1c3f71a
fix(sandbox): rotate credential generations monotonically
vincentkoc Jul 12, 2026
2299f9c
fix(terminal): bound input confirmation waits
vincentkoc Jul 12, 2026
2f27fc0
fix(vnc): drain pixel format probe responses
vincentkoc Jul 12, 2026
f1298a1
docs(changelog): complete audit lifecycle notes
vincentkoc Jul 12, 2026
62b5aeb
fix(vnc): synchronize pixel formats with RFB fences
vincentkoc Jul 12, 2026
1919e62
docs(changelog): note fenced VNC transitions
vincentkoc Jul 12, 2026
a79bffd
fix(vnc): negotiate pixel format fences safely
vincentkoc Jul 12, 2026
6ebb42d
fix(vnc): correlate fallback format boundaries
vincentkoc Jul 12, 2026
fd52c2b
fix(vnc): fail closed on partial fence support
vincentkoc Jul 12, 2026
7df941d
fix(vnc): reject unsafe legacy format switches
vincentkoc Jul 12, 2026
eedc469
docs(changelog): clarify legacy VNC handling
vincentkoc Jul 12, 2026
b361ac7
fix(macos): clear stale non-text clipboard cache
vincentkoc Jul 12, 2026
e75959a
fix(vnc): await initial fence negotiation
vincentkoc Jul 12, 2026
4cbb4f7
test(events): follow ledger store contract
vincentkoc Jul 12, 2026
6c6af3f
fix(events): defer request archive publication
vincentkoc Jul 12, 2026
98d4471
fix(macos): preserve unowned desktop registrations
vincentkoc Jul 12, 2026
86e124d
fix(vnc): require synchronized format boundaries
vincentkoc Jul 12, 2026
90b8f22
fix(terminal): revalidate upstream before input ack
vincentkoc Jul 12, 2026
fc9b82a
fix(vnc): bound fence capability probes
vincentkoc Jul 12, 2026
532bf52
fix(macos): decouple stop from registry cleanup
vincentkoc Jul 12, 2026
c4d8f3d
fix(macos): use monotonic command deadlines
vincentkoc Jul 12, 2026
6c5aa55
fix(vnc): preserve timeout synchronization boundaries
vincentkoc Jul 12, 2026
0876c2a
fix(macos): preserve private share registration ownership
vincentkoc Jul 12, 2026
1054a76
fix(actions): acknowledge runner input delivery
vincentkoc Jul 12, 2026
9232a35
fix(terminal): queue input acknowledgements
vincentkoc Jul 12, 2026
f7a82cd
fix(vnc): bound pixel format transition waits
vincentkoc Jul 12, 2026
307304c
fix(actions): correlate runner input acknowledgements
vincentkoc Jul 12, 2026
b1410b2
fix(worker): fence desktop host cleanup ownership
vincentkoc Jul 12, 2026
fe70513
fix(macos): harden private share teardown lifecycle
vincentkoc Jul 12, 2026
51260ee
fix(credentials): stage policy generation rotation
vincentkoc Jul 12, 2026
82ad6d7
docs(actions): document framed runner protocol
vincentkoc Jul 12, 2026
35afbf2
fix(actions): fence registration and terminal races
vincentkoc Jul 12, 2026
e3fec6f
fix(vnc): defer transition timeout until framebuffer boundary
vincentkoc Jul 12, 2026
8fcce0f
fix(vnc): release unresolved credential requests
vincentkoc Jul 12, 2026
b018ec3
fix(credentials): restore failed policy rotations
vincentkoc Jul 12, 2026
4a3f93e
fix(actions): negotiate framed runner io
vincentkoc Jul 12, 2026
535c8fe
fix(actions): fence runner protocol negotiation
vincentkoc Jul 12, 2026
af57733
fix(vnc): accept late fence capability responses
vincentkoc Jul 12, 2026
9246841
fix(desktop): preserve legacy host cleanup
vincentkoc Jul 12, 2026
3d819a6
fix(worker): fence policy rollback and registration CAS
vincentkoc Jul 12, 2026
b63139b
fix(macos): bound tailnet pipe draining
vincentkoc Jul 12, 2026
58ae424
fix(actions): negotiate runner protocol at connect
vincentkoc Jul 12, 2026
6e60b01
docs(actions): describe legacy runner compatibility
vincentkoc Jul 12, 2026
c5a9da8
fix(runtime): validate profile route templates
vincentkoc Jul 12, 2026
6dfc57b
fix(image): preserve verified version overrides
vincentkoc Jul 12, 2026
a0113f0
fix(runtime): reject ambiguous adapter urls
vincentkoc Jul 12, 2026
6c8a0ba
fix(image): require pinned override checksums
vincentkoc Jul 12, 2026
601ec04
docs(actions): clarify raw runner fallback
vincentkoc Jul 12, 2026
84c7316
fix(macos): await share cleanup on termination
vincentkoc Jul 12, 2026
bd0f7b7
fix(credentials): claim rollback recovery ownership
vincentkoc Jul 12, 2026
efe22a4
fix(desktop): return atomic registration row
vincentkoc Jul 12, 2026
0f7ac2d
fix(terminal): route confirmations through one reader
vincentkoc Jul 12, 2026
658efdf
docs(changelog): record final concurrency fixes
vincentkoc Jul 12, 2026
0f879b7
fix(image): keep default digest immutable
vincentkoc Jul 12, 2026
4a0adef
docs(actions): reject split utf8 input frames
vincentkoc Jul 12, 2026
437a4f4
test(actions): enforce byte-safe runner docs
vincentkoc Jul 12, 2026
461b200
fix(macos): retry pending input releases
vincentkoc Jul 12, 2026
2c98e22
fix(terminal): defer output ack until attach
vincentkoc Jul 12, 2026
515af60
fix(macos): bound successful command drain
vincentkoc Jul 12, 2026
d49d0e3
fix(actions): negotiate viewer relay protocol
vincentkoc Jul 12, 2026
35931c0
fix(actions): confirm viewer relay negotiation
vincentkoc Jul 12, 2026
b317dc7
docs(changelog): record final audit fixes
vincentkoc Jul 12, 2026
b52c3a6
test(macos): stabilize descendant drain fixture
vincentkoc Jul 12, 2026
270ca5b
fix(terminal): serialize confirmed input delivery
vincentkoc Jul 12, 2026
bd51d0e
fix(macos): await concurrent share teardown
vincentkoc Jul 12, 2026
a372e51
fix(runtime): preserve adapter migration fallback
vincentkoc Jul 12, 2026
adf45ce
docs(actions): clarify viewer relay negotiation
vincentkoc Jul 12, 2026
1bc0689
fix(actions): fence writes to authenticated revision
vincentkoc Jul 12, 2026
66ab009
fix(desktop): negotiate registration ownership
vincentkoc Jul 12, 2026
9660fe7
fix(credentials): fence legacy registration claims
vincentkoc Jul 12, 2026
7a441e4
docs(changelog): record rollout safety fixes
vincentkoc Jul 12, 2026
2d64d0c
fix(actions): keep authenticated revisions monotonic
vincentkoc Jul 12, 2026
a30a750
fix(terminal): unblock confirmed message delivery
vincentkoc Jul 12, 2026
27058ad
fix(terminal): serialize client input completions
vincentkoc Jul 12, 2026
867647e
fix(http): reject rounded integer literals
vincentkoc Jul 12, 2026
b19dde9
docs(actions): close runner socket on PTY exit
vincentkoc Jul 12, 2026
9131ced
fix(macos): retry cleanup and unwind canceled starts
vincentkoc Jul 12, 2026
5b74e41
docs(changelog): record final audit repairs
vincentkoc Jul 12, 2026
1705470
fix(terminal): wake confirmed input delivery
vincentkoc Jul 12, 2026
d522fbd
fix(macos): clear completed stop coordination
vincentkoc Jul 12, 2026
e947561
fix(vnc): close parser and credential lifetime gaps
vincentkoc Jul 12, 2026
139dd14
docs(changelog): record final race repairs
vincentkoc Jul 12, 2026
6c53bcc
fix(desktop): preserve legacy ownership fences
vincentkoc Jul 12, 2026
b17c5c8
fix(terminal): close remaining delivery races
vincentkoc Jul 12, 2026
b200f1f
fix(macos): retain teardown input releases
vincentkoc Jul 12, 2026
7d7dd97
fix(vnc): arm transition fences before writes
vincentkoc Jul 12, 2026
64deb48
docs(actions): make framed runner byte-safe
vincentkoc Jul 12, 2026
394aeaa
docs(changelog): record remaining audit repairs
vincentkoc Jul 12, 2026
3052af1
fix(ssh): snapshot connection limits before handlers
vincentkoc Jul 12, 2026
255825a
docs(changelog): record ssh limit snapshotting
vincentkoc Jul 12, 2026
c2600f1
fix(migrations): fence mixed-version ownership
vincentkoc Jul 12, 2026
3f9185c
fix(terminal): bound confirmation serialization
vincentkoc Jul 12, 2026
8bd9aa8
docs(actions): acknowledge only delivered input
vincentkoc Jul 12, 2026
db2bd15
fix(vnc): publish fence capability atomically
vincentkoc Jul 12, 2026
d1808ef
docs(changelog): record rollout boundary fixes
vincentkoc Jul 12, 2026
b30814e
fix(macos): skip empty input release retries
vincentkoc Jul 12, 2026
cc7ff39
fix(terminal): await attachment frame consumer
vincentkoc Jul 12, 2026
66251dd
docs(actions): bound framed runner buffering
vincentkoc Jul 12, 2026
5b71ba1
fix(credentials): fence staged rotations from legacy writers
vincentkoc Jul 12, 2026
0d0c32c
docs(changelog): record final audit repairs
vincentkoc Jul 12, 2026
999797c
fix(credentials): repair incomplete lookup sets
vincentkoc Jul 12, 2026
a238dd8
fix(terminal): bound serialized input backlog
vincentkoc Jul 12, 2026
0eac78f
fix(actions): retire acknowledgements on runner failover
vincentkoc Jul 12, 2026
cc38033
docs(changelog): record migration and relay fixes
vincentkoc Jul 12, 2026
e33d43d
fix(credentials): persist staged lookup identity
vincentkoc Jul 12, 2026
52f1828
fix(macos): reconcile uncertain desktop publication
vincentkoc Jul 12, 2026
ebd81b7
fix(credentials): recover staged rotations idempotently
vincentkoc Jul 12, 2026
286e059
fix(macos): bound teardown input release retries
vincentkoc Jul 12, 2026
f9b06f7
fix(terminal): fence runner input generations
vincentkoc Jul 12, 2026
59e251c
fix(runtime): persist superseded workspace cleanup
vincentkoc Jul 12, 2026
6d0216c
docs(changelog): record final lifecycle hardening
vincentkoc Jul 12, 2026
aeb10c8
fix(desktop): recover publication ownership safely
vincentkoc Jul 12, 2026
b11b9b5
fix(macos): reconcile uncertain desktop publications
vincentkoc Jul 12, 2026
816dc73
fix(actions): fence relay runner generations
vincentkoc Jul 12, 2026
a7630a2
docs(actions): define generation-fenced relay protocol
vincentkoc Jul 12, 2026
10d912c
docs(changelog): record ownership race fixes
vincentkoc Jul 12, 2026
b907745
fix(api): reject malformed desktop recovery ids
vincentkoc Jul 12, 2026
8a4588a
docs(actions): align generation and recovery contracts
vincentkoc Jul 12, 2026
5d63e48
fix(actions): serialize runner input delivery
vincentkoc Jul 12, 2026
45270f4
fix(terminal): bound blocked attachment shutdown
vincentkoc Jul 12, 2026
25791a1
fix(macos): preserve legacy uncertain publications
vincentkoc Jul 12, 2026
351acb9
fix(actions): carry initial viewer generation
vincentkoc Jul 12, 2026
88664d6
docs(changelog): record final race fixes
vincentkoc Jul 12, 2026
c1f477b
fix(desktop): preserve idempotent publication recovery
vincentkoc Jul 12, 2026
f5f3bda
fix(actions): bound runner input delivery
vincentkoc Jul 12, 2026
c44c367
fix(terminal): serialize raw input acknowledgements
vincentkoc Jul 12, 2026
31e6983
docs(changelog): record protocol follow-up fixes
vincentkoc Jul 12, 2026
f543d27
docs(actions): restrict runner input to steering
vincentkoc Jul 12, 2026
66a2e5d
fix(terminal): fence retired attachment delivery
vincentkoc Jul 12, 2026
1907d7f
fix(actions): retire stale runner input queues
vincentkoc Jul 12, 2026
647ee25
fix(runtime): make cleanup deletion crash-idempotent
vincentkoc Jul 12, 2026
95b7390
fix(terminal): capture relay replacement during authorization
vincentkoc Jul 12, 2026
a89ba66
fix(actions): negotiate runner protocol explicitly
vincentkoc Jul 12, 2026
249751b
fix(macos): validate ARD Diffie-Hellman parameters
vincentkoc Jul 12, 2026
e85c048
fix(credentials): recover namespace rotation safely
vincentkoc Jul 12, 2026
6476c81
fix(macos): key publication cleanup by host ID
vincentkoc Jul 12, 2026
c9d055b
docs(changelog): record final audit fixes
vincentkoc Jul 12, 2026
6773dae
docs(actions): serialize negotiated steering example
vincentkoc Jul 12, 2026
490d07d
fix(desktop): require token publication identity
vincentkoc Jul 12, 2026
eefc11b
fix(terminal): report ambiguous steering timeouts
vincentkoc Jul 12, 2026
339e0dd
fix(macos): republish rotated desktop identities
vincentkoc Jul 12, 2026
1654b80
fix(runtime): persist idempotent cleanup deletes
vincentkoc Jul 12, 2026
160e393
docs(actions): harden runner input fallback
vincentkoc Jul 12, 2026
790f7cf
fix(runtime): require replayable delete tombstones
vincentkoc Jul 12, 2026
9ec7b69
docs(changelog): record final recovery contracts
vincentkoc Jul 12, 2026
55acdb5
test(docs): verify embedded spec generation
vincentkoc Jul 12, 2026
43e61bc
fix(credentials): fence staging claim renewal
vincentkoc Jul 12, 2026
54e7dd7
test(credentials): prove single claim ownership
vincentkoc Jul 12, 2026
e8d0075
fix(vnc): renegotiate pixel format encodings
vincentkoc Jul 12, 2026
a01a279
fix(terminal): harden input completion races
vincentkoc Jul 12, 2026
39495b6
fix(macos): persist desktop cleanup recovery
vincentkoc Jul 12, 2026
85f0976
fix(actions): retain runner generation authority
vincentkoc Jul 12, 2026
006757b
fix(credentials): preserve legacy lookup recovery
vincentkoc Jul 12, 2026
67de7e3
fix(vnc): synchronize encoding transitions
vincentkoc Jul 12, 2026
4877ee5
fix(macos): quiesce remote input teardown
vincentkoc Jul 12, 2026
3837413
fix(macos): scope desktop recovery authority
vincentkoc Jul 12, 2026
51c712b
docs(changelog): record final protocol fences
vincentkoc Jul 12, 2026
653df8f
fix(vnc): reject weak UltraVNC DH elements
vincentkoc Jul 12, 2026
a0bb61d
fix(macos): allow idle quit after recovery lookup failure
vincentkoc Jul 12, 2026
d74852c
fix(macos): terminate Tailscale process groups
vincentkoc Jul 12, 2026
e472f64
docs(changelog): record final teardown hardening
vincentkoc Jul 12, 2026
420acb6
test(assets): generate ignored fixtures before import
vincentkoc Jul 12, 2026
0b813a4
fix(terminal): keep viewer timeouts passive
vincentkoc Jul 12, 2026
e3b0e4b
docs(actions): fence queued runner steering
vincentkoc Jul 12, 2026
997d004
fix(vnc): reset ZRLE on pixel format changes
vincentkoc Jul 12, 2026
8a6a6da
fix(credentials): fence stale rollback recovery
vincentkoc Jul 12, 2026
f325326
docs(changelog): record final audit follow-up
vincentkoc Jul 12, 2026
d2347e5
fix(macos): harden share shutdown recovery
vincentkoc Jul 12, 2026
c971c6a
fix(http): classify body stream failures
vincentkoc Jul 12, 2026
d75e8c2
fix(app): preserve session grid terminals
vincentkoc Jul 12, 2026
12688ba
fix(credentials): fence final policy promotion
vincentkoc Jul 12, 2026
90259d7
fix(runtime): negotiate delete tombstones
vincentkoc Jul 12, 2026
2b9e2d4
fix(vnc): fail closed on probe timeout
vincentkoc Jul 12, 2026
d2f8b1e
docs(changelog): record review blocker fixes
vincentkoc Jul 12, 2026
dcbf92b
test(assets): serialize generated fixtures
vincentkoc Jul 12, 2026
ac74a0b
test(assets): avoid unsafe stale lock recovery
vincentkoc Jul 12, 2026
98a444b
test(assets): hold a crash-released generation lock
vincentkoc Jul 12, 2026
88c2c25
fix(terminal): preserve ambiguous input outcomes
vincentkoc Jul 12, 2026
73076ab
fix(credentials): preserve rollback recovery fences
vincentkoc Jul 12, 2026
44c6315
fix(vnc): validate ARD safe-prime groups
vincentkoc Jul 12, 2026
916a60c
fix(macos): complete ambiguous desktop cleanup
vincentkoc Jul 12, 2026
1bc9a2f
fix(database): surface desktop ownership conflicts
vincentkoc Jul 12, 2026
9f82340
docs(changelog): record final audit hardening
vincentkoc Jul 12, 2026
17447ab
fix(credentials): permit staged namespace retirement
vincentkoc Jul 12, 2026
4da3119
test(credentials): prove interrupted upgrade recovery
vincentkoc Jul 12, 2026
8569b6f
fix(terminal): preserve attachment handoff state
vincentkoc Jul 12, 2026
6bf5b19
fix(vnc): defer ZRLE reset for partial fences
vincentkoc Jul 12, 2026
92c0e93
docs(changelog): record final review fixes
vincentkoc Jul 12, 2026
414eb46
docs(api): clarify publication id contract
vincentkoc Jul 12, 2026
21f6e8f
fix(terminal): preserve disconnect delivery ambiguity
vincentkoc Jul 12, 2026
b1a358f
fix(terminal): mark post-write input ambiguity
vincentkoc Jul 12, 2026
af362b1
fix(desktop): reject legacy ownership conflicts
vincentkoc Jul 12, 2026
4cc0ce7
fix(macos): discard negative publication recovery
vincentkoc Jul 12, 2026
7b5bcd2
docs(changelog): record delivery and ownership fixes
vincentkoc Jul 12, 2026
4fa0be3
fix(terminal): preserve upstream delivery ambiguity
vincentkoc Jul 12, 2026
8dff7f1
fix(vnc): bound validated safe-prime cache
vincentkoc Jul 12, 2026
ed6b9e1
docs(changelog): record final cache and delivery fixes
vincentkoc Jul 12, 2026
41140f5
fix(credentials): preserve rotation recovery invariants
vincentkoc Jul 12, 2026
75f76bf
docs(changelog): record credential recovery invariants
vincentkoc Jul 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/deploy-crabbox-coordinator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
repository: openclaw/crabbox
ref: main
ref: ec073fdcf868b2d5c450d600d900cdf41f958de9 # crabbox main, 2026-07-11

- name: Set up Node
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
node_modules
src/spec.generated.ts
# Rebuilt from canonical sources by pnpm check/build/deploy; do not commit.
src/generated.ts
dist/
.wrangler/
Expand Down
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@

## Unreleased

- Resolve final audit blockers by preserving unknown GitHub Actions input outcomes across runner replacement, disconnect, upstream close or error, bounded PTY-write failure, and post-write confirmation loss, making terminal confirmation races prefer completed delivery, retiring terminal connections after late detached-writer failures, replaying control grants across attachment gaps, retaining rollback recovery and authorized namespace retirement after a staged credential write begins, reserving expired write-started credential rows for recovery, requiring active credential generations to match the exact current lookup set, proving interrupted pre-fence migration recovery, blocking session deletion while staged credential rows remain, validating ARD safe-prime groups and nonzero key material with bounded accepted-prime caching, deferring partial-fence ZRLE resets to a trailing synchronization boundary, rejecting legacy mutations and deletions of token-owned desktop registrations, discarding definitively unowned publication recovery without tokenless cleanup, documenting the opaque publication-ID contract, completing ambiguous legacy publication cleanup despite persistence failures, and holding generated-asset tests under a crash-released lock through module consumption.
- Close the final review blockers by requiring an exact live credential-policy lease at promotion, negotiating strict runtime-adapter deletion tombstones without breaking legacy `404` release semantics, disconnecting VNC sessions when pixel-format capability probes cannot establish a safe ZRLE boundary, classifying aborted JSON body streams as bad requests, and preserving live terminal subscriptions when browser history restores the sessions grid.
- Complete the final audit follow-up by fencing rollback against newer legacy credential generations, keeping viewer acknowledgement timeouts from detaching live GitHub Actions sessions, fencing queued documented-runner input after relay replacement, generating ignored embedded assets before parity tests import them, resetting ZRLE exactly at pixel-format boundaries, preventing delayed tokenless desktop cleanup from deleting replacement publishers, skipping idle recovery I/O when no local state exists, and stopping canceled auto-share preflight.
- Preserve upgrade and teardown authority by leaving pre-lookup-migration credential registrations recoverable from current and historical runtime identities, retaining GitHub Actions runner generations after queues drain, scoping Share This Mac recovery state to the normalized API origin and stable owner, allowing idle termination after unavailable recovery lookup while retaining active cleanup vetoes, terminating timed-out or canceled Tailscale descendant process groups, clearing only definitive failed publication intent, quiescing remote-input producers before final release, rejecting UltraVNC Diffie-Hellman elements at `p - 1`, and synchronizing complete RFB pixel-format and encoding transitions with protocol-required ZRLE resets.
- Finish the audited terminal, credential, runtime, and native-app lifecycle boundaries by explicitly negotiating the generation-fenced GitHub Actions runner protocol, retiring stale and overflowing runner input queues, capturing relay replacement during viewer authorization, fencing retired Go terminal attachments, repairing credential lookup namespaces with rollback-compatible staging, requiring replayable runtime-adapter deletion tombstones, validating Apple Remote Desktop Diffie-Hellman groups, keying desktop publication cleanup by the API host ID, and requiring exact retained identity before uncertain publication recovery; the runner guide now preserves raw fallback, bounds admission before serialized restricted steering, and distinguishes unknown delivery from rejection.
- Harden session lifecycle concurrency with atomic card claims and duplicate-first claim results, single-winner GitHub Actions credential rotation, monotonic exact authenticated-revision fences on runner writes, terminal session-status fences, revision-fenced lifecycle updates and grant revocation, exclusively claimed rollback recovery for Sandbox credential rotation, rejection of live legacy registration claims during migration without staging renewable legacy claims, staged-rotation fences that block legacy policy mutation while new-worker claims are live but release abandoned rows for rollback compatibility, persisted staged lookup identities across namespace changes with exact current-identity fallback for mixed-version rows, ownership-fenced repair of incomplete and rotated lookup sets before credential rotation, explicit retirement of obsolete durable identities, idempotent recovery after ambiguous committed promotion, R2-clean reservation rollback, preserved Sandbox attachment state, retained registration data for superseded runtime workspace cleanup, and durable observed-deletion markers that terminate cleanup after post-delete crashes.
- Close final terminal and desktop publication race windows by carrying the initial GitHub Actions runner generation through viewer authorization, translating generation-fenced acknowledgements for legacy framed viewers, serializing and bounding per-runner PTY input by frames, bytes, and age, matching generation-fenced local send failures, ordering raw and confirmed Go client acknowledgements, bounding shutdown when terminal writers block, rejecting malformed desktop recovery IDs as client errors, preserving idempotent publication retries across mixed worker versions, and retaining uncertain Share This Mac publications when older servers lack the recovery route.
- Make terminal input delivery durable across multiplex subscribers, apply backpressure until an attachment owns initial output while waking blocked readers to discard and acknowledge output for one-shot confirmed messages, retain pre-attach closure, prefer completed input over later transport shutdown, reject denied or unacknowledged input explicitly, prevent delivery into retired attachments and wait for their frame consumers even when input reads cannot be canceled, bound serialized browser input backlog by frame count and bytes while preserving one ordered completion per dropped frame, enforce relay-owned runner generations before forwarding GitHub Actions input and acknowledgements, snapshot SSH connection limits before launching handlers, make confirmation serialization cancelable, bound attachment confirmation waits, serialize every acknowledgement-aware input source and per-subscription completion event, wake uncancelable attachments when their context ends, retire connections after ambiguous confirmation timeouts, negotiate bounded one-shot input acknowledgements across rolling upgrades without waiting on empty payloads, keep configured HTTP timeouts from canceling established sockets, scope rejected writes without dropping live subscriptions, and send attributed commands atomically to prevent interleaving.
- Add connection-query-negotiated `CFR1` input, output, and acknowledgement frames across GitHub Actions runner and internal viewer relay boundaries, confirm viewer negotiation before leaving raw fallback during mixed deployments, document the independent legacy viewer fallback, buffer split UTF-8 within byte, frame, and age bounds until the string-only Node adapter delivers it to the PTY before acknowledging every contributing frame, define that adapter's UTF-8-only output contract while preserving opaque bytes for byte-oriented adapters, close the runner socket when its PTY exits, prevent binary PTY output from colliding with relay control frames, and keep multiplex dispatch responsive while framed input acknowledgements are pending.
- Preserve bounded opaque profile IDs for fixed runtime adapters while rejecting unroutable or ambiguous adapter routes only when provisioning depends on them, so mixed migration configuration cannot break unrelated control-plane reads; durably claim and retry superseded workspace cleanup without touching the replacement workspace; also reject malformed encoded session routes, numeric literals that become integers only after precision loss, and invalid-Unicode JSON event values, and reconcile browser history drawers and focus on back/forward navigation.
- Harden Share This Mac against stale starts and responses, canceled starts stranded in transition, self-connections, leaked subprocess environment, stalled Tailscale and RFB handshakes, successful commands whose descendants retain output pipes, stale desktop registrations including listener-failure, ambiguous committed publication reconciled by stable publication identity, and application-termination races with durably retained cleanup retries, legacy publishers mutating or deleting token-owned registrations, concurrent teardown calls that could outpace application termination, completed teardown operations coalescing a later stop, dropped auto-starts, stuck remote input including releases retained through revoked Accessibility trust and teardown with bounded retries and no retry when no input is held, and destructive non-text or empty clipboard changes while preserving repeated remote text, X11 Unicode input, proxy, custom-CA networking, and validated Crabbox config/state paths.
- Fence Share This Mac registry cleanup with explicitly negotiated per-registration ownership tokens, require a valid publication identity before selecting token ownership, and return the exact atomically written registration row so delayed or overlapping current publishers cannot displace cleanup authority, while preserving tokenless registration and cleanup for rolling upgrades with legacy clients or servers.
- Harden the bundled RoyalVNCKit fork across ARD and UltraVNC authentication and parameter validation, composed Unicode keysyms with legacy ASCII scalars, Tight and ZRLE parsing, non-trapping bounded zlib streams, RFB Fence-synchronized color-depth transitions with atomic capability publication, premature-response rejection, and fail-closed legacy handling, CopyRect, EOF handling, reconnects, credential cancellation and release after handoff, and cursor channel preservation.
- Pin Crabbox coordinator deployment to an immutable source revision and verify downloaded Crabbox release archives before image assembly, always enforcing the repository digest for the default version and requiring an explicit architecture checksum for non-default versions.
- Add a VideoToolbox-backed Open H.264 RFB pipeline for Share This Mac with up to 60 fps capture, adaptive 1.5–30 Mbit/s rate control, automatic Tight/JPEG fallback, live stream stats, larger resize limits, and a persisted host-enforced view-only mode.
- Exchange full UTF-8 clipboard text between the native Mac viewer, Share This Mac hosts, and any Extended Clipboard-capable VNC server by completing the RoyalVNCKit fork's extension stub, keeping Latin-1 cut text as the fallback and dropping malformed extension bodies without tearing down the connection.
- Add persisted send-only and receive-only clipboard directions to the native viewer's focus toolbar; automatic sync respects the direction while the explicit Send and Get actions keep working.
Expand Down
30 changes: 28 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ FROM docker.io/cloudflare/sandbox:0.10.1
USER root

ARG CRABBOX_VERSION=0.17.1
ARG CRABBOX_SHA256_AMD64=
ARG CRABBOX_SHA256_ARM64=

RUN set -eux; \
apt-get update; \
Expand Down Expand Up @@ -61,10 +63,34 @@ RUN set -eux; \

RUN set -eux; \
arch="$(dpkg --print-architecture)"; \
case "$arch" in amd64|arm64) ;; *) echo "unsupported arch: $arch" >&2; exit 1 ;; esac; \
case "$arch" in \
amd64) \
override_checksum="$CRABBOX_SHA256_AMD64"; \
checksum_arg="CRABBOX_SHA256_AMD64"; \
pinned_checksum="3c41839257e4622e28bcec8b0f0153f19d78d436fd548894a7c7d7726d922611" \
;; \
arm64) \
override_checksum="$CRABBOX_SHA256_ARM64"; \
checksum_arg="CRABBOX_SHA256_ARM64"; \
pinned_checksum="4bf87a0d2365441ee2f8cb34183cfd9ebeb065111697eb2d8dc867b3a627fdd2" \
;; \
*) echo "unsupported arch: $arch" >&2; exit 1 ;; \
esac; \
archive="crabbox_${CRABBOX_VERSION}_linux_${arch}.tar.gz"; \
if [ "$CRABBOX_VERSION" = "0.17.1" ]; then \
checksum="$pinned_checksum"; \
else \
checksum="$override_checksum"; \
if [ -z "$checksum" ]; then \
echo "an explicit $checksum_arg is required for non-default versions" >&2; \
exit 1; \
fi; \
fi; \
printf '%s\n' "$checksum" | grep -Eq '^[0-9a-f]{64}$'; \
curl -fsSL \
"https://github.com/openclaw/crabbox/releases/download/v${CRABBOX_VERSION}/crabbox_${CRABBOX_VERSION}_linux_${arch}.tar.gz" \
"https://github.com/openclaw/crabbox/releases/download/v${CRABBOX_VERSION}/${archive}" \
-o /tmp/crabbox.tar.gz; \
echo "$checksum /tmp/crabbox.tar.gz" | sha256sum -c -; \
tar -xzf /tmp/crabbox.tar.gz -C /usr/local/bin crabbox; \
chmod +x /usr/local/bin/crabbox; \
rm -f /tmp/crabbox.tar.gz; \
Expand Down
21 changes: 17 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,27 @@ Content-Type: application/json
{"workKey":"openclaw/crabfleet:pr:42","workKind":"pr_repair","repo":"openclaw/crabfleet","branch":"fix/pr-42","owner":"operator@example.test","sourceUrl":"https://github.com/openclaw/crabfleet/pull/42","runUrl":"https://github.com/openclaw/crabfleet/actions/runs/123","purpose":"repair PR 42","summary":"starting repair"}
```

The response contains `{session, agentToken, runnerPtyUrl, browserUrl}`. New registrations and resumes require `owner` to resolve to one active Crabfleet user; resumes must prove the same stable owner subject already recorded on the `workKey`. The stable subject owns browser visibility while the OpenClaw service retains lifecycle authority for its session. `runnerPtyUrl` includes the rotated session-scoped query credential and works directly with Node's global `WebSocket`:
The response contains `{session, agentToken, runnerPtyUrl, browserUrl}`. New registrations and resumes require `owner` to resolve to one active Crabfleet user; resumes must prove the same stable owner subject already recorded on the `workKey`. The stable subject owns browser visibility while the OpenClaw service retains lifecycle authority for its session. `runnerPtyUrl` includes the rotated session-scoped query credential and can be opened unchanged as the legacy raw duplex byte stream. New runners offer the framed protocol as a WebSocket subprotocol:

```js
const terminal = new WebSocket(runnerPtyUrl);
terminal.onmessage = (event) => process.stdout.write(Buffer.from(event.data));
process.stdin.on("data", (chunk) => terminal.send(chunk));
const terminal = new WebSocket(runnerPtyUrl, "cfr1-framed-io-v2");
terminal.binaryType = "arraybuffer";
terminal.addEventListener("open", () => {
const framed = terminal.protocol === "cfr1-framed-io-v2";
// Use CFR1 only when framed is true; otherwise retain raw compatibility.
});
```

Existing runners retain raw input and output by opening the returned URL
unchanged. A new runner opts into correlated binary `CFR1` input, output, and
acknowledgement frames only when the relay selects the
`cfr1-framed-io-v2` WebSocket subprotocol in the upgrade response. Relays that
ignore the offer leave `WebSocket.protocol` empty, so new runners retain raw
compatibility. The relay fences negotiated runner input with its connection
generation. Framed runners acknowledge only after their PTY accepts the input.
The complete byte-safe encoder, decoder, and Node PTY runner are in
[`docs/github-actions-sessions.md`](docs/github-actions-sessions.md#runner-pty).

The runner reports heartbeat and durable progress with bearer `agentToken` to `POST /api/agent/interactive-sessions/:id/work-state`. Terminal states are `completed`, `blocked`, `failed`, and `canceled`; active work uses `registered` or `running` plus a specific `phase`.

The full registration, relay, resumption, steering, heartbeat, completion,
Expand Down
Loading