diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index b480a91ea..817038365 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -557,8 +557,11 @@ export namespace Provider { const metadata = iife(() => { if (input.options?.metadata) return input.options.metadata - try { return JSON.parse(input.options?.headers?.["cf-aig-metadata"]) } - catch { return undefined } + try { + return JSON.parse(input.options?.headers?.["cf-aig-metadata"]) + } catch { + return undefined + } }) const opts = { metadata, @@ -572,7 +575,7 @@ export namespace Provider { accountId, gateway, apiKey: apiToken, - ...(Object.values(opts).some(v => v !== undefined) ? { options: opts } : {}), + ...(Object.values(opts).some((v) => v !== undefined) ? { options: opts } : {}), }) const unified = createUnified() diff --git a/packages/opencode/test/session/session.test.ts b/packages/opencode/test/session/session.test.ts index 2de94ee7e..aa9ca05d0 100644 --- a/packages/opencode/test/session/session.test.ts +++ b/packages/opencode/test/session/session.test.ts @@ -73,66 +73,70 @@ describe("session.started event", () => { }) describe("step-finish token propagation via Bus event", () => { - test("non-zero tokens propagate through PartUpdated event", async () => { - await Instance.provide({ - directory: projectRoot, - fn: async () => { - const session = await Session.create({}) + test( + "non-zero tokens propagate through PartUpdated event", + async () => { + await Instance.provide({ + directory: projectRoot, + fn: async () => { + const session = await Session.create({}) - const messageID = Identifier.ascending("message") - await Session.updateMessage({ - id: messageID, - sessionID: session.id, - role: "user", - time: { created: Date.now() }, - agent: "user", - model: { providerID: "test", modelID: "test" }, - tools: {}, - mode: "", - } as unknown as MessageV2.Info) + const messageID = Identifier.ascending("message") + await Session.updateMessage({ + id: messageID, + sessionID: session.id, + role: "user", + time: { created: Date.now() }, + agent: "user", + model: { providerID: "test", modelID: "test" }, + tools: {}, + mode: "", + } as unknown as MessageV2.Info) - let received: MessageV2.Part | undefined - const unsub = Bus.subscribe(MessageV2.Event.PartUpdated, (event) => { - received = event.properties.part - }) + let received: MessageV2.Part | undefined + const unsub = Bus.subscribe(MessageV2.Event.PartUpdated, (event) => { + received = event.properties.part + }) - const tokens = { - total: 1500, - input: 500, - output: 800, - reasoning: 200, - cache: { read: 100, write: 50 }, - } + const tokens = { + total: 1500, + input: 500, + output: 800, + reasoning: 200, + cache: { read: 100, write: 50 }, + } - const partInput = { - id: Identifier.ascending("part"), - messageID, - sessionID: session.id, - type: "step-finish" as const, - reason: "stop", - cost: 0.005, - tokens, - } + const partInput = { + id: Identifier.ascending("part"), + messageID, + sessionID: session.id, + type: "step-finish" as const, + reason: "stop", + cost: 0.005, + tokens, + } - await Session.updatePart(partInput) + await Session.updatePart(partInput) - await new Promise((resolve) => setTimeout(resolve, 100)) + await new Promise((resolve) => setTimeout(resolve, 100)) - expect(received).toBeDefined() - expect(received!.type).toBe("step-finish") - const finish = received as MessageV2.StepFinishPart - expect(finish.tokens.input).toBe(500) - expect(finish.tokens.output).toBe(800) - expect(finish.tokens.reasoning).toBe(200) - expect(finish.tokens.total).toBe(1500) - expect(finish.tokens.cache.read).toBe(100) - expect(finish.tokens.cache.write).toBe(50) - expect(finish.cost).toBe(0.005) - expect(received).not.toBe(partInput) + expect(received).toBeDefined() + expect(received!.type).toBe("step-finish") + const finish = received as MessageV2.StepFinishPart + expect(finish.tokens.input).toBe(500) + expect(finish.tokens.output).toBe(800) + expect(finish.tokens.reasoning).toBe(200) + expect(finish.tokens.total).toBe(1500) + expect(finish.tokens.cache.read).toBe(100) + expect(finish.tokens.cache.write).toBe(50) + expect(finish.cost).toBe(0.005) + expect(received).not.toBe(partInput) - unsub() - await Session.remove(session.id) - }, - }) - }, { timeout: 30000 }) + unsub() + await Session.remove(session.id) + }, + }) + }, + { timeout: 30000 }, + ) })