feat(tickets): Rückfragen-Dialog, Verlinkungen, Entwurfssicherung + PWA-Vorbereitung

- Feedback: fixNote (Changelog), agentContext (intern), thread (Q&A-Verlauf);
  3 gefilterte Ansichten (Rückfragen/Offen/Geschlossen)
- Tickets-Text: klickbare Tier-Links (ID→Name), Ticket→Ticket-Links (?focus=),
  Markdown-Links; Antwort-Entwurf pro Ticket in localStorage
- "Fehler melden": Entwurf übersteht App-Wechsel/Schließen (ein gemeinsamer Entwurf)
- entityName als Hyperlink zum referenzierten Datensatz

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 22:38:23 +02:00
parent b9021fe577
commit dcf0e40f9b
18 changed files with 2592 additions and 154 deletions

View File

@@ -63,5 +63,28 @@ namespace GerbilManagerWebAPI.Models
/// <summary>When the breeder answered the clarifying question; null until answered.</summary>
public DateTimeOffset? AnsweredAt { get; set; }
/// <summary>
/// FIX-NOTE: a breeder-friendly changelog written when the ticket is resolved — plain
/// language ("was sich für SIE sichtbar geändert hat"), no technical jargon. Shown in the
/// "Geschlossen" view. null while the ticket is open / unresolved.
/// </summary>
public string? FixNote { get; set; }
/// <summary>
/// AGENT-CONTEXT (INTERNAL): the maintainer/agent's working memory — findings, suspected
/// cause, files/data touched, the plan, what it is waiting on. MAY contain ids/filenames.
/// Returned by the DTO for tooling, but NEVER rendered in the breeder UI. null if unused.
/// </summary>
public string? AgentContext { get; set; }
/// <summary>
/// THREAD/HISTORY: a JSON array of past Q&A turns so earlier rounds aren't lost when a new
/// question is asked. Each entry: { "role": "maintainer" | "breeder", "text": string,
/// "at": ISO-8601 string }. The current open exchange stays in Question/Answer; when a NEW
/// question is set while a previous Q&A exists, the previous (question, answer) is appended
/// here first. Plain string column (no FK) so it survives the ingest wipe. null/empty = no history.
/// </summary>
public string? Thread { get; set; }
}
}