feat(diagnostics): the debug recorder — start, the pill, steps, screenshots, stop (E16 S2)

- the start dialog is the consent: level (Részletes/Teljes), what is recorded,
  retention and the cap (now served as diagnostics.session_minutes)
- the pill docks under the toasts: elapsed time, Step (an optional label,
  its own Escape layer), Screenshot (tab capture where the browser has it),
  Stop; compact on a phone
- while recording, lib/log tags every event and every request path (req,
  beacon, uploadReq via one identityHeaders) names the session; applyDiagnostics
  raises the level for the session's run and never lowers a raised one, and
  lapses at whichever ends first
- Stop sends what is waiting before the server closes the session; the cap
  says so and opens the composer
- Settings → Diagnosztika and the command palette start/step/stop it
- the evidence leaves the log upload's own request lines out
- the step shortcut is deliberately palette-only: the keymap's D1 rule bars a
  new modifier chord, and a bare letter collides with the players'
This commit is contained in:
2026-09-19 22:08:10 +02:00
parent 2d9595b0e5
commit 46fce4a767
26 changed files with 1347 additions and 89 deletions
@@ -0,0 +1,47 @@
{
"start": {
"title": "Debug session",
"intro": "Start it, go through whatever breaks, then stop it. You get a draft bug report with the log attached, and you can review everything before it is sent.",
"level": "Detail",
"whatTitle": "What it records",
"what": {
"DEBUG": "Page changes, requests and errors, which button, filter and player control you use, and the filters' values.",
"TRACE": "Page changes, requests and errors, which button, filter and player control you use, the filters' values, and what you type into search."
},
"kept_one": "The server keeps it for {{count}} day.",
"kept_other": "The server keeps it for {{count}} days.",
"cap_one": "It runs for {{count}} minute at most, then stops on its own. When it stops, your previous log level is back.",
"cap_other": "It runs for {{count}} minutes at most, then stops on its own. When it stops, your previous log level is back.",
"confirm": "Start recording",
"failed": "Couldn't start recording"
},
"pill": {
"label": "Debug recording",
"recording": "Recording · {{time}}",
"step": "Step",
"screenshot": "Screenshot",
"stop": "Stop",
"stepPrompt": "Step {{n}} — what did you just do? (optional)",
"stepHint": "Enter: mark · Esc: cancel",
"mark": "Mark",
"stepMarked": "Step {{n}} marked",
"shotSaved": "Screenshot saved",
"shotFailed": "Couldn't save the screenshot",
"stopFailed": "Couldn't stop recording",
"stopped": "Recording stopped",
"expired_one": "The recording reached its {{count}}-minute limit and stopped.",
"expired_other": "The recording reached its {{count}}-minute limit and stopped."
},
"settings": {
"title": "Debug session",
"hint": "When something breaks: start recording, go through it again, then stop. A draft bug report is made from the log.",
"start": "Start recording",
"recording": "Recording · {{time}}",
"stop": "Stop"
},
"palette": {
"start": "Start a debug recording",
"step": "Mark a step in the recording",
"stop": "Stop the debug recording"
}
}
@@ -0,0 +1,47 @@
{
"start": {
"title": "Hibakereső munkamenet",
"intro": "Indítsd el, csináld végig, ami elromlik, aztán állítsd le. A végén hibajegy-vázlatot kapsz a naplóval együtt, és elküldés előtt mindent átnézhetsz.",
"level": "Részletesség",
"whatTitle": "Mit rögzít",
"what": {
"DEBUG": "Az oldalváltásokat, a kéréseket és a hibákat, melyik gombot, szűrőt és lejátszóvezérlőt használod, és a szűrők értékeit.",
"TRACE": "Az oldalváltásokat, a kéréseket és a hibákat, melyik gombot, szűrőt és lejátszóvezérlőt használod, a szűrők értékeit, és a keresőbe beírt szöveget is."
},
"kept_one": "A szerver {{count}} napig őrzi.",
"kept_other": "A szerver {{count}} napig őrzi.",
"cap_one": "Legfeljebb {{count}} percig fut, utána magától leáll. Leállítás után a korábbi naplózási szinted áll vissza.",
"cap_other": "Legfeljebb {{count}} percig fut, utána magától leáll. Leállítás után a korábbi naplózási szinted áll vissza.",
"confirm": "Rögzítés indítása",
"failed": "Nem sikerült elindítani a rögzítést"
},
"pill": {
"label": "Hibakereső rögzítés",
"recording": "Rögzítés · {{time}}",
"step": "Lépés",
"screenshot": "Képernyőkép",
"stop": "Leállítás",
"stepPrompt": "{{n}}. lépés — mit csináltál most? (nem kötelező)",
"stepHint": "Enter: megjelöl · Esc: mégse",
"mark": "Megjelöl",
"stepMarked": "{{n}}. lépés megjelölve",
"shotSaved": "Képernyőkép elmentve",
"shotFailed": "Nem sikerült elmenteni a képernyőképet",
"stopFailed": "Nem sikerült leállítani a rögzítést",
"stopped": "Rögzítés leállítva",
"expired_one": "A rögzítés elérte a {{count}} perces határt, és leállt.",
"expired_other": "A rögzítés elérte a {{count}} perces határt, és leállt."
},
"settings": {
"title": "Hibakereső munkamenet",
"hint": "Ha valami elromlik: indítsd el a rögzítést, csináld végig újra, aztán állítsd le. A naplóból hibajegy-vázlat készül.",
"start": "Rögzítés indítása",
"recording": "Rögzítés folyamatban · {{time}}",
"stop": "Leállítás"
},
"palette": {
"start": "Hibakereső rögzítés indítása",
"step": "Lépés megjelölése a rögzítésben",
"stop": "Hibakereső rögzítés leállítása"
}
}