HTML file preview in the integrated browser 404s relative video and audio assets
メンテナーはふだん 1 日以内に返信
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 18/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- html, nodejs, typescript
調査の方向性
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.
索引モデルが issue の本文から書いたものです。
説明
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
- 主要言語
- TypeScript
- スター
- 24.8k
- フォーク
- 6.4k
- 平均マージ
- 59分
- マージ済み PR(30日)
- 418
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
pingdotgg/t3code のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 1 日以内に返信
-
via-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 半日 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信
-
Question card options show LaTeX as raw source, though the question text renders it対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
メンテナーはふだん 1 日以内に返信
-
[Bug]: Settings inheritance popover shows raw slugs for branch naming, default permissions and response streaming対応中かも @juliusmarminge が 1 日前に担当しました。 オープンvouch:denounced
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 1 日以内に返信
pingdotgg/t3code の issue をすべて見る
似ている issue
-
bug platform:mobile root-cause:found
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
openchamber/openchamber#6926 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
push-based/user-flow#356 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
Cygnux-Labs/Tracekit#827 ·
メンテナーはふだん 1 日以内に返信
-
www build: a refused import shows only "ENOENT scandir <outDir>", never the build-audience errorオープンkind:defect
難易度 1/5 1時間未満 初心者へのやさしさ 91/100
メンテナーはふだん 1 日以内に返信
-
type:bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
nightgauge/nightgauge#3266 ·
メンテナーはふだん 1 日以内に返信