session.test.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { describe, expect, test } from "bun:test"
  2. import type { SessionMessageInfo } from "@opencode-ai/client"
  3. import { isDefaultTitle, lastAssistantWithUsage } from "../../src/util/session"
  4. const assistant = (id: string, input: number): SessionMessageInfo => ({
  5. id,
  6. type: "assistant",
  7. agent: "build",
  8. model: { id: "model", providerID: "provider" },
  9. content: [],
  10. tokens: { input, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
  11. time: { created: 0 },
  12. })
  13. describe("util.session", () => {
  14. test("recognizes generated parent and child titles", () => {
  15. expect(isDefaultTitle("New session - 2026-06-06T12:34:56.789Z")).toBeTrue()
  16. expect(isDefaultTitle("Child session - 2026-06-06T12:34:56.789Z")).toBeTrue()
  17. expect(isDefaultTitle("New session - custom")).toBeFalse()
  18. })
  19. test("tracks usage across undo and redo boundaries", () => {
  20. const messages = [assistant("msg_z", 10), assistant("msg_a", 30)]
  21. expect(lastAssistantWithUsage(messages)?.tokens.input).toBe(30)
  22. expect(lastAssistantWithUsage(messages, "msg_a")?.tokens.input).toBe(10)
  23. expect(lastAssistantWithUsage(messages, "msg_missing")).toBeUndefined()
  24. expect(lastAssistantWithUsage(messages)?.tokens.input).toBe(30)
  25. })
  26. test("resets usage at completed compaction until the next assistant reports it", () => {
  27. const compaction: SessionMessageInfo = {
  28. id: "msg_compaction",
  29. type: "compaction",
  30. status: "completed",
  31. reason: "manual",
  32. summary: "Current state",
  33. recent: "",
  34. time: { created: 0 },
  35. }
  36. const messages = [assistant("msg_before", 30), compaction]
  37. expect(lastAssistantWithUsage(messages)).toBeUndefined()
  38. messages.push(assistant("msg_after", 5))
  39. expect(lastAssistantWithUsage(messages)?.tokens.input).toBe(5)
  40. })
  41. })