Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/klaus/__tests__/runtime.test.ts

Raw
import {
	access,
	mkdtemp,
	readFile,
	rm,
	stat,
	writeFile,
} from "node:fs/promises";
import { tmpdir } from "node:os";
import { dirname, join } from "node:path";
import { afterEach, describe, expect, it } from "vitest";
import { type ChildRuntime, createChildRuntime } from "../src/runtime/index";

const runtimes: ChildRuntime[] = [];
const roots: string[] = [];
const originalEnvironment = { ...process.env };

afterEach(async () => {
	await Promise.all(runtimes.splice(0).map((runtime) => runtime.cleanup()));
	await Promise.all(
		roots.splice(0).map((root) => rm(root, { recursive: true, force: true })),
	);
	for (const key of Object.keys(process.env)) {
		if (!(key in originalEnvironment)) delete process.env[key];
	}
	Object.assign(process.env, originalEnvironment);
});

describe("Klaus isolated Claude child runtime", () => {
	it("builds a query-private allowlisted environment and filters headers", async () => {
		process.env.ANTHROPIC_API_KEY = "blocked";
		process.env.ANTHROPIC_CUSTOM_HEADERS = "x-ambient: blocked";
		process.env.CLAUDE_CODE_OAUTH_TOKEN = "blocked";
		process.env.AWS_SECRET_ACCESS_KEY = "blocked";
		process.env.UNRELATED_KLAUS_TEST = "blocked";
		process.env.KLAUS_E2E_BASE_URL = "http://127.0.0.1:43210";
		const runtime = await createChildRuntime(
			"fake",
			{
				"X-Custom": "present",
				"X-Empty": "",
				"X-Null": null,
				Authorization: "Bearer hostile",
				"x-api-key": "hostile",
				Host: "hostile.example",
				"Content-Type": "application/hostile",
				"x-klaus-private": "must-not-pass",
				"X-KLAUS-UPPER": "must-not-pass",
				"bad header": "must-not-pass",
				"X-Bad-Value": "line one\nline two",
				"anthropic-beta": "unknown-beta, context-1m-2025-08-07, another-beta",
			},
			{
				PATH: process.env.PATH ?? "",
				LANG: "klaus-test-locale",
				UNRELATED_KLAUS_TEST: "blocked",
				ANTHROPIC_API_KEY: "blocked",
			},
		);
		runtimes.push(runtime);

		expect(runtime.executable).toBeTypeOf("string");
		if (!runtime.executable)
			throw new Error("Klaus runtime executable missing.");
		expect((await stat(runtime.executable)).isFile()).toBe(true);
		expect(runtime.env).toMatchObject({
			PATH: process.env.PATH ?? "",
			LANG: "klaus-test-locale",
			HOME: runtime.configDir,
			CLAUDE_CONFIG_DIR: runtime.configDir,
			CLAUDE_CODE_OAUTH_TOKEN: "fake",
			CLAUDE_AGENT_SDK_CLIENT_APP: "klaus/1",
			CLAUDE_AGENT_SDK_MCP_NO_PREFIX: "1",
			CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1",
			CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY: "0",
			ENABLE_TOOL_SEARCH: "false",
			CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS: "0",
			CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT: "0",
			CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: "1",
			MAX_MCP_OUTPUT_TOKENS: "1000000",
			CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
			CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
			CLAUDE_CODE_DISABLE_BUNDLED_SKILLS: "1",
			CLAUDE_CODE_DISABLE_POLICY_SKILLS: "1",
			CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS: "1",
			CLAUDE_CODE_DISABLE_WORKFLOWS: "1",
			CLAUDE_CODE_DISABLE_CRON: "1",
			CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1",
			CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING: "1",
			CLAUDE_CODE_TMPDIR: runtime.configDir,
			ANTHROPIC_BASE_URL: "http://127.0.0.1:43210",
			ANTHROPIC_CUSTOM_HEADERS: "X-Custom: present\nX-Empty: ",
		});
		for (const forbidden of [
			"ANTHROPIC_API_KEY",
			"AWS_SECRET_ACCESS_KEY",
			"UNRELATED_KLAUS_TEST",
		]) {
			expect(runtime.env).not.toHaveProperty(forbidden);
		}
		expect(runtime.betas).toEqual(["context-1m-2025-08-07"]);
		expect(runtime.env.ANTHROPIC_CUSTOM_HEADERS).not.toMatch(
			/auth|hostile|klaus|bad|ambient/i,
		);
	}, 60_000);

	it("maps Pi maxTokens onto the child output cap", async () => {
		process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = "hostile-ambient";
		const runtime = await createChildRuntime("fake", {}, {}, 32768);
		runtimes.push(runtime);
		expect(runtime.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS).toBe("32768");

		const uncapped = await createChildRuntime("fake", {}, {});
		runtimes.push(uncapped);
		expect(uncapped.env).not.toHaveProperty("CLAUDE_CODE_MAX_OUTPUT_TOKENS");
	}, 60_000);

	it("rejects invalid maxTokens values", async () => {
		await expect(createChildRuntime("fake", {}, {}, 0)).rejects.toThrow(
			/invalid maxTokens/,
		);
		await expect(
			createChildRuntime("fake", {}, {}, Number.NaN),
		).rejects.toThrow(/invalid maxTokens/);
	}, 60_000);

	it("does not depend on a shared predictable klaus directory", async () => {
		const root = await mkdtemp(join(tmpdir(), "klaus-runtime-test-"));
		roots.push(root);
		await writeFile(join(root, "klaus"), "foreign obstacle");
		process.env.TMPDIR = root;
		process.env.TMP = root;
		process.env.TEMP = root;

		const runtime = await createChildRuntime("token", {}, {});
		runtimes.push(runtime);

		expect(dirname(runtime.configDir)).toBe(root);
		expect(await readFile(join(root, "klaus"), "utf8")).toBe(
			"foreign obstacle",
		);
	}, 60_000);

	it("creates unique config directories and removes only its own directory", async () => {
		const first = await createChildRuntime("token-one", {}, {});
		const second = await createChildRuntime("token-two", {}, {});
		runtimes.push(second);

		expect(first.configDir).not.toBe(second.configDir);
		expect(first.env.HOME).toBe(first.configDir);
		expect(second.env.HOME).toBe(second.configDir);
		await first.cleanup();
		await expect(access(first.configDir)).rejects.toMatchObject({
			code: "ENOENT",
		});
		await expect(access(second.configDir)).resolves.toBeUndefined();
	}, 60_000);
});