refactor(core): move v1 schemas into core (#30473)

This commit is contained in:
Dax
2026-06-03 02:42:13 +00:00
committed by GitHub
parent 0543fd29c8
commit 83452558f7
129 changed files with 1578 additions and 1227 deletions
+22 -21
View File
@@ -1,4 +1,5 @@
import { SessionLegacy } from "@opencode-ai/core/session/legacy"
import { SessionV1 } from "@opencode-ai/core/v1/session"
import { ConfigV1 } from "@opencode-ai/core/v1/config/config"
import { Session } from "./session"
import { SessionID, MessageID, PartID } from "./schema"
import { Provider } from "@/provider/provider"
@@ -93,9 +94,9 @@ type CompletedCompaction = {
summary: string | undefined
}
function summaryText(message: SessionLegacy.WithParts) {
function summaryText(message: SessionV1.WithParts) {
const text = message.parts
.filter((part): part is SessionLegacy.TextPart => part.type === "text")
.filter((part): part is SessionV1.TextPart => part.type === "text")
.map((part) => part.text.trim())
.filter(Boolean)
.join("\n\n")
@@ -103,7 +104,7 @@ function summaryText(message: SessionLegacy.WithParts) {
return text || undefined
}
function completedCompactions(messages: SessionLegacy.WithParts[]) {
function completedCompactions(messages: SessionV1.WithParts[]) {
const users = new Map<MessageID, number>()
for (let i = 0; i < messages.length; i++) {
const msg = messages[i]
@@ -134,14 +135,14 @@ function buildPrompt(input: { previousSummary?: string; context: string[] }) {
return [anchor, SUMMARY_TEMPLATE, ...input.context].join("\n\n")
}
function preserveRecentBudget(input: { cfg: Config.Info; model: Provider.Model }) {
function preserveRecentBudget(input: { cfg: ConfigV1.Info; model: Provider.Model }) {
return (
input.cfg.compaction?.preserve_recent_tokens ??
Math.min(MAX_PRESERVE_RECENT_TOKENS, Math.max(MIN_PRESERVE_RECENT_TOKENS, Math.floor(usable(input) * 0.25)))
)
}
function turns(messages: SessionLegacy.WithParts[]) {
function turns(messages: SessionV1.WithParts[]) {
const result: Turn[] = []
for (let i = 0; i < messages.length; i++) {
const msg = messages[i]
@@ -160,11 +161,11 @@ function turns(messages: SessionLegacy.WithParts[]) {
}
function splitTurn(input: {
messages: SessionLegacy.WithParts[]
messages: SessionV1.WithParts[]
turn: Turn
model: Provider.Model
budget: number
estimate: (input: { messages: SessionLegacy.WithParts[]; model: Provider.Model }) => Effect.Effect<number>
estimate: (input: { messages: SessionV1.WithParts[]; model: Provider.Model }) => Effect.Effect<number>
}) {
return Effect.gen(function* () {
if (input.budget <= 0) return undefined
@@ -186,13 +187,13 @@ function splitTurn(input: {
export interface Interface {
readonly isOverflow: (input: {
tokens: SessionLegacy.Assistant["tokens"]
tokens: SessionV1.Assistant["tokens"]
model: Provider.Model
}) => Effect.Effect<boolean>
readonly prune: (input: { sessionID: SessionID }) => Effect.Effect<void>
readonly process: (input: {
parentID: MessageID
messages: SessionLegacy.WithParts[]
messages: SessionV1.WithParts[]
sessionID: SessionID
auto: boolean
overflow?: boolean
@@ -223,7 +224,7 @@ export const layer = Layer.effect(
const flags = yield* RuntimeFlags.Service
const isOverflow = Effect.fn("SessionCompaction.isOverflow")(function* (input: {
tokens: SessionLegacy.Assistant["tokens"]
tokens: SessionV1.Assistant["tokens"]
model: Provider.Model
}) {
return overflow({
@@ -235,7 +236,7 @@ export const layer = Layer.effect(
})
const estimate = Effect.fn("SessionCompaction.estimate")(function* (input: {
messages: SessionLegacy.WithParts[]
messages: SessionV1.WithParts[]
model: Provider.Model
}) {
const msgs = yield* MessageV2.toModelMessagesEffect(input.messages, input.model)
@@ -243,8 +244,8 @@ export const layer = Layer.effect(
})
const select = Effect.fn("SessionCompaction.select")(function* (input: {
messages: SessionLegacy.WithParts[]
cfg: Config.Info
messages: SessionV1.WithParts[]
cfg: ConfigV1.Info
model: Provider.Model
}) {
const limit = input.cfg.compaction?.tail_turns ?? DEFAULT_TAIL_TURNS
@@ -307,7 +308,7 @@ export const layer = Layer.effect(
let total = 0
let pruned = 0
const toPrune: SessionLegacy.ToolPart[] = []
const toPrune: SessionV1.ToolPart[] = []
let turns = 0
loop: for (let msgIndex = msgs.length - 1; msgIndex >= 0; msgIndex--) {
@@ -343,7 +344,7 @@ export const layer = Layer.effect(
const processCompaction = Effect.fn("SessionCompaction.process")(function* (input: {
parentID: MessageID
messages: SessionLegacy.WithParts[]
messages: SessionV1.WithParts[]
sessionID: SessionID
auto: boolean
overflow?: boolean
@@ -354,14 +355,14 @@ export const layer = Layer.effect(
}
const userMessage = parent.info
const compactionPart = parent.parts.find(
(part): part is SessionLegacy.CompactionPart => part.type === "compaction",
(part): part is SessionV1.CompactionPart => part.type === "compaction",
)
let messages = input.messages
let replay:
| {
info: SessionLegacy.User
parts: SessionLegacy.Part[]
info: SessionV1.User
parts: SessionV1.Part[]
}
| undefined
if (input.overflow) {
@@ -410,7 +411,7 @@ export const layer = Layer.effect(
toolOutputMaxChars: TOOL_OUTPUT_MAX_CHARS,
})
const ctx = yield* InstanceState.context
const msg: SessionLegacy.Assistant = {
const msg: SessionV1.Assistant = {
id: MessageID.ascending(),
role: "assistant",
parentID: input.parentID,
@@ -459,7 +460,7 @@ export const layer = Layer.effect(
})
if (result === "compact") {
processor.message.error = new SessionLegacy.ContextOverflowError({
processor.message.error = new SessionV1.ContextOverflowError({
message: replay
? "Conversation history too large to compact - exceeds model context limit"
: "Session too large to compact - context exceeds model limit even after stripping media",