Files
oh-my-pi/packages/coding-agent/src/modes/components/late-diagnostics-message.ts
T
can1357 c7c0b67b8c feat(coding-agent/modes): reworked late diagnostics rendering in chat transcript
- Added a LateDiagnosticsMessageComponent to render delayed LSP diagnostics as grouped tree nodes in transcript messages.
- Updated message handling to use that component and honor tool-output expansion while reusing shared diagnostics formatting.
- Added tests for shared rendering output, collapsed/expanded limits, and empty diagnostics behavior.
2026-06-08 06:04:46 +02:00

61 lines
1.6 KiB
TypeScript

import { Container, Text } from "@oh-my-pi/pi-tui";
import { formatDiagnostics } from "../../tools/render-utils";
import { getLanguageFromPath, theme } from "../theme/theme";
/** One file's worth of late LSP diagnostics, as carried on the transcript message. */
export interface LateDiagnosticsFile {
path?: string;
summary?: string;
errored?: boolean;
messages?: string[];
}
/**
* Renders late LSP diagnostics (arrived after edit/write returned) in the
* transcript, reusing the same tree renderer the edit/write tools use so the
* styling stays consistent. Supports the global tool-output expand toggle.
*/
export class LateDiagnosticsMessageComponent extends Container {
#expanded = false;
constructor(private readonly files: LateDiagnosticsFile[]) {
super();
this.#rebuild();
}
setExpanded(expanded: boolean): void {
if (this.#expanded === expanded) return;
this.#expanded = expanded;
this.#rebuild();
}
override invalidate(): void {
super.invalidate();
this.#rebuild();
}
#rebuild(): void {
this.clear();
const messages: string[] = [];
const summaries: string[] = [];
let errored = false;
for (const file of this.files) {
if (file.messages?.length) messages.push(...file.messages);
if (file.summary) summaries.push(file.summary);
if (file.errored) errored = true;
}
if (messages.length === 0) return;
const text = formatDiagnostics(
{ errored, summary: summaries.join(", "), messages },
this.#expanded,
theme,
fp => theme.getLangIcon(getLanguageFromPath(fp)),
{ title: "Late diagnostics" },
);
const body = text.replace(/^\n+/, "");
if (body) this.addChild(new Text(body, 1, 0));
}
}