Skip to content

fix: authorize room invite previews through socket hosts - #25

Merged
chrisae9 merged 1 commit into
devfrom
codex/room-preview-authorization
Aug 7, 2026
Merged

fix: authorize room invite previews through socket hosts#25
chrisae9 merged 1 commit into
devfrom
codex/room-preview-authorization

Conversation

@chrisae9

@chrisae9 chrisae9 commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Summary

  • move room invite preview binding from the unauthenticated HTTP metadata endpoint to the current socket host
  • keep room preview state instance-local and update it correctly across join, media changes, host transfer, disconnect, and empty-room cleanup
  • validate preview identifiers against active media and reject malformed, unsafe, mismatched, or oversized socket payloads
  • serve revisioned room-poster snapshots so already-shared invite cards remain stable while current room metadata changes
  • add frontend and end-to-end coverage for host-only binding, host promotion, auto-host changes, stale snapshots, and invalid input

Verification

  • npm ci
  • npm run lint
  • npm test — 162 Node tests and 242 Vitest tests passed
  • npm audit --audit-level=high — 0 vulnerabilities
  • focused authorization suite — 116/116 passed
  • independent security review findings addressed: snapshot deduplication/isolation, honest cache headers, and URL-safe room IDs

Review notes

This is intentionally based on dev, after the Babel 8 and ESLint 9 migrations. The previous HTTP room field is ignored for room binding; only the server callback from the current socket host can select invite metadata.

CodeRabbit is installed on the repository. Its recent checks have been rate-limited, so a green status without review text should not be interpreted as a substantive review; the PR will remain draft until required CI and an independent review complete.

Summary by CodeRabbit

  • New Features
    • Added synchronized room media previews and poster images during playback.
    • Room previews now follow host changes and are cleared when playback stops or rooms become empty.
    • Added revisioned room-poster links for invite previews and reliable poster retrieval.
  • Improvements
    • Added poster metadata caching with expiration, capacity limits, and stale-data protection.
    • Improved validation for preview details, room identifiers, and poster URLs.
  • Bug Fixes
    • Prevented outdated or unauthorized room preview metadata from being displayed.
    • Improved handling of poster failures, invalid data, disconnects, and host transfers.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@chrisae9, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 32 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 99a58d2d-6504-4a5f-994a-a607a9818381

📥 Commits

Reviewing files that changed from the base of the PR and between e4eb5b5 and 140e832.

📒 Files selected for processing (15)
  • cache.js
  • packages/syncloungeserver/src/socketserver/handlers.js
  • packages/syncloungeserver/src/socketserver/index.js
  • packages/syncloungeserver/src/socketserver/state.js
  • packages/syncloungeserver/src/socketserver/validation.js
  • server.js
  • src/__tests__/plexclients-room-preview.test.js
  • src/__tests__/synclounge-actions.test.js
  • src/store/modules/plexclients/actions.js
  • src/store/modules/plexclients/getters.js
  • src/store/modules/synclounge/actions.js
  • src/views/PlexMedia.vue
  • test/cache.test.js
  • test/room-preview-authorization.test.js
  • test/server.test.js
📝 Walkthrough

Walkthrough

The client sends validated room previews with media updates. Socket handlers track previews by socket and host. The server stores revisioned poster metadata, serves poster proxies, removes stale snapshots, and updates invite metadata. Tests cover lifecycle, authorization, caching, and routes.

Changes

Room preview synchronization

Layer / File(s) Summary
Client preview construction
src/store/modules/plexclients/*, src/store/modules/synclounge/actions.js, src/views/PlexMedia.vue, src/__tests__/*
The client builds bounded room previews, sends them during joins and media updates, omits room data from metadata requests, and clears previews when playback stops.
Socket preview state and validation
packages/syncloungeserver/src/socketserver/{state,validation,handlers,index}.js, test/room-preview-authorization.test.js
Socket state stores previews per socket. Join and media-update payloads validate preview fields. Host changes, disconnects, and stopped playback update room preview callbacks.
Revisioned poster metadata and proxy
cache.js, server.js
The server uses revisioned room-poster keys, bounded TTL caching, and metadata deletion. Host updates store room snapshots, and a shared proxy serves revisioned posters.
Cache and route coverage
test/cache.test.js, test/server.test.js, test/room-preview-authorization.test.js
Tests cover cache behavior, preview ownership, host transfers, disconnect cleanup, invalid metadata, poster retrieval, and room-route metadata behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: authorizing room invite previews through socket hosts.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/room-preview-authorization

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/syncloungeserver/src/socketserver/validation.js`:
- Around line 46-62: Update assertOptionalMetadataScalar and
assertOptionalMetadataIndex to enforce bounded numeric metadata: validate year
as a non-negative safe integer within the allowed year range, and require
numeric indices to use the same maximum bound as the existing 1–12 digit string
validation. Preserve null/undefined handling and existing rejection messages or
schema behavior.
- Line 98: Update the room preview validation around assertOptionalString and
fetchPoster so posterUrl is resolved only through the configured Plex origin
associated with roomPreview.machineIdentifier; reject URLs whose origin does not
match that machine before fetching. Preserve valid matching-origin posters and
add a Socket.IO regression test covering a mismatched public origin.

In `@server.js`:
- Around line 449-464: Update onRoomMediaUpdate to bound retained room preview
revision snapshots independently from the shared metadata cache, while
preserving the immediately previous revision for authorization. Track recent
revision keys per room, delete the oldest snapshot when the configured small
limit is exceeded, clean up tracking when previews are cleared, and add a
regression test emitting many updates that verifies a previously cached
/api/metadata entry still resolves.

In `@src/__tests__/plexclients-room-preview.test.js`:
- Around line 20-23: Update the 'plexservers/GET_MEDIA_IMAGE_URL' mock to record
the getter arguments, then assert that the request includes both width: 600 and
height: 900. Preserve the existing URL behavior while ensuring the test verifies
the externally requested image dimensions.

In `@src/store/modules/plexclients/getters.js`:
- Around line 42-53: The Plex metadata preview copies unbounded fields that can
violate the socket validation schema. In
src/store/modules/plexclients/getters.js lines 42-53, update the room-preview
getter to truncate or omit every preview field whose server schema type or
length limit may be exceeded, especially the summary, while preserving valid
metadata. In src/__tests__/plexclients-room-preview.test.js lines 5-38, add
boundary cases with over-limit metadata and assert the generated preview remains
valid against the socket schema.

In `@test/room-preview-authorization.test.js`:
- Around line 203-216: Drain the child process stdout created by the
serverProcess spawn configuration. Update the stdio handling adjacent to
serverProcess.stderr.on so stdout is either forwarded to process.stdout or
explicitly discarded, ensuring server.js output cannot fill the pipe and block
the test suite.

In `@test/server.test.js`:
- Around line 754-756: Add a failure-path test in the existing HTTP server test
suite for the `/share/room-poster/:room/:revision` route, requesting an unknown
room and revision and asserting that the response status is 404.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f5a1bf8a-953a-4082-b289-2062555d6d44

📥 Commits

Reviewing files that changed from the base of the PR and between e4eb5b5 and e6e935f.

📒 Files selected for processing (15)
  • cache.js
  • packages/syncloungeserver/src/socketserver/handlers.js
  • packages/syncloungeserver/src/socketserver/index.js
  • packages/syncloungeserver/src/socketserver/state.js
  • packages/syncloungeserver/src/socketserver/validation.js
  • server.js
  • src/__tests__/plexclients-room-preview.test.js
  • src/__tests__/synclounge-actions.test.js
  • src/store/modules/plexclients/actions.js
  • src/store/modules/plexclients/getters.js
  • src/store/modules/synclounge/actions.js
  • src/views/PlexMedia.vue
  • test/cache.test.js
  • test/room-preview-authorization.test.js
  • test/server.test.js
💤 Files with no reviewable changes (1)
  • src/views/PlexMedia.vue

Comment thread packages/syncloungeserver/src/socketserver/validation.js Outdated
Comment thread packages/syncloungeserver/src/socketserver/validation.js
Comment thread server.js
Comment thread src/__tests__/plexclients-room-preview.test.js Outdated
Comment thread src/store/modules/plexclients/getters.js
Comment thread test/room-preview-authorization.test.js
Comment thread test/server.test.js
@chrisae9
chrisae9 force-pushed the codex/room-preview-authorization branch 2 times, most recently from 696b012 to 16d74f0 Compare August 7, 2026 03:52
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@chrisae9
chrisae9 marked this pull request as ready for review August 7, 2026 03:53

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (5)
src/__tests__/plexclients-room-preview.test.js (1)

20-23: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Assert the requested poster height.

The mock output uses options.width only. A change to height: 900 would still pass this test. Record the getter arguments and assert both requested dimensions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/__tests__/plexclients-room-preview.test.js` around lines 20 - 23, Update
the GET_MEDIA_IMAGE_URL mock in the room preview test to record its received
options, then assert that both width and height match the requested poster
dimensions, including height 900. Ensure the mock output remains based on the
recorded arguments.

Source: Path instructions

packages/syncloungeserver/src/socketserver/validation.js (1)

55-70: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Apply the same numeric bounds to both representations.

Line 58 accepts negative and fractional year values. Line 66 accepts numeric indices above the twelve-digit string limit. Require a bounded non-negative integer year. Cap numeric indices at 999999999999.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/syncloungeserver/src/socketserver/validation.js` around lines 55 -
70, Update assertOptionalMetadataScalar to validate year values as bounded
non-negative integers, applying the same constraints to numeric and string
representations as appropriate. Update assertOptionalMetadataIndex so numeric
values are non-negative safe integers no greater than 999999999999, matching the
existing twelve-digit string limit.

Source: Path instructions

src/store/modules/plexclients/getters.js (1)

42-53: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Keep room previews within the Socket.IO schema limits.

The getter copies raw Plex metadata. Server validation rejects over-limit fields and disconnects the socket. Long valid Plex metadata can therefore disconnect a client during join or mediaUpdate.

  • src/store/modules/plexclients/getters.js#L42-L53: bound optional display fields before emission. If required identifiers or the generated URL exceed protocol limits, omit the preview instead of changing identifiers independently from media.
  • src/__tests__/plexclients-room-preview.test.js#L5-L38: add 500-character and over-limit cases. Assert that generated previews remain within the socket schema or become null.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/store/modules/plexclients/getters.js` around lines 42 - 53, Bound
optional display fields in the room-preview getter around the returned metadata
object, while preserving required identifiers and the generated poster URL
consistently with media; if any required identifier or URL exceeds the Socket.IO
schema limits, return null for the entire preview rather than partially changing
identifiers. In src/store/modules/plexclients/getters.js lines 42-53, apply the
schema limits before emission. In src/__tests__/plexclients-room-preview.test.js
lines 5-38, add 500-character and over-limit cases asserting previews remain
schema-valid or become null.

Source: Path instructions

test/room-preview-authorization.test.js (1)

203-216: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Drain or discard the child stdout pipe.

Line 214 sets stdio: 'pipe', so the child receives a pipe for stdout. Line 216 consumes only stderr. Nothing reads serverProcess.stdout in the current code.

server.js logs publicAppConfig at startup, and the socket handlers log on every join, room creation, and host transfer. This suite creates several rooms and many sockets. If the child fills the pipe buffer, its next write blocks and the suite hangs until the test timeout.

Forward stdout like stderr, or set stdout to ignore.

🛠️ Proposed fix
-      stdio: 'pipe',
+      stdio: ['ignore', 'ignore', 'pipe'],
     });
     serverProcess.stderr.on('data', (data) => process.stderr.write(data));

As per path instructions, tests must "cleanup spawned resources" and "avoid timing flakiness".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/room-preview-authorization.test.js` around lines 203 - 216, Update the
child-process setup around serverProcess and its stdio configuration to consume
or discard stdout, preventing the pipe from filling during room and socket
activity. Either forward serverProcess.stdout through process.stdout alongside
the existing stderr handler or set stdout to ignore, while preserving the test’s
spawned-resource cleanup and timing behavior.

Source: Path instructions

test/server.test.js (1)

754-756: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a failure-path test for an unknown room poster revision.

The /share/room-poster/:room/:revision route still has no cache-miss coverage in this suite. proxyPoster returns 404 when meta is null. Request an arbitrary room and revision and assert 404. This suite already runs the server over HTTP, so the test needs no socket setup.

💚 Suggested test
it('returns 404 for an unknown room poster revision', async () => {
  const res = await request('/share/room-poster/no-such-room/no-such-revision');
  assert.equal(res.status, 404);
});

As per path instructions, server.js requires "tests for failure paths".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/server.test.js` around lines 754 - 756, Add a failure-path test in the
existing HTTP server test suite that requests an arbitrary unknown room and
revision through `/share/room-poster/:room/:revision`, then assert the response
status is 404. Use the suite’s existing `request` helper and test style; no
socket setup or production changes are needed.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@server.js`:
- Around line 47-63: Update the createCache call that initializes
setRoomPosterMetadata and getRoomPosterMetadata to include an explicit shorter
ttlMs of a few hours while preserving ROOM_POSTER_CACHE_MAX_SIZE. Leave the
general metadata cache and poster path behavior unchanged.

In `@test/cache.test.js`:
- Around line 122-133: Add a test near the existing createCache size coverage
that asserts createCache throws TypeError for invalid maxSize values of 0 and
1.5, and invalid ttlMs values of -1 and NaN, covering malformed and boundary
inputs.

In `@test/room-preview-authorization.test.js`:
- Around line 293-308: Replace the immediate getJoinHtml call after awaiting
guestSawTransfer with the existing waitForJoinHtml helper, using the room
identifier and expected transferred-host preview state. Keep the subsequent
guest HTML, poster, and retained host poster assertions unchanged.

---

Duplicate comments:
In `@packages/syncloungeserver/src/socketserver/validation.js`:
- Around line 55-70: Update assertOptionalMetadataScalar to validate year values
as bounded non-negative integers, applying the same constraints to numeric and
string representations as appropriate. Update assertOptionalMetadataIndex so
numeric values are non-negative safe integers no greater than 999999999999,
matching the existing twelve-digit string limit.

In `@src/__tests__/plexclients-room-preview.test.js`:
- Around line 20-23: Update the GET_MEDIA_IMAGE_URL mock in the room preview
test to record its received options, then assert that both width and height
match the requested poster dimensions, including height 900. Ensure the mock
output remains based on the recorded arguments.

In `@src/store/modules/plexclients/getters.js`:
- Around line 42-53: Bound optional display fields in the room-preview getter
around the returned metadata object, while preserving required identifiers and
the generated poster URL consistently with media; if any required identifier or
URL exceeds the Socket.IO schema limits, return null for the entire preview
rather than partially changing identifiers. In
src/store/modules/plexclients/getters.js lines 42-53, apply the schema limits
before emission. In src/__tests__/plexclients-room-preview.test.js lines 5-38,
add 500-character and over-limit cases asserting previews remain schema-valid or
become null.

In `@test/room-preview-authorization.test.js`:
- Around line 203-216: Update the child-process setup around serverProcess and
its stdio configuration to consume or discard stdout, preventing the pipe from
filling during room and socket activity. Either forward serverProcess.stdout
through process.stdout alongside the existing stderr handler or set stdout to
ignore, while preserving the test’s spawned-resource cleanup and timing
behavior.

In `@test/server.test.js`:
- Around line 754-756: Add a failure-path test in the existing HTTP server test
suite that requests an arbitrary unknown room and revision through
`/share/room-poster/:room/:revision`, then assert the response status is 404.
Use the suite’s existing `request` helper and test style; no socket setup or
production changes are needed.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8d3677aa-0fcd-4948-9587-6ff233e0aa20

📥 Commits

Reviewing files that changed from the base of the PR and between e4eb5b5 and 16d74f0.

📒 Files selected for processing (15)
  • cache.js
  • packages/syncloungeserver/src/socketserver/handlers.js
  • packages/syncloungeserver/src/socketserver/index.js
  • packages/syncloungeserver/src/socketserver/state.js
  • packages/syncloungeserver/src/socketserver/validation.js
  • server.js
  • src/__tests__/plexclients-room-preview.test.js
  • src/__tests__/synclounge-actions.test.js
  • src/store/modules/plexclients/actions.js
  • src/store/modules/plexclients/getters.js
  • src/store/modules/synclounge/actions.js
  • src/views/PlexMedia.vue
  • test/cache.test.js
  • test/room-preview-authorization.test.js
  • test/server.test.js
💤 Files with no reviewable changes (1)
  • src/views/PlexMedia.vue

Comment thread server.js Outdated
Comment thread test/cache.test.js
Comment thread test/room-preview-authorization.test.js
@chrisae9
chrisae9 force-pushed the codex/room-preview-authorization branch 2 times, most recently from 3b49af4 to a026959 Compare August 7, 2026 04:06
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/__tests__/plexclients-room-preview.test.js`:
- Around line 104-117: Add a test alongside the existing schema-length case
using an unpaired UTF-16 surrogate in either metadata.machineIdentifier or
metadata.ratingKey, then assert GET_ACTIVE_MEDIA_ROOM_PREVIEW returns null with
the same getter setup. Keep the test focused on malformed Unicode metadata
reaching neither join nor mediaUpdate.

In `@test/room-preview-authorization.test.js`:
- Around line 429-455: Rename the test case around its existing
socket.emit('mediaUpdate', playerUpdate(...)) flow to state that it disconnects
clients submitting unknown room preview properties, replacing the inaccurate
“unbounded room preview fields” wording. Leave the test behavior and assertions
unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 17dd3ba8-8cbc-4dd8-8bbd-61a175567f87

📥 Commits

Reviewing files that changed from the base of the PR and between e4eb5b5 and a026959.

📒 Files selected for processing (15)
  • cache.js
  • packages/syncloungeserver/src/socketserver/handlers.js
  • packages/syncloungeserver/src/socketserver/index.js
  • packages/syncloungeserver/src/socketserver/state.js
  • packages/syncloungeserver/src/socketserver/validation.js
  • server.js
  • src/__tests__/plexclients-room-preview.test.js
  • src/__tests__/synclounge-actions.test.js
  • src/store/modules/plexclients/actions.js
  • src/store/modules/plexclients/getters.js
  • src/store/modules/synclounge/actions.js
  • src/views/PlexMedia.vue
  • test/cache.test.js
  • test/room-preview-authorization.test.js
  • test/server.test.js
💤 Files with no reviewable changes (1)
  • src/views/PlexMedia.vue

Comment thread src/__tests__/plexclients-room-preview.test.js
Comment thread test/room-preview-authorization.test.js Outdated
@chrisae9
chrisae9 force-pushed the codex/room-preview-authorization branch from a026959 to 140e832 Compare August 7, 2026 04:10
@chrisae9
chrisae9 merged commit ffd64fc into dev Aug 7, 2026
9 checks passed
@chrisae9
chrisae9 deleted the codex/room-preview-authorization branch August 7, 2026 04:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant