From 614f31d6075a5f70551bc7b5e1cc340c5fbc6c35 Mon Sep 17 00:00:00 2001 From: AidenGeunGeun Date: Sat, 22 Aug 2026 08:05:16 +0900 Subject: [PATCH] fix(core): migrate provider-local state --- .../core/src/database/v1-migration.bun.ts | 26 ++++++++++++++----- packages/core/test/v1-migration.test.ts | 8 +++--- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/packages/core/src/database/v1-migration.bun.ts b/packages/core/src/database/v1-migration.bun.ts index 080dce8fa44b..8afb7c611302 100644 --- a/packages/core/src/database/v1-migration.bun.ts +++ b/packages/core/src/database/v1-migration.bun.ts @@ -384,19 +384,23 @@ export function transformSession(input: TransformInput): TransformResult { ) return [] const content = owned.flatMap((part): Array> => { - if (part.type === "text") - return [{ type: "text", text: part.text, ...(part.metadata ? { state: part.metadata } : {}) }] - if (part.type === "reasoning") + if (part.type === "text") { + const state = migrateProviderState(assistant.providerID, part.metadata) + return [{ type: "text", text: part.text, ...(state ? { state } : {}) }] + } + if (part.type === "reasoning") { + const state = migrateProviderState(assistant.providerID, part.metadata) return [ { type: "reasoning", text: part.text, - ...(part.metadata ? { state: part.metadata } : {}), + ...(state ? { state } : {}), time: { created: part.time.start, ...(part.time.end === undefined ? {} : { completed: part.time.end }) }, }, ] + } if (part.type !== "tool") return [] - return [migrateTool(part, item.row.time_created)] + return [migrateTool(part, item.row.time_created, assistant.providerID)] }) const start = owned.flatMap((part) => (part.type === "step-start" && part.snapshot ? [part.snapshot] : []))[0] ?? @@ -888,12 +892,20 @@ function row( } } -function migrateTool(part: typeof SessionV1.ToolPart.Type, fallback: number) { +function migrateProviderState(providerID: string, metadata: Record | undefined) { + if (!metadata) return undefined + const state = metadata[providerID] + if (typeof state === "object" && state !== null && !Array.isArray(state)) return state + return metadata +} + +function migrateTool(part: typeof SessionV1.ToolPart.Type, fallback: number, providerID: string) { + const providerState = migrateProviderState(providerID, part.metadata) const base = { type: "tool" as const, id: part.callID, name: part.tool, - ...(part.metadata ? { providerState: part.metadata } : {}), + ...(providerState ? { providerState } : {}), } if (part.state.status === "completed") return { diff --git a/packages/core/test/v1-migration.test.ts b/packages/core/test/v1-migration.test.ts index c924cddc96e6..f330723fd225 100644 --- a/packages/core/test/v1-migration.test.ts +++ b/packages/core/test/v1-migration.test.ts @@ -308,7 +308,7 @@ describe("V1Migration.transformSession", () => { part("prt_2", message.id, { type: "reasoning", text: "think", - metadata: { provider: 1 }, + metadata: { provider: { signature: "sig" } }, time: { start: 21, end: 22 }, }), part("prt_3", message.id, { type: "step-start", snapshot: "snap_start" }), @@ -335,7 +335,7 @@ describe("V1Migration.transformSession", () => { model: { id: "model", providerID: "provider", variant: "fast" }, content: [ { type: "text", text: "", state: { separator: true } }, - { type: "reasoning", text: "think", state: { provider: 1 }, time: { created: 21, completed: 22 } }, + { type: "reasoning", text: "think", state: { signature: "sig" }, time: { created: 21, completed: 22 } }, ], snapshot: { start: "snap_start", end: "snap_end", files: ["a.ts", "b.ts", "c.ts"] }, finish: "stop", @@ -383,7 +383,7 @@ describe("V1Migration.transformSession", () => { }, ], }, - { provider: true }, + { provider: { tool: "state" } }, ), tool("prt_4", "compacted", { status: "completed", @@ -427,7 +427,7 @@ describe("V1Migration.transformSession", () => { }) expect(content[2]).toMatchObject({ id: "completed", - providerState: { provider: true }, + providerState: { tool: "state" }, state: { status: "completed", content: [