feat: support opening html trace view - #811
Conversation
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai> # Conflicts: # packages/shared/src/index.ts # packages/worker-legacy/src/index.ts # packages/worker/src/index.ts
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai>
hi-ogawa
left a comment
There was a problem hiding this comment.
Actually there might be a big ergonomic issues with multiple test cases. This requires users to re-opening browser view for each test. 🤔
Ideally we should have a webview like playwright has for the best DX. I had a prototype for it, but never pushed |
Push that please 😃 |
Had to merge conflicts, not sure if it works: #818 The initial idea was to have it for settings, but we can enhance it. Feel free to use the code from there, I don't think I will finish it 😄 |
* feat: prototype reusable trace webview Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * refactor: simplify trace webview navigation Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * fix: preserve trace webview origin and allow Google Fonts Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * fix: select available traces when refreshing the report Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * fix: preserve trace step when refreshing the same test Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * docs: simplify trace view description Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * docs: remove trace webview prototype note Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> * fix: remove trace webview padding Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai> * fix: restore light trace background Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai> * feat: use focused trace layout Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai> * docs: update trace view screenshot Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai> * fix: preserve trace attempt on refresh Co-authored-by: OpenCode (gpt-5.6-sol) <noreply@opencode.ai> * refactor: extract trace webview HTML transform Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: build trace selection hash directly Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: remove trace metadata cache busting Co-authored-by: Codex (GPT-6) <noreply@openai.com> * docs: clarify trace metadata URL comment Co-authored-by: Codex (GPT-6) <noreply@openai.com> * docs: clarify trace asset URL comment Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: extract trace webview CSP string Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: inline webview CSP source Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: extract trace webview CSS string Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: extract trace webview bootstrap Co-authored-by: Codex (GPT-6) <noreply@openai.com> * nit * nit * refactor: reload webview when opening traces Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: name debounced trace refresh Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: simplify trace hash serialization Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: clarify trace view URL hash names Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: inline trace URL hash serialization Co-authored-by: Codex (GPT-6) <noreply@openai.com> * nit * refactor: separate trace reconciliation from refresh Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: reconcile trace target on results update Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: type trace selection message Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: type trace message receiver Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: remove trace message payload validation Co-authored-by: Codex (GPT-6) <noreply@openai.com> * nit * refactor: align trace selection message fields Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: follow latest trace report Co-authored-by: Codex (GPT-6) <noreply@openai.com> * fix: refresh trace reports from filesystem events Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: group active trace view state Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: simplify trace target updates Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: clarify trace view state naming Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: remove redundant trace target assignment Co-authored-by: Codex (GPT-6) <noreply@openai.com> * fix: restore latest trace target fallback Co-authored-by: Codex (GPT-6) <noreply@openai.com> * fix: select trace from latest run across processes Co-authored-by: Codex (GPT-6) <noreply@openai.com> * docs: explain trace view lifecycle steps Co-authored-by: Codex (GPT-6) <noreply@openai.com> * docs: clarify trace open action comments Co-authored-by: Codex (GPT-6) <noreply@openai.com> * fix: keep selected trace when still available Co-authored-by: Codex (GPT-6) <noreply@openai.com> * nit * refactor: use revision for stale trace loads Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: let report UI handle missing traces Co-authored-by: Codex (GPT-6) <noreply@openai.com> * refactor: narrow trace report read error handling Co-authored-by: Codex (GPT-6) <noreply@openai.com> * nit * nit * refactor: simplify trace message revision guard Co-authored-by: Codex (GPT-6) <noreply@openai.com> * docs: update trace view screenshot Co-authored-by: Codex (GPT-6) <noreply@openai.com> --------- Co-authored-by: hi-ogawa-agent <266689927+hi-ogawa-agent@users.noreply.github.com> Co-authored-by: OpenCode (gpt-6-astra) <noreply@opencode.ai> Co-authored-by: Hiroshi Ogawa <4232207+hi-ogawa@users.noreply.github.com> Co-authored-by: Codex (GPT-6) <noreply@openai.com>
This PR add per-test actions to open trace view focused layout of html report in an extension-managed webview. The webview tab is reused when switching tests and auto reselects/refreshes when the report is regenerated.
Screen.Recording.2026-09-08.at.19.36.03.mov