feat(web): Herkunft der Fehlermeldung — Cookie tessera_desktop_client und Client-Felder in der Nutzlast

Die Middleware liest jetzt zusaetzlich dv/dc/dos aus der Anfrage und legt
daraus das Cookie tessera_desktop_client an (bereinigt per Muster, nur
wenn alle drei Werte gueltig sind); desktop-client.ts liest es zurueck.
Der Fehler-melden-Dialog fuellt daraus vier neue Nutzlastfelder
(clientKind/clientOs/clientVersion/clientCommit), damit die API die
Herkunft der Meldung ausweisen kann. Ohne das zweite Cookie (alter
Client) bleibt es bei "Desktop-App (unbekannt)".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016g2npLxzH5gZpg8s2S6vKh
This commit is contained in:
2026-09-18 12:36:19 +02:00
parent b03cb211b3
commit f2457113a2
8 changed files with 376 additions and 10 deletions
+14
View File
@@ -13,6 +13,12 @@
* — das Bild als Datei, alle uebrigen Felder als Text — mit Cookie
* (`credentials: 'include'`) und OHNE eigenen Content-Type-Header: die
* Multipart-Grenze setzt der Browser selbst.
*
* Seit quick-260918-gza traegt die Nutzlast zusaetzlich vier Herkunftsfelder
* (`clientKind`, `clientOs`, `clientVersion`, `clientCommit`) — im Browser
* `clientKind=browser` mit leeren uebrigen Feldern, in der Desktop-App aus
* `getDesktopClientInfo()` (apps/web/src/lib/desktop-client.ts). Die API
* leitet daraus das Betreff-Kuerzel und die Zeile `Herkunft:` ab.
*/
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';
@@ -79,6 +85,10 @@ export interface BugReportPayload {
clientTime: string;
errors: string[];
screenshot: Blob | null;
clientKind: 'desktop' | 'browser';
clientOs: string;
clientVersion: string;
clientCommit: string;
}
export type BugReportResult = { ok: true } | { ok: false; status: number };
@@ -93,6 +103,10 @@ export async function sendBugReport(p: BugReportPayload): Promise<BugReportResul
body.append('userAgent', p.userAgent);
body.append('viewport', p.viewport);
body.append('clientTime', p.clientTime);
body.append('clientKind', p.clientKind);
body.append('clientOs', p.clientOs);
body.append('clientVersion', p.clientVersion);
body.append('clientCommit', p.clientCommit);
for (const line of p.errors) body.append('errors', line);
if (p.screenshot) body.append('screenshot', p.screenshot, 'screenshot.png');