Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/opencode/script/seed-e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ const seed = async () => {
const { InstanceBootstrap } = await import("../src/project/bootstrap")
const { Session } = await import("../src/session")
const { Identifier } = await import("../src/id/id")
const { MessageID } = await import("../src/session/schema")
const { Project } = await import("../src/project/project")

await Instance.provide({
directory: dir,
init: InstanceBootstrap,
fn: async () => {
const session = await Session.create({ title })
const messageID = Identifier.descending("message")
const messageID = MessageID.ascending()
const partID = Identifier.descending("part")
const message = {
id: messageID,
Expand Down
3 changes: 2 additions & 1 deletion packages/opencode/src/cli/cmd/debug/agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Provider } from "../../../provider/provider"
import { Session } from "../../../session"
import type { MessageV2 } from "../../../session/message-v2"
import { Identifier } from "../../../id/id"
import { MessageID } from "../../../session/schema"
import { ToolRegistry } from "../../../tool/registry"
import { Instance } from "../../../project/instance"
import { PermissionNext } from "../../../permission/next"
Expand Down Expand Up @@ -113,7 +114,7 @@ function parseToolParams(input?: string) {

async function createToolContext(agent: Agent.Info) {
const session = await Session.create({ title: `Debug tool run (${agent.name})` })
const messageID = Identifier.ascending("message")
const messageID = MessageID.ascending()
const model = agent.model ?? (await Provider.defaultModel())
const now = Date.now()
const message: MessageV2.Assistant = {
Expand Down
5 changes: 3 additions & 2 deletions packages/opencode/src/cli/cmd/github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { bootstrap } from "../bootstrap"
import { Session } from "../../session"
import type { SessionID } from "../../session/schema"
import { Identifier } from "../../id/id"
import { MessageID } from "../../session/schema"
import { Provider } from "../../provider/provider"
import { Bus } from "../../bus"
import { MessageV2 } from "../../session/message-v2"
Expand Down Expand Up @@ -935,7 +936,7 @@ export const GithubRunCommand = cmd({

const result = await SessionPrompt.prompt({
sessionID: session.id,
messageID: Identifier.ascending("message"),
messageID: MessageID.ascending(),
variant,
model: {
providerID,
Expand Down Expand Up @@ -989,7 +990,7 @@ export const GithubRunCommand = cmd({
console.log("Requesting summary from agent...")
const summary = await SessionPrompt.prompt({
sessionID: session.id,
messageID: Identifier.ascending("message"),
messageID: MessageID.ascending(),
variant,
model: {
providerID,
Expand Down
15 changes: 10 additions & 5 deletions packages/opencode/src/cli/cmd/import.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Argv } from "yargs"
import type { Session as SDKSession, Message, Part } from "@opencode-ai/sdk/v2"
import { Session } from "../../session"
import { SessionID } from "../../session/schema"
import { SessionID, MessageID } from "../../session/schema"
import { cmd } from "./cmd"
import { bootstrap } from "../bootstrap"
import { Database } from "../../storage/db"
Expand Down Expand Up @@ -158,6 +158,9 @@ export const ImportCommand = cmd({
id: SessionID.make(exportData.info.id),
parentID: exportData.info.parentID ? SessionID.make(exportData.info.parentID) : undefined,
projectID: Instance.project.id,
revert: exportData.info.revert
? { ...exportData.info.revert, messageID: MessageID.make(exportData.info.revert.messageID) }
: undefined,
})
Database.use((db) =>
db
Expand All @@ -168,28 +171,30 @@ export const ImportCommand = cmd({
)

for (const msg of exportData.messages) {
const { id: _mid, sessionID: _msid, ...msgData } = msg.info
Database.use((db) =>
db
.insert(MessageTable)
.values({
id: msg.info.id,
id: MessageID.make(msg.info.id),
session_id: row.id,
time_created: msg.info.time?.created ?? Date.now(),
data: msg.info,
data: msgData,
})
.onConflictDoNothing()
.run(),
)

for (const part of msg.parts) {
const { id: _pid, sessionID: _psid, messageID: _pmid, ...partData } = part
Database.use((db) =>
db
.insert(PartTable)
.values({
id: part.id,
message_id: msg.info.id,
message_id: MessageID.make(msg.info.id),
session_id: row.id,
data: part,
data: partData,
})
.onConflictDoNothing()
.run(),
Expand Down
3 changes: 2 additions & 1 deletion packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { useSDK } from "@tui/context/sdk"
import { useRoute } from "@tui/context/route"
import { useSync } from "@tui/context/sync"
import { Identifier } from "@/id/id"
import { MessageID } from "@/session/schema"
import { createStore, produce } from "solid-js/store"
import { useKeybind } from "@tui/context/keybind"
import { usePromptHistory, type PromptInfo } from "./history"
Expand Down Expand Up @@ -561,7 +562,7 @@ export function Prompt(props: PromptProps) {
sessionID = res.data.id
}

const messageID = Identifier.ascending("message")
const messageID = MessageID.ascending()
let inputText = store.prompt.input

// Expand pasted text inline before submitting
Expand Down
4 changes: 2 additions & 2 deletions packages/opencode/src/command/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BusEvent } from "@/bus/bus-event"
import { SessionID } from "@/session/schema"
import { SessionID, MessageID } from "@/session/schema"
import z from "zod"
import { Config } from "../config/config"
import { Instance } from "../project/instance"
Expand All @@ -17,7 +17,7 @@ export namespace Command {
name: z.string(),
sessionID: SessionID.zod,
arguments: z.string(),
messageID: Identifier.schema("message"),
messageID: MessageID.zod,
}),
),
}
Expand Down
4 changes: 2 additions & 2 deletions packages/opencode/src/permission/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
import { SessionID } from "@/session/schema"
import { SessionID, MessageID } from "@/session/schema"
import z from "zod"
import { Log } from "../util/log"
import { Identifier } from "../id/id"
Expand All @@ -26,7 +26,7 @@ export namespace Permission {
type: z.string(),
pattern: z.union([z.string(), z.array(z.string())]).optional(),
sessionID: SessionID.zod,
messageID: z.string(),
messageID: MessageID.zod,
callID: z.string().optional(),
message: z.string(),
metadata: z.record(z.string(), z.any()),
Expand Down
4 changes: 2 additions & 2 deletions packages/opencode/src/permission/next.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Bus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
import { Config } from "@/config/config"
import { Identifier } from "@/id/id"
import { SessionID } from "@/session/schema"
import { SessionID, MessageID } from "@/session/schema"
import { Instance } from "@/project/instance"
import { Database, eq } from "@/storage/db"
import { PermissionTable } from "@/session/session.sql"
Expand Down Expand Up @@ -77,7 +77,7 @@ export namespace PermissionNext {
always: z.string().array(),
tool: z
.object({
messageID: z.string(),
messageID: MessageID.zod,
callID: z.string(),
})
.optional(),
Expand Down
6 changes: 3 additions & 3 deletions packages/opencode/src/question/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Bus } from "@/bus"
import { BusEvent } from "@/bus/bus-event"
import { Identifier } from "@/id/id"
import { SessionID } from "@/session/schema"
import { SessionID, MessageID } from "@/session/schema"
import { Instance } from "@/project/instance"
import { Log } from "@/util/log"
import z from "zod"
Expand Down Expand Up @@ -39,7 +39,7 @@ export namespace Question {
questions: z.array(Info).describe("Questions to ask"),
tool: z
.object({
messageID: z.string(),
messageID: MessageID.zod,
callID: z.string(),
})
.optional(),
Expand Down Expand Up @@ -98,7 +98,7 @@ export namespace Question {
export async function ask(input: {
sessionID: SessionID
questions: Info[]
tool?: { messageID: string; callID: string }
tool?: { messageID: MessageID; callID: string }
}): Promise<Answer[]> {
const s = await state()
const id = Identifier.ascending("question")
Expand Down
14 changes: 7 additions & 7 deletions packages/opencode/src/server/routes/session.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Hono } from "hono"
import { stream } from "hono/streaming"
import { describeRoute, validator, resolver } from "hono-openapi"
import { SessionID } from "@/session/schema"
import { SessionID, MessageID } from "@/session/schema"
import z from "zod"
import { Session } from "../../session"
import { MessageV2 } from "../../session/message-v2"
Expand Down Expand Up @@ -607,7 +607,7 @@ export const SessionRoutes = lazy(() =>
"param",
z.object({
sessionID: SessionID.zod,
messageID: z.string().meta({ description: "Message ID" }),
messageID: MessageID.zod,
}),
),
async (c) => {
Expand Down Expand Up @@ -642,7 +642,7 @@ export const SessionRoutes = lazy(() =>
"param",
z.object({
sessionID: SessionID.zod,
messageID: z.string().meta({ description: "Message ID" }),
messageID: MessageID.zod,
}),
),
async (c) => {
Expand Down Expand Up @@ -676,8 +676,8 @@ export const SessionRoutes = lazy(() =>
"param",
z.object({
sessionID: SessionID.zod,
messageID: z.string().meta({ description: "Message ID" }),
partID: z.string().meta({ description: "Part ID" }),
messageID: MessageID.zod,
partID: z.string(),
}),
),
async (c) => {
Expand Down Expand Up @@ -711,8 +711,8 @@ export const SessionRoutes = lazy(() =>
"param",
z.object({
sessionID: SessionID.zod,
messageID: z.string().meta({ description: "Message ID" }),
partID: z.string().meta({ description: "Part ID" }),
messageID: MessageID.zod,
partID: z.string(),
}),
),
validator("json", MessageV2.Part),
Expand Down
12 changes: 6 additions & 6 deletions packages/opencode/src/session/compaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { BusEvent } from "@/bus/bus-event"
import { Bus } from "@/bus"
import { Session } from "."
import { Identifier } from "../id/id"
import { SessionID } from "./schema"
import { SessionID, MessageID } from "./schema"
import { Instance } from "../project/instance"
import { Provider } from "../provider/provider"
import { MessageV2 } from "./message-v2"
Expand Down Expand Up @@ -100,7 +100,7 @@ export namespace SessionCompaction {
}

export async function process(input: {
parentID: string
parentID: MessageID
messages: MessageV2.WithParts[]
sessionID: SessionID
abort: AbortSignal
Expand Down Expand Up @@ -134,7 +134,7 @@ export namespace SessionCompaction {
? await Provider.getModel(agent.model.providerID, agent.model.modelID)
: await Provider.getModel(userMessage.model.providerID, userMessage.model.modelID)
const msg = (await Session.updateMessage({
id: Identifier.ascending("message"),
id: MessageID.ascending(),
role: "assistant",
parentID: input.parentID,
sessionID: input.sessionID,
Expand Down Expand Up @@ -237,7 +237,7 @@ When constructing the summary, try to stick to this template:
if (replay) {
const original = replay.info as MessageV2.User
const replayMsg = await Session.updateMessage({
id: Identifier.ascending("message"),
id: MessageID.ascending(),
role: "user",
sessionID: input.sessionID,
time: { created: Date.now() },
Expand All @@ -263,7 +263,7 @@ When constructing the summary, try to stick to this template:
}
} else {
const continueMsg = await Session.updateMessage({
id: Identifier.ascending("message"),
id: MessageID.ascending(),
role: "user",
sessionID: input.sessionID,
time: { created: Date.now() },
Expand Down Expand Up @@ -307,7 +307,7 @@ When constructing the summary, try to stick to this template:
}),
async (input) => {
const msg = await Session.updateMessage({
id: Identifier.ascending("message"),
id: MessageID.ascending(),
role: "user",
model: input.model,
sessionID: input.sessionID,
Expand Down
18 changes: 9 additions & 9 deletions packages/opencode/src/session/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { Command } from "../command"
import { Snapshot } from "@/snapshot"
import { WorkspaceContext } from "../control-plane/workspace-context"
import { ProjectID } from "../project/schema"
import { SessionID } from "./schema"
import { SessionID, MessageID } from "./schema"

import type { Provider } from "@/provider/provider"
import { PermissionNext } from "@/permission/next"
Expand Down Expand Up @@ -150,7 +150,7 @@ export namespace Session {
permission: PermissionNext.Ruleset.optional(),
revert: z
.object({
messageID: z.string(),
messageID: MessageID.zod,
partID: z.string().optional(),
snapshot: z.string().optional(),
diff: z.string().optional(),
Expand Down Expand Up @@ -238,7 +238,7 @@ export namespace Session {
export const fork = fn(
z.object({
sessionID: SessionID.zod,
messageID: Identifier.schema("message").optional(),
messageID: MessageID.zod.optional(),
}),
async (input) => {
const original = await get(input.sessionID)
Expand All @@ -250,11 +250,11 @@ export namespace Session {
title,
})
const msgs = await messages({ sessionID: input.sessionID })
const idMap = new Map<string, string>()
const idMap = new Map<string, MessageID>()

for (const msg of msgs) {
if (input.messageID && msg.info.id >= input.messageID) break
const newID = Identifier.ascending("message")
const newID = MessageID.ascending()
idMap.set(msg.info.id, newID)

const parentID = msg.info.role === "assistant" && msg.info.parentID ? idMap.get(msg.info.parentID) : undefined
Expand Down Expand Up @@ -707,7 +707,7 @@ export namespace Session {
export const removeMessage = fn(
z.object({
sessionID: SessionID.zod,
messageID: Identifier.schema("message"),
messageID: MessageID.zod,
}),
async (input) => {
// CASCADE delete handles parts automatically
Expand All @@ -729,7 +729,7 @@ export namespace Session {
export const removePart = fn(
z.object({
sessionID: SessionID.zod,
messageID: Identifier.schema("message"),
messageID: MessageID.zod,
partID: Identifier.schema("part"),
}),
async (input) => {
Expand Down Expand Up @@ -777,7 +777,7 @@ export namespace Session {
export const updatePartDelta = fn(
z.object({
sessionID: SessionID.zod,
messageID: z.string(),
messageID: MessageID.zod,
partID: z.string(),
field: z.string(),
delta: z.string(),
Expand Down Expand Up @@ -877,7 +877,7 @@ export namespace Session {
sessionID: SessionID.zod,
modelID: z.string(),
providerID: z.string(),
messageID: Identifier.schema("message"),
messageID: MessageID.zod,
}),
async (input) => {
await SessionPrompt.command({
Expand Down
Loading
Loading