Browse Source

fix(ui): context stale in prompt input (#12695)

Adam 2 weeks ago
parent
commit
7c6b8d7a8a

+ 5 - 4
packages/app/src/components/session/session-context-metrics.test.ts

@@ -79,15 +79,16 @@ describe("getSessionContextMetrics", () => {
     expect(metrics.context?.usage).toBeNull()
   })
 
-  test("memoizes by message and provider array identity", () => {
+  test("recomputes when message array is mutated in place", () => {
     const messages = [assistant("a1", { input: 10, output: 10, reasoning: 10, read: 10, write: 10 }, 0.25)]
     const providers = [{ id: "openai", models: {} }]
 
     const one = getSessionContextMetrics(messages, providers)
+    messages.push(assistant("a2", { input: 100, output: 20, reasoning: 0, read: 0, write: 0 }, 0.75))
     const two = getSessionContextMetrics(messages, providers)
-    const three = getSessionContextMetrics([...messages], providers)
 
-    expect(two).toBe(one)
-    expect(three).not.toBe(one)
+    expect(one.context?.message.id).toBe("a1")
+    expect(two.context?.message.id).toBe("a2")
+    expect(two.totalCost).toBe(1)
   })
 })

+ 1 - 13
packages/app/src/components/session/session-context-metrics.ts

@@ -34,8 +34,6 @@ type Metrics = {
   context: Context | undefined
 }
 
-const cache = new WeakMap<Message[], WeakMap<Provider[], Metrics>>()
-
 const tokenTotal = (msg: AssistantMessage) => {
   return msg.tokens.input + msg.tokens.output + msg.tokens.reasoning + msg.tokens.cache.read + msg.tokens.cache.write
 }
@@ -80,15 +78,5 @@ const build = (messages: Message[], providers: Provider[]): Metrics => {
 }
 
 export function getSessionContextMetrics(messages: Message[], providers: Provider[]) {
-  const byProvider = cache.get(messages)
-  if (byProvider) {
-    const hit = byProvider.get(providers)
-    if (hit) return hit
-  }
-
-  const value = build(messages, providers)
-  const next = byProvider ?? new WeakMap<Provider[], Metrics>()
-  next.set(providers, value)
-  if (!byProvider) cache.set(messages, next)
-  return value
+  return build(messages, providers)
 }