import { describe, expect, test } from "bun:test" import type { Message, Part } from "@opencode-ai/sdk/v2/client" import { estimateSessionContextBreakdown } from "./session-context-breakdown" const user = (id: string) => { return { id, role: "user", time: { created: 1 }, } as unknown as Message } const assistant = (id: string) => { return { id, role: "assistant", time: { created: 1 }, } as unknown as Message } describe("estimateSessionContextBreakdown", () => { test("estimates tokens and keeps remaining tokens as other", () => { const messages = [user("u1"), assistant("a1")] const parts = { u1: [{ type: "text", text: "hello world" }] as unknown as Part[], a1: [{ type: "text", text: "assistant response" }] as unknown as Part[], } const output = estimateSessionContextBreakdown({ messages, parts, input: 20, systemPrompt: "system prompt", }) const map = Object.fromEntries(output.map((segment) => [segment.key, segment.tokens])) expect(map.system).toBe(4) expect(map.user).toBe(3) expect(map.assistant).toBe(5) expect(map.other).toBe(8) }) test("scales segments when estimates exceed input", () => { const messages = [user("u1"), assistant("a1")] const parts = { u1: [{ type: "text", text: "x".repeat(400) }] as unknown as Part[], a1: [{ type: "text", text: "y".repeat(400) }] as unknown as Part[], } const output = estimateSessionContextBreakdown({ messages, parts, input: 10, systemPrompt: "z".repeat(200), }) const total = output.reduce((sum, segment) => sum + segment.tokens, 0) expect(total).toBeLessThanOrEqual(10) expect(output.every((segment) => segment.width <= 100)).toBeTrue() }) })