Skip to content

Commit dd4db8e

Browse files
Apply PR #16956: feat(session): brand MessageID through Drizzle and Zod schemas
2 parents 6c8d9f8 + 2ca9fb5 commit dd4db8e

39 files changed

Lines changed: 149 additions & 126 deletions

packages/opencode/script/seed-e2e.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ const seed = async () => {
1212
const { InstanceBootstrap } = await import("../src/project/bootstrap")
1313
const { Session } = await import("../src/session")
1414
const { Identifier } = await import("../src/id/id")
15+
const { MessageID } = await import("../src/session/schema")
1516
const { Project } = await import("../src/project/project")
1617

1718
await Instance.provide({
1819
directory: dir,
1920
init: InstanceBootstrap,
2021
fn: async () => {
2122
const session = await Session.create({ title })
22-
const messageID = Identifier.descending("message")
23+
const messageID = MessageID.ascending()
2324
const partID = Identifier.descending("part")
2425
const message = {
2526
id: messageID,

packages/opencode/src/cli/cmd/debug/agent.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Provider } from "../../../provider/provider"
55
import { Session } from "../../../session"
66
import type { MessageV2 } from "../../../session/message-v2"
77
import { Identifier } from "../../../id/id"
8+
import { MessageID } from "../../../session/schema"
89
import { ToolRegistry } from "../../../tool/registry"
910
import { Instance } from "../../../project/instance"
1011
import { PermissionNext } from "../../../permission/next"
@@ -113,7 +114,7 @@ function parseToolParams(input?: string) {
113114

114115
async function createToolContext(agent: Agent.Info) {
115116
const session = await Session.create({ title: `Debug tool run (${agent.name})` })
116-
const messageID = Identifier.ascending("message")
117+
const messageID = MessageID.ascending()
117118
const model = agent.model ?? (await Provider.defaultModel())
118119
const now = Date.now()
119120
const message: MessageV2.Assistant = {

packages/opencode/src/cli/cmd/github.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { bootstrap } from "../bootstrap"
2424
import { Session } from "../../session"
2525
import type { SessionID } from "../../session/schema"
2626
import { Identifier } from "../../id/id"
27+
import { MessageID } from "../../session/schema"
2728
import { Provider } from "../../provider/provider"
2829
import { Bus } from "../../bus"
2930
import { MessageV2 } from "../../session/message-v2"
@@ -935,7 +936,7 @@ export const GithubRunCommand = cmd({
935936

936937
const result = await SessionPrompt.prompt({
937938
sessionID: session.id,
938-
messageID: Identifier.ascending("message"),
939+
messageID: MessageID.ascending(),
939940
variant,
940941
model: {
941942
providerID,
@@ -989,7 +990,7 @@ export const GithubRunCommand = cmd({
989990
console.log("Requesting summary from agent...")
990991
const summary = await SessionPrompt.prompt({
991992
sessionID: session.id,
992-
messageID: Identifier.ascending("message"),
993+
messageID: MessageID.ascending(),
993994
variant,
994995
model: {
995996
providerID,

packages/opencode/src/cli/cmd/import.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Argv } from "yargs"
22
import type { Session as SDKSession, Message, Part } from "@opencode-ai/sdk/v2"
33
import { Session } from "../../session"
4-
import { SessionID } from "../../session/schema"
4+
import { SessionID, MessageID } from "../../session/schema"
55
import { cmd } from "./cmd"
66
import { bootstrap } from "../bootstrap"
77
import { Database } from "../../storage/db"
@@ -158,6 +158,9 @@ export const ImportCommand = cmd({
158158
id: SessionID.make(exportData.info.id),
159159
parentID: exportData.info.parentID ? SessionID.make(exportData.info.parentID) : undefined,
160160
projectID: Instance.project.id,
161+
revert: exportData.info.revert
162+
? { ...exportData.info.revert, messageID: MessageID.make(exportData.info.revert.messageID) }
163+
: undefined,
161164
})
162165
Database.use((db) =>
163166
db
@@ -168,28 +171,30 @@ export const ImportCommand = cmd({
168171
)
169172

170173
for (const msg of exportData.messages) {
174+
const { id: _mid, sessionID: _msid, ...msgData } = msg.info
171175
Database.use((db) =>
172176
db
173177
.insert(MessageTable)
174178
.values({
175-
id: msg.info.id,
179+
id: MessageID.make(msg.info.id),
176180
session_id: row.id,
177181
time_created: msg.info.time?.created ?? Date.now(),
178-
data: msg.info,
182+
data: msgData,
179183
})
180184
.onConflictDoNothing()
181185
.run(),
182186
)
183187

184188
for (const part of msg.parts) {
189+
const { id: _pid, sessionID: _psid, messageID: _pmid, ...partData } = part
185190
Database.use((db) =>
186191
db
187192
.insert(PartTable)
188193
.values({
189194
id: part.id,
190-
message_id: msg.info.id,
195+
message_id: MessageID.make(msg.info.id),
191196
session_id: row.id,
192-
data: part,
197+
data: partData,
193198
})
194199
.onConflictDoNothing()
195200
.run(),

packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { useSDK } from "@tui/context/sdk"
1010
import { useRoute } from "@tui/context/route"
1111
import { useSync } from "@tui/context/sync"
1212
import { Identifier } from "@/id/id"
13+
import { MessageID } from "@/session/schema"
1314
import { createStore, produce } from "solid-js/store"
1415
import { useKeybind } from "@tui/context/keybind"
1516
import { usePromptHistory, type PromptInfo } from "./history"
@@ -573,7 +574,7 @@ export function Prompt(props: PromptProps) {
573574
sessionID = res.data.id
574575
}
575576

576-
const messageID = Identifier.ascending("message")
577+
const messageID = MessageID.ascending()
577578
let inputText = store.prompt.input
578579

579580
// Expand pasted text inline before submitting

packages/opencode/src/command/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BusEvent } from "@/bus/bus-event"
2-
import { SessionID } from "@/session/schema"
2+
import { SessionID, MessageID } from "@/session/schema"
33
import z from "zod"
44
import { Config } from "../config/config"
55
import { Instance } from "../project/instance"
@@ -17,7 +17,7 @@ export namespace Command {
1717
name: z.string(),
1818
sessionID: SessionID.zod,
1919
arguments: z.string(),
20-
messageID: Identifier.schema("message"),
20+
messageID: MessageID.zod,
2121
}),
2222
),
2323
}

packages/opencode/src/permission/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BusEvent } from "@/bus/bus-event"
22
import { Bus } from "@/bus"
3-
import { SessionID } from "@/session/schema"
3+
import { SessionID, MessageID } from "@/session/schema"
44
import z from "zod"
55
import { Log } from "../util/log"
66
import { Identifier } from "../id/id"
@@ -26,7 +26,7 @@ export namespace Permission {
2626
type: z.string(),
2727
pattern: z.union([z.string(), z.array(z.string())]).optional(),
2828
sessionID: SessionID.zod,
29-
messageID: z.string(),
29+
messageID: MessageID.zod,
3030
callID: z.string().optional(),
3131
message: z.string(),
3232
metadata: z.record(z.string(), z.any()),

packages/opencode/src/permission/next.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Bus } from "@/bus"
22
import { BusEvent } from "@/bus/bus-event"
33
import { Config } from "@/config/config"
44
import { Identifier } from "@/id/id"
5-
import { SessionID } from "@/session/schema"
5+
import { SessionID, MessageID } from "@/session/schema"
66
import { Instance } from "@/project/instance"
77
import { Database, eq } from "@/storage/db"
88
import { PermissionTable } from "@/session/session.sql"
@@ -77,7 +77,7 @@ export namespace PermissionNext {
7777
always: z.string().array(),
7878
tool: z
7979
.object({
80-
messageID: z.string(),
80+
messageID: MessageID.zod,
8181
callID: z.string(),
8282
})
8383
.optional(),

packages/opencode/src/question/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Bus } from "@/bus"
22
import { BusEvent } from "@/bus/bus-event"
33
import { Identifier } from "@/id/id"
4-
import { SessionID } from "@/session/schema"
4+
import { SessionID, MessageID } from "@/session/schema"
55
import { Instance } from "@/project/instance"
66
import { Log } from "@/util/log"
77
import z from "zod"
@@ -39,7 +39,7 @@ export namespace Question {
3939
questions: z.array(Info).describe("Questions to ask"),
4040
tool: z
4141
.object({
42-
messageID: z.string(),
42+
messageID: MessageID.zod,
4343
callID: z.string(),
4444
})
4545
.optional(),
@@ -98,7 +98,7 @@ export namespace Question {
9898
export async function ask(input: {
9999
sessionID: SessionID
100100
questions: Info[]
101-
tool?: { messageID: string; callID: string }
101+
tool?: { messageID: MessageID; callID: string }
102102
}): Promise<Answer[]> {
103103
const s = await state()
104104
const id = Identifier.ascending("question")

packages/opencode/src/server/routes/session.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Hono } from "hono"
22
import { stream } from "hono/streaming"
33
import { describeRoute, validator, resolver } from "hono-openapi"
4-
import { SessionID } from "@/session/schema"
4+
import { SessionID, MessageID } from "@/session/schema"
55
import z from "zod"
66
import { Session } from "../../session"
77
import { MessageV2 } from "../../session/message-v2"
@@ -607,7 +607,7 @@ export const SessionRoutes = lazy(() =>
607607
"param",
608608
z.object({
609609
sessionID: SessionID.zod,
610-
messageID: z.string().meta({ description: "Message ID" }),
610+
messageID: MessageID.zod,
611611
}),
612612
),
613613
async (c) => {
@@ -642,7 +642,7 @@ export const SessionRoutes = lazy(() =>
642642
"param",
643643
z.object({
644644
sessionID: SessionID.zod,
645-
messageID: z.string().meta({ description: "Message ID" }),
645+
messageID: MessageID.zod,
646646
}),
647647
),
648648
async (c) => {
@@ -676,8 +676,8 @@ export const SessionRoutes = lazy(() =>
676676
"param",
677677
z.object({
678678
sessionID: SessionID.zod,
679-
messageID: z.string().meta({ description: "Message ID" }),
680-
partID: z.string().meta({ description: "Part ID" }),
679+
messageID: MessageID.zod,
680+
partID: z.string(),
681681
}),
682682
),
683683
async (c) => {
@@ -711,8 +711,8 @@ export const SessionRoutes = lazy(() =>
711711
"param",
712712
z.object({
713713
sessionID: SessionID.zod,
714-
messageID: z.string().meta({ description: "Message ID" }),
715-
partID: z.string().meta({ description: "Part ID" }),
714+
messageID: MessageID.zod,
715+
partID: z.string(),
716716
}),
717717
),
718718
validator("json", MessageV2.Part),

0 commit comments

Comments
 (0)