Skip to content

Sync upstream 2026-11-13 (508 commits) - #19

Merged
hjescalona merged 509 commits into
smgfrom
sync/upstream-20261113
Nov 13, 2026
Merged

hjescalona merged 509 commits into
smgfrom
sync/upstream-20261113

Conversation

@hjescalona

Copy link
Copy Markdown

Merges main (CapSoftware/Cap@f0d45b0) into smg.

Conflict resolved in favor of upstream: apps/web/app/(org)/dashboard/settings/organization/components/MembersCard.tsx. Upstream gave members their own settings tab and its own name and email search, which conflicts with our feat/members-table-search patch. This sync takes upstream's version and drops ours, along with lib/organization-members-table.ts, its tests and our lines in content/docs/teams.mdx. The role and status filters and column sorting go away. SMG.md records the drop, and CapSoftware/Cap#3919 gets closed.

Migrations: both are additive and only touch the Cap Infra developer tables, which this instance doesn't use.

  • 0054_developer_video_playback adds columns and indexes to developer_videos, and indexes to developer_credit_accounts and developer_credit_transactions.
  • 0055_developer_transcripts creates developer_transcripts.

A MySQL backup was taken before merging (cap-mysql-pre-0055-20261113T0103Z.sql.gz, 54 tables).

Media server: no route was added or removed in apps/media-server. The web's only new media-server caller (/video/ladder, developer video encodes) already exists on the pinned image, so the Cap Media Server digest stays as is.

Still carried on top of upstream: preview OG fallback (CapSoftware#3963), Google account linking (CapSoftware#3964), share unfurl AI summary, and the smg/ ops files. apps/web/Dockerfile is unchanged, so smg/web.Dockerfile needs no regeneration.

Upstream changes worth knowing after deploy:

  • Player quality, speed and volume controls.
  • Members and billing settings rebuilt (members in their own tab).
  • Cap Infra (developer API: transcripts, video encodes, credits). It's upstream's paid product and unused here.

xxxxxxxxxxxxx and others added 30 commits November 12, 2026 05:39
…-sdr

fix(media-server): convert HDR video to standard range before encoding
…r-page

fix: make developer video shareUrl and embedUrl open a real player page
…eo-page

# Conflicts:
#	apps/web/app/(infra)/dashboard/infra/[appId]/billing/top-up.tsx
…pi-contract

# Conflicts:
#	apps/web/__tests__/unit/developer-video-api.test.ts
#	apps/web/__tests__/unit/infra-billing-gates.test.ts
#	apps/web/lib/developer-openapi.ts
#	apps/web/lib/infra-video-upload.ts
…per-api-contract

fix: developer API errors, validation, idempotent delete and rate limit headers
Two transcripts that both needed a bigger hold each kept their first
hold while waiting, so neither request could fit and both failed after
the wait limit even when the balance covered one of them. A transcript
that has to wait for a raise now releases its own hold, which lets one
go first. No work runs while it waits, and it must hold again before
any.
…e-video-page

feat(web): watch, track and manage videos in the Cap Infra console
…ript-hold-first

fix(web): hold a transcript's credit before its source is downloaded or converted
… to the API

Adds a Play a Video section with a tested hls.js page, the Safari tag, URL lifetimes, the Content Security Policy hosts and what viewers get when playback stops. Brings errors, rate limits, pagination and the list, get, status and usage examples in line with what the API returns, documents the upload steps and their limits, and removes the SDK packages that are not published.
Replaces the old per-minute prices with the storage and transcription rates the code charges, and drops the webhook and SDK package claims.
A video counts in the lower of its maxResolutionTier and the tier of its source. Description text only.
…pt policy and a reload

The page now checks that hlsUrl and mp4Url exist before choosing a branch, falls back to the MP4 when the browser's own HLS player fails, and keeps the hls.js instance in scope so the reload function can reach it. The Content Security Policy section says how to allow the page's inline script.
… check the cleanup deadline before each abort
A public key could create videos and run the whole upload, guarded only by
the Origin header, which any client outside a browser can set. Anyone who
copied a key from a page could spend that app's storage credit.

POST /api/developer/v1/uploads (secret key) now creates the video and
returns a signed upload token bound to that one video, with an expiry and
an optional origin. The SDK upload routes accept only that token. Public
keys are refused across the SDK API and the browser create route is gone.
The recorder took a public key and created the video itself. It now takes
a createUpload function that asks the integrator's server for an upload,
then uploads the recording with the returned token. The React hook keeps
the current capture when createUpload is a new function and calls the
newest one.
…ack-guide

docs(web): add a playback guide and bring the developer API docs in line with the API
# Conflicts:
#	apps/web/content/docs/api/rest-api.mdx
…-cleanup-bounds

fix(web): keep one open upload per Cap Infra video and bound the upload cleanup
xxxxxxxxxxxxx and others added 25 commits November 12, 2026 18:10
With separate audio and video playlists the first buffered segment could be audio, so loading stopped before a frame was ready and the viewer waited after pressing play. Loading now stops once the first video segment and, when audio is separate, the first audio segment are buffered. The element's own preload is set to auto for streams, because the browser will not decode the first frame otherwise, and the stream engine's start-up seek no longer resumes loading.
…r-light-embed

fix(infra): light embeds, embed parameters and a neutral failed state
# Conflicts:
#	apps/web/components/cap-player/CapPlayer.tsx
#	apps/web/components/cap-player/player.module.css
#	apps/web/components/cap-player/source.ts
…surface

fix: consistent Cap Infra agent API answers and a console agent prompt that uses the REST API
A pick made before play is remembered and applied when playback starts, so it downloads nothing while the player is idle and is not undone by the return to automatic loading. The quality button shows the picked rendition immediately instead of waiting for the switch.
…button without a control bar

A time label that mounts while the video is paused now shows the current time instead of zero. With the control bar hidden, focusOnMount goes to the visible cover button rather than the hidden bar.
…controls

feat(web): add quality, speed and volume controls to the video player
…ty-ein-no-call

fix(web): save no EIN at checkout when there is nothing to change
…start

docs(web): add a Get Started guide for the Developer API
Upstream rewrote the organization members card (its own settings tab with
name and email search), which conflicted with feat/members-table-search.
Take upstream's MembersCard and docs and drop our table helper and its
tests; the patch ledger records the drop.
@hjescalona hjescalona added upstream-sync has-migrations migrations-approved A human reviewed the migrations and took a MySQL backup labels Nov 13, 2026
@hjescalona
hjescalona merged commit 2d7b56d into smg Nov 13, 2026
7 of 18 checks passed
@hjescalona
hjescalona deleted the sync/upstream-20261113 branch November 13, 2026 01:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

has-migrations migrations-approved A human reviewed the migrations and took a MySQL backup upstream-sync

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants