From d462e380f4b444c7817ed2c4fbef27fec1eeeed1 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 7 Nov 2025 14:46:58 -0500 Subject: [PATCH] fix: update references after moving message functions to MessageV2 namespace --- packages/opencode/src/server/server.ts | 2 +- packages/opencode/src/session/compaction.ts | 8 ++--- packages/opencode/src/session/index.ts | 36 +-------------------- packages/opencode/src/session/message-v2.ts | 35 ++++++++++++++++++++ packages/opencode/src/session/prompt.ts | 8 ++--- packages/opencode/src/tool/task.ts | 2 +- 6 files changed, 46 insertions(+), 45 deletions(-) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index c7265006..53d8b4dd 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -827,7 +827,7 @@ export namespace Server { ), async (c) => { const params = c.req.valid("param") - const message = await Session.getMessage({ + const message = await MessageV2.get({ sessionID: params.id, messageID: params.messageID, }) diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index 4924a35d..d54b07ca 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -111,7 +111,7 @@ export namespace SessionCompaction { draft.time.compacting = undefined }) }) - const toSummarize = await MessageV2.filterCompacted(Session.messageStream(input.sessionID)) + const toSummarize = await MessageV2.filterCompacted(MessageV2.stream(input.sessionID)) const model = await Provider.getModel(input.providerID, input.modelID) const system = [ ...SystemPrompt.summarize(model.providerID), @@ -270,7 +270,7 @@ export namespace SessionCompaction { } } - const parts = await Session.getParts(msg.id) + const parts = await MessageV2.parts(msg.id) return { info: msg, parts, @@ -287,7 +287,7 @@ export namespace SessionCompaction { }) if (result.shouldRetry) { for (let retry = 1; retry < maxRetries; retry++) { - const lastRetryPart = result.parts.findLast((p) => p.type === "retry") + const lastRetryPart = result.parts.findLast((p): p is MessageV2.RetryPart => p.type === "retry") if (lastRetryPart) { const delayMs = SessionRetry.getRetryDelayInMs(lastRetryPart.error, retry) @@ -336,7 +336,7 @@ export namespace SessionCompaction { if ( !msg.error || (MessageV2.AbortedError.isInstance(msg.error) && - result.parts.some((part) => part.type === "text" && part.text.length > 0)) + result.parts.some((part): part is MessageV2.TextPart => part.type === "text" && part.text.length > 0)) ) { msg.summary = true Bus.publish(Event.Compacted, { diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 0971531f..831c2ddd 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -273,17 +273,6 @@ export namespace Session { return diffs ?? [] }) - export const messageStream = fn(Identifier.schema("session"), async function* (sessionID) { - const list = await Array.fromAsync(await Storage.list(["message", sessionID])) - for (let i = list.length - 1; i >= 0; i--) { - const read = await Storage.read(list[i]) - yield { - info: read, - parts: await getParts(read.id), - } - } - }) - export const messages = fn( z.object({ sessionID: Identifier.schema("session"), @@ -291,7 +280,7 @@ export namespace Session { }), async (input) => { const result = [] as MessageV2.WithParts[] - for await (const msg of messageStream(input.sessionID)) { + for await (const msg of MessageV2.stream(input.sessionID)) { if (input.limit && result.length >= input.limit) break result.push(msg) } @@ -300,29 +289,6 @@ export namespace Session { }, ) - export const getMessage = fn( - z.object({ - sessionID: Identifier.schema("session"), - messageID: Identifier.schema("message"), - }), - async (input) => { - return { - info: await Storage.read(["message", input.sessionID, input.messageID]), - parts: await getParts(input.messageID), - } - }, - ) - - export const getParts = fn(Identifier.schema("message"), async (messageID) => { - const result = [] as MessageV2.Part[] - for (const item of await Storage.list(["part", messageID])) { - const read = await Storage.read(item) - result.push(read) - } - result.sort((a, b) => (a.id > b.id ? 1 : -1)) - return result - }) - export async function* list() { const project = Instance.project for (const item of await Storage.list(["session", project.id])) { diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 66d29319..bf15d734 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -12,6 +12,8 @@ import { import { Identifier } from "../id/id" import { LSP } from "../lsp" import { Snapshot } from "@/snapshot" +import { fn } from "@/util/fn" +import { Storage } from "@/storage/storage" export namespace MessageV2 { export const OutputLengthError = NamedError.create("MessageOutputLengthError", z.object({})) @@ -655,6 +657,39 @@ export namespace MessageV2 { return convertToModelMessages(result) } + export const stream = fn(Identifier.schema("session"), async function* (sessionID) { + const list = await Array.fromAsync(await Storage.list(["message", sessionID])) + for (let i = list.length - 1; i >= 0; i--) { + yield await get({ + sessionID, + messageID: list[i][2], + }) + } + }) + + export const parts = fn(Identifier.schema("message"), async (messageID) => { + const result = [] as MessageV2.Part[] + for (const item of await Storage.list(["part", messageID])) { + const read = await Storage.read(item) + result.push(read) + } + result.sort((a, b) => (a.id > b.id ? 1 : -1)) + return result + }) + + export const get = fn( + z.object({ + sessionID: Identifier.schema("session"), + messageID: Identifier.schema("message"), + }), + async (input) => { + return { + info: await Storage.read(["message", input.sessionID, input.messageID]), + parts: await parts(input.messageID), + } + }, + ) + export async function filterCompacted(stream: AsyncIterable) { const result = [] as MessageV2.WithParts[] for await (const msg of stream) { diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index cf11b129..f9480cd6 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -362,7 +362,7 @@ export namespace SessionPrompt { }) if (result.shouldRetry) { for (let retry = 1; retry < maxRetries; retry++) { - const lastRetryPart = result.parts.findLast((p) => p.type === "retry") + const lastRetryPart = result.parts.findLast((p): p is MessageV2.RetryPart => p.type === "retry") if (lastRetryPart) { const delayMs = SessionRetry.getRetryDelayInMs(lastRetryPart.error, retry) @@ -434,7 +434,7 @@ export namespace SessionPrompt { providerID: string signal: AbortSignal }) { - let msgs = await MessageV2.filterCompacted(Session.messageStream(input.sessionID)) + let msgs = await MessageV2.filterCompacted(MessageV2.stream(input.sessionID)) const lastAssistant = msgs.findLast((msg) => msg.info.role === "assistant") if ( lastAssistant?.info.role === "assistant" && @@ -1106,7 +1106,7 @@ export namespace SessionPrompt { }) toolcalls[value.toolCallId] = part as MessageV2.ToolPart - const parts = await Session.getParts(assistantMsg.id) + const parts = await MessageV2.parts(assistantMsg.id) const lastThree = parts.slice(-DOOM_LOOP_THRESHOLD) if ( lastThree.length === DOOM_LOOP_THRESHOLD && @@ -1319,7 +1319,7 @@ export namespace SessionPrompt { }) } } - const p = await Session.getParts(assistantMsg.id) + const p = await MessageV2.parts(assistantMsg.id) for (const part of p) { if ( part.type === "tool" && diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index 642611f8..312c3bba 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -35,7 +35,7 @@ export const TaskTool = Tool.define("task", async () => { parentID: ctx.sessionID, title: params.description + ` (@${agent.name} subagent)`, }) - const msg = await Session.getMessage({ sessionID: ctx.sessionID, messageID: ctx.messageID }) + const msg = await MessageV2.get({ sessionID: ctx.sessionID, messageID: ctx.messageID }) if (msg.info.role !== "assistant") throw new Error("Not an assistant message") ctx.metadata({