HTML file preview in the integrated browser 404s relative video and audio assets
Mantenedores costumam responder em até 1 dia
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 18/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- html, nodejs, typescript
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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
- Linguagem predominante
- TypeScript
- Estrelas
- 24.8k
- Forks
- 6.4k
- Merge médio
- 59min
- PRs com merge (30d)
- 418
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de pingdotgg/t3code
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
Mantenedores costumam responder em até 1 dia
-
via-triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 Meio dia Facilidade para iniciantes 68/100
Mantenedores costumam responder em até 1 dia
-
Question card options show LaTeX as raw source, though the question text renders itTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
Mantenedores costumam responder em até 1 dia
-
[Bug]: Settings inheritance popover shows raw slugs for branch naming, default permissions and response streamingTalvez já em andamento @juliusmarminge assumiu há 1 dia. Abertavouch:denounced
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
Todas as issues de pingdotgg/t3code
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
pieterjanscheir/belgica#201 ·
Mantenedores costumam responder em até 1 dia
-
accessibility
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
numerique-gouv/lasuite-landingpage#311 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
oxc-project/tsgolint#1362 ·
Mantenedores costumam responder em até 1 dia
-
bug external xai
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
langchain-ai/langchain#41854 ·
Mantenedores costumam responder em até 1 dia
-
ready-for-agent
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 72/100
nemchik/biome-plugin-suitescript#137 ·
Mantenedores costumam responder em até 1 dia