Skip to content

Commit 2fd1bdf

Browse files
committed
Handle legacy messages missing agent
1 parent d091621 commit 2fd1bdf

2 files changed

Lines changed: 44 additions & 11 deletions

File tree

packages/opencode/src/session/message-v2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ export const cursor = {
9090
}
9191

9292
const info = (row: typeof MessageTable.$inferSelect) => {
93-
const data = row.data as typeof row.data & { agent?: string; mode?: string }
93+
const data = row.data as typeof row.data & { agent?: unknown; mode?: unknown }
9494
return {
9595
...row.data,
9696
id: row.id,
9797
sessionID: row.session_id,
98-
...(data.role === "assistant" && data.agent === undefined ? { agent: data.mode ?? "build" } : {}),
98+
...(typeof data.agent === "string" ? {} : { agent: typeof data.mode === "string" ? data.mode : "build" }),
9999
} as Info
100100
}
101101

packages/opencode/test/server/httpapi-session.test.ts

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,26 @@ const insertLegacyMessageV2Assistant = (sessionID: SessionIDType, parentID: Mess
213213
)
214214
})
215215

216+
const insertLegacyMessageV2User = (sessionID: SessionIDType) =>
217+
Effect.sync(() => {
218+
Database.use((db) =>
219+
db
220+
.insert(MessageTable)
221+
.values({
222+
id: MessageID.ascending(),
223+
session_id: sessionID,
224+
time_created: 1,
225+
time_updated: 1,
226+
data: {
227+
role: "user",
228+
time: { created: 1 },
229+
model: { providerID: ProviderID.make("test"), modelID: ModelID.make("test") },
230+
} as NonNullable<(typeof MessageTable.$inferInsert)["data"]>,
231+
})
232+
.run(),
233+
)
234+
})
235+
216236
const setLegacySummaryDiff = (sessionID: SessionIDType) =>
217237
Effect.gen(function* () {
218238
const { db } = yield* Database.Service
@@ -667,21 +687,34 @@ describe("session HttpApi", () => {
667687
)
668688

669689
it.instance(
670-
"serves legacy assistant messages missing agent",
690+
"serves legacy messages missing agent",
671691
() =>
672692
Effect.gen(function* () {
673693
const test = yield* TestInstance
674-
const session = yield* createSession({ title: "legacy assistant" })
675-
const message = yield* createTextMessage(session.id, "hello")
676-
yield* insertLegacyMessageV2Assistant(session.id, message.info.id)
694+
const userSession = yield* createSession({ title: "legacy user" })
695+
const assistantSession = yield* createSession({ title: "legacy assistant" })
696+
const message = yield* createTextMessage(assistantSession.id, "hello")
697+
yield* insertLegacyMessageV2User(userSession.id)
698+
yield* insertLegacyMessageV2Assistant(assistantSession.id, message.info.id)
677699

678-
const response = yield* request(`${pathFor(SessionPaths.messages, { sessionID: session.id })}?limit=80`, {
679-
headers: { "x-opencode-directory": test.directory },
680-
})
700+
const headers = { "x-opencode-directory": test.directory }
701+
const userResponse = yield* request(
702+
`${pathFor(SessionPaths.messages, { sessionID: userSession.id })}?limit=80`,
703+
{ headers },
704+
)
705+
const assistantResponse = yield* request(
706+
`${pathFor(SessionPaths.messages, { sessionID: assistantSession.id })}?limit=80`,
707+
{ headers },
708+
)
681709

682-
expect(response.status).toBe(200)
710+
expect(userResponse.status).toBe(200)
711+
expect((yield* json<MessageV2.WithParts[]>(userResponse))[0]?.info).toMatchObject({
712+
role: "user",
713+
agent: "build",
714+
})
715+
expect(assistantResponse.status).toBe(200)
683716
expect(
684-
(yield* json<MessageV2.WithParts[]>(response)).find((item) => item.info.role === "assistant")?.info,
717+
(yield* json<MessageV2.WithParts[]>(assistantResponse)).find((item) => item.info.role === "assistant")?.info,
685718
).toMatchObject({
686719
role: "assistant",
687720
agent: "build",

0 commit comments

Comments
 (0)