HTML file preview in the integrated browser 404s relative video and audio assets
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 18/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- html, nodejs, typescript
Piste de recherche
Start in apps/server/src/assets/AssetAccess.ts at PREVIEW_ASSET_EXTENSIONS and the resolveAsset() extension check, which returns null for .mp4, .webm, .m4v and .mp3. The media MIME inference in packages/shared/src/video.ts and range support in assetFileResponse already exist. Done means a relative video or audio request under a workspace-file grant returns 200 with range support. A linked pull request (#36199) is already open against this, so it is not a free first pick.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
What happened
An agent wrote a local gallery page (index.html next to clips/*.mp4) and linked it from a thread. Clicking the link opens it in the integrated browser. The page shell renders, but every video is empty and each video request returns 404.
The page is served at /api/assets//index.html, so each relative resolves to /api/assets//clips/foo.mp4, which 404s. The token is intact and correctly scoped to the page's folder; only media file types are refused.
Diagnosis
For a workspace HTML entry, AssetAccess issues a folder-scoped "workspace-file" grant (baseRelativePath = path.dirname(page)) and lets the page load dependency files under the same signed token. Dependencies are gated by PREVIEW_ASSET_EXTENSIONS in apps/server/src/assets/AssetAccess.ts: browser-preview types (.html/.htm/.pdf), images (.avif/.gif/.ico/.jpeg/.jpg/.png/.svg/.webp), .css, .js, .mjs and fonts.
.mp4/.webm/.m4v/.mp3 are not in that set, so resolveAsset() returns null at the extension check and the HTTP route answers 404 Not Found. MIME inference already exists (packages/shared/src/video.ts, hostPreviewMimeTypeFromExtension) and range requests are already supported by assetFileResponse, so the allowlist is the only blocker.
The same allowlist is still on main today, so this is not fixed in a newer build. Closest issue is #26902, but that one is about the token segment being stripped by ../ path normalization; here the token is intact and the extension gate rejects the request.
Steps to reproduce
- In a project, create:
site/index.html ->
site/clips/clip.mp4 - From a thread whose cwd is that project, open site/index.html in the integrated browser (click a link to its absolute path, or "Open in Browser").
- The page renders at /api/assets//index.html, but GET /api/assets//clips/clip.mp4 returns 404. A sibling relative .jpg in the same folder returns 200, so the grant and relative resolution are fine.
Same for audio.
Version
0.1.7
Environment
Client: T3 Code Desktop 0.1.7 on Windows. Server: T3 Code 0.1.7 on Linux (WSL2, 6.18 kernel), Node v26.12.1, started as t3 serve; desktop app connected to that server. Preview: integrated browser.
Evidence
Requests replayed against the running 0.1.7 server with the token from the preview page:
GET /api/assets/<token>/index.html 200 text/html; charset=utf-8
GET /api/assets/<token>/sheet/contact.jpg 200 image/jpeg
GET /api/assets/<token>/clips/aquatic-p5-60fps.mp4 404 text/plain
The token decodes to {"kind":"workspace-file","workspaceRoot":"<worktree>","baseRelativePath":"dev/record/.work/proto60"}, and the .mp4 exists at that path.
apps/server/src/assets/AssetAccess.ts (v0.1.7):
const PREVIEW_ASSET_EXTENSIONS = new Set([
...WORKSPACE_BROWSER_PREVIEW_EXTENSIONS,
".avif", ".gif", ".ico", ".jpeg", ".jpg", ".png", ".svg", ".webp",
".css", ".js", ".mjs", ".otf", ".ttf", ".woff", ".woff2",
]);
...
if (!PREVIEW_ASSET_EXTENSIONS.has(path.extname(decodedPath).toLowerCase())) return null;
No trace line is left for the 404: asset requests are excluded from tracing on purpose (http.ts, UNTRACED_REQUEST_PATHS).
Related issues
#26902 (HTML previews don't load ../ relative resources; same resolution code, different cause). #20887 (closed; mobile file tree relative links /api/assets 404). #32898 (server browser opens /api/assets on the client's origin; different). Not duplicates.
Fix applied or workaround
Serve the folder over HTTP and open that URL in the preview panel:
python3 -m http.server 8123 --bind 127.0.0.1
http://127.0.0.1:8123/index.html
Relative paths then resolve as normal web paths. Opening one clip's own link in chat also still plays it.
Filed by
DeepSeek V4.1 Flash via opencode, t3 triage
- Langage dominant
- TypeScript
- Étoiles
- 24.8k
- Forks
- 6.4k
- Merge moyen
- 59 min
- PR mergées (30 j)
- 418
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de pingdotgg/t3code
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
Les mainteneurs répondent en général sous 1 jour
-
via-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: MCP App inline frames never go below 80px, so compact apps get blank space under themOuverte
Difficulté 2/5 Une demi-journée Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
Question card options show LaTeX as raw source, though the question text renders itPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: Settings inheritance popover shows raw slugs for branch naming, default permissions and response streamingPeut-être pris @juliusmarminge l’a pris il y a 1 jour. Ouvertevouch:denounced
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de pingdotgg/t3code
Issues similaires
-
skill fork: kickoff message "Run the X skill now" makes the child call the skill tool on itselfOuvertearea: skills bug priority: medium
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
griffinwork40/agent-afk#4874 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
paperclipai/paperclip#21503 ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug] List: the reorder hint's Move up stays enabled on the first row, and Move down on the lastOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
-
Blocklist addition requestOuverteblocklist addition
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
MetaMask/eth-phishing-detect#312343 ·
Les mainteneurs répondent en général sous 1 jour
-
packages:player
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour