Fix HTML escaping in markdown code blocks

Move HTML tag escaping from pre-parse to custom renderers.
This preserves < in code blocks while still escaping in text content.
This commit is contained in:
Mario Zechner 2026-01-01 22:03:01 +01:00
parent dccdf91b8c
commit 0b31884385
3 changed files with 18 additions and 105 deletions

View file

@ -1,12 +0,0 @@
---
description: Review a file for issues
---
Please review the following file for potential issues, bugs, or improvements:
$1
Focus on:
- Logic errors
- Edge cases
- Code style
- Performance concerns

View file

@ -1,86 +0,0 @@
/**
* Test hook demonstrating custom commands, message rendering, and before_agent_start.
*/
import type { BeforeAgentStartEvent, HookAPI } from "@mariozechner/pi-coding-agent";
import { Box, Spacer, Text } from "@mariozechner/pi-tui";
export default function (pi: HookAPI) {
// Track whether injection is enabled
let injectEnabled = false;
// Register a custom message renderer for our "test-info" type
pi.registerMessageRenderer("test-info", (message, options, theme) => {
const box = new Box(1, 1, (t) => theme.bg("customMessageBg", t));
const label = theme.fg("success", "[TEST INFO]");
box.addChild(new Text(label, 0, 0));
box.addChild(new Spacer(1));
const content =
typeof message.content === "string"
? message.content
: message.content.map((c) => (c.type === "text" ? c.text : "[image]")).join("");
box.addChild(new Text(theme.fg("text", content), 0, 0));
if (options.expanded && message.details) {
box.addChild(new Spacer(1));
box.addChild(new Text(theme.fg("dim", `Details: ${JSON.stringify(message.details)}`), 0, 0));
}
return box;
});
// Register /test-msg command
pi.registerCommand("test-msg", {
description: "Send a test custom message",
handler: async () => {
pi.sendMessage(
{
customType: "test-info",
content: "This is a test message with custom rendering!",
display: true,
details: { timestamp: Date.now(), source: "test-command hook" },
},
true, // triggerTurn: start agent run
);
},
});
// Register /test-hidden command
pi.registerCommand("test-hidden", {
description: "Send a hidden message (display: false)",
handler: async (ctx) => {
pi.sendMessage({
customType: "test-info",
content: "This message is in context but not displayed",
display: false,
});
ctx.ui.notify("Sent hidden message (check session file)");
},
});
// Register /test-inject command to toggle before_agent_start injection
pi.registerCommand("test-inject", {
description: "Toggle context injection before agent starts",
handler: async (ctx) => {
injectEnabled = !injectEnabled;
ctx.ui.notify(`Context injection ${injectEnabled ? "enabled" : "disabled"}`);
},
});
// Demonstrate before_agent_start: inject context when enabled
pi.on("before_agent_start", async (event: BeforeAgentStartEvent) => {
if (!injectEnabled) return;
// Return a message to inject before the user's prompt
return {
message: {
customType: "test-info",
content: `[Injected context for prompt: "${event.prompt.slice(0, 50)}..."]`,
display: true,
details: { injectedAt: Date.now() },
},
};
});
}