```json
{
"name": "PasteGuard",
- "version": "0.7.5",
+ "version": "0.7.6",
"description": "Privacy proxy for LLMs",
"mode": "mask",
"providers": {
{
"name": "pasteguard",
- "version": "0.7.5",
+ "version": "0.7.6",
"description": "Privacy proxy for LLMs. Masks personal data and secrets before sending to your provider.",
"type": "module",
"main": "src/index.ts",
});
});
+ test("extracts Claude Code system role messages", () => {
+ const request = createRequest([
+ { role: "user", content: "Hello" },
+ { role: "system", content: "Tool context reminder" },
+ ]);
+
+ const spans = anthropicExtractor.extractTexts(request);
+
+ expect(spans).toHaveLength(2);
+ expect(spans[1]).toEqual({
+ text: "Tool context reminder",
+ path: "messages[1].content",
+ messageIndex: 1,
+ partIndex: 0,
+ role: "system",
+ });
+ });
+
test("extracts text from system array", () => {
const request = createRequest(
[{ role: "user", content: "Hello" }],
// Message and request types
export const AnthropicMessageSchema = z
.object({
- role: z.enum(["user", "assistant"]),
+ // Claude Code can send system reminders as messages when tools are enabled.
+ // Preserve them so PasteGuard stays transparent instead of rejecting upstream traffic.
+ role: z.enum(["user", "assistant", "system"]),
content: z.union([z.string(), z.array(ContentBlockSchema)]),
})
.passthrough();
expect(res.status).toBe(400);
});
+ test("accepts Claude Code system role messages", () => {
+ const result = AnthropicRequestSchema.safeParse({
+ model: "claude-opus-4-8",
+ max_tokens: 64000,
+ stream: true,
+ system: [{ type: "text", text: "Default system prompt" }],
+ messages: [
+ { role: "user", content: [{ type: "text", text: "Hello" }] },
+ { role: "system", content: "Tool context reminder" },
+ ],
+ });
+
+ expect(result.success).toBe(true);
+ if (result.success) {
+ expect(result.data.messages[1].role).toBe("system");
+ }
+ });
+
test("returns 400 for missing model", async () => {
const res = await app.request("/anthropic/v1/messages", {
method: "POST",