refactor: unwrap session/ tier-2 namespaces + self-reexport (#22973)
This commit is contained in:
@@ -17,7 +17,6 @@ import { Effect, Layer, Context } from "effect"
|
||||
import { InstanceState } from "@/effect"
|
||||
import { isOverflow as overflow } from "./overflow"
|
||||
|
||||
export namespace SessionCompaction {
|
||||
const log = Log.create({ service: "session.compaction" })
|
||||
|
||||
export const Event = {
|
||||
@@ -409,4 +408,5 @@ When constructing the summary, try to stick to this template:
|
||||
Layer.provide(Config.defaultLayer),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
export * as SessionCompaction from "./compaction"
|
||||
|
||||
@@ -50,7 +50,6 @@ function extract(messages: MessageV2.WithParts[]) {
|
||||
return paths
|
||||
}
|
||||
|
||||
export namespace Instruction {
|
||||
export interface Interface {
|
||||
readonly clear: (messageID: MessageID) => Effect.Effect<void>
|
||||
readonly systemPaths: () => Effect.Effect<Set<string>, AppFileSystem.Error>
|
||||
@@ -240,4 +239,5 @@ export namespace Instruction {
|
||||
export function loaded(messages: MessageV2.WithParts[]) {
|
||||
return extract(messages)
|
||||
}
|
||||
}
|
||||
|
||||
export * as Instruction from "./instruction"
|
||||
|
||||
@@ -25,7 +25,6 @@ import { EffectBridge } from "@/effect"
|
||||
import * as Option from "effect/Option"
|
||||
import * as OtelTracer from "@effect/opentelemetry/Tracer"
|
||||
|
||||
export namespace LLM {
|
||||
const log = Log.create({ service: "llm" })
|
||||
export const OUTPUT_TOKEN_MAX = ProviderTransform.OUTPUT_TOKEN_MAX
|
||||
type Result = Awaited<ReturnType<typeof streamText>>
|
||||
@@ -450,4 +449,5 @@ export namespace LLM {
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
export * as LLM from "./llm"
|
||||
|
||||
@@ -24,7 +24,6 @@ interface FetchDecompressionError extends Error {
|
||||
path: string
|
||||
}
|
||||
|
||||
export namespace MessageV2 {
|
||||
export const SYNTHETIC_ATTACHMENT_PROMPT = "Attached image(s) from tool result:"
|
||||
|
||||
export function isMedia(mime: string) {
|
||||
@@ -534,7 +533,7 @@ export namespace MessageV2 {
|
||||
...row.data,
|
||||
id: row.id,
|
||||
sessionID: row.session_id,
|
||||
}) as MessageV2.Info
|
||||
}) as Info
|
||||
|
||||
const part = (row: typeof PartTable.$inferSelect) =>
|
||||
({
|
||||
@@ -542,7 +541,7 @@ export namespace MessageV2 {
|
||||
id: row.id,
|
||||
sessionID: row.session_id,
|
||||
messageID: row.message_id,
|
||||
}) as MessageV2.Part
|
||||
}) as Part
|
||||
|
||||
const older = (row: Cursor) =>
|
||||
or(
|
||||
@@ -552,7 +551,7 @@ export namespace MessageV2 {
|
||||
|
||||
function hydrate(rows: (typeof MessageTable.$inferSelect)[]) {
|
||||
const ids = rows.map((row) => row.id)
|
||||
const partByMessage = new Map<string, MessageV2.Part[]>()
|
||||
const partByMessage = new Map<string, Part[]>()
|
||||
if (ids.length > 0) {
|
||||
const partRows = Database.use((db) =>
|
||||
db
|
||||
@@ -699,7 +698,7 @@ export namespace MessageV2 {
|
||||
if (
|
||||
msg.info.error &&
|
||||
!(
|
||||
MessageV2.AbortedError.isInstance(msg.info.error) &&
|
||||
AbortedError.isInstance(msg.info.error) &&
|
||||
msg.parts.some((part) => part.type !== "step-start" && part.type !== "reasoning")
|
||||
)
|
||||
) {
|
||||
@@ -865,7 +864,7 @@ export namespace MessageV2 {
|
||||
)
|
||||
if (!row) throw new NotFoundError({ message: `Session not found: ${input.sessionID}` })
|
||||
return {
|
||||
items: [] as MessageV2.WithParts[],
|
||||
items: [] as WithParts[],
|
||||
more: false,
|
||||
}
|
||||
}
|
||||
@@ -907,7 +906,7 @@ export namespace MessageV2 {
|
||||
id: row.id,
|
||||
sessionID: row.session_id,
|
||||
messageID: row.message_id,
|
||||
}) as MessageV2.Part,
|
||||
}) as Part,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -926,8 +925,8 @@ export namespace MessageV2 {
|
||||
}
|
||||
}
|
||||
|
||||
export function filterCompacted(msgs: Iterable<MessageV2.WithParts>) {
|
||||
const result = [] as MessageV2.WithParts[]
|
||||
export function filterCompacted(msgs: Iterable<WithParts>) {
|
||||
const result = [] as WithParts[]
|
||||
const completed = new Set<string>()
|
||||
for (const msg of msgs) {
|
||||
result.push(msg)
|
||||
@@ -954,16 +953,16 @@ export namespace MessageV2 {
|
||||
): NonNullable<Assistant["error"]> {
|
||||
switch (true) {
|
||||
case e instanceof DOMException && e.name === "AbortError":
|
||||
return new MessageV2.AbortedError(
|
||||
return new AbortedError(
|
||||
{ message: e.message },
|
||||
{
|
||||
cause: e,
|
||||
},
|
||||
).toObject()
|
||||
case MessageV2.OutputLengthError.isInstance(e):
|
||||
case OutputLengthError.isInstance(e):
|
||||
return e
|
||||
case LoadAPIKeyError.isInstance(e):
|
||||
return new MessageV2.AuthError(
|
||||
return new AuthError(
|
||||
{
|
||||
providerID: ctx.providerID,
|
||||
message: e.message,
|
||||
@@ -971,7 +970,7 @@ export namespace MessageV2 {
|
||||
{ cause: e },
|
||||
).toObject()
|
||||
case (e as SystemError)?.code === "ECONNRESET":
|
||||
return new MessageV2.APIError(
|
||||
return new APIError(
|
||||
{
|
||||
message: "Connection reset by server",
|
||||
isRetryable: true,
|
||||
@@ -985,9 +984,9 @@ export namespace MessageV2 {
|
||||
).toObject()
|
||||
case e instanceof Error && (e as FetchDecompressionError).code === "ZlibError":
|
||||
if (ctx.aborted) {
|
||||
return new MessageV2.AbortedError({ message: e.message }, { cause: e }).toObject()
|
||||
return new AbortedError({ message: e.message }, { cause: e }).toObject()
|
||||
}
|
||||
return new MessageV2.APIError(
|
||||
return new APIError(
|
||||
{
|
||||
message: "Response decompression failed",
|
||||
isRetryable: true,
|
||||
@@ -1004,7 +1003,7 @@ export namespace MessageV2 {
|
||||
error: e,
|
||||
})
|
||||
if (parsed.type === "context_overflow") {
|
||||
return new MessageV2.ContextOverflowError(
|
||||
return new ContextOverflowError(
|
||||
{
|
||||
message: parsed.message,
|
||||
responseBody: parsed.responseBody,
|
||||
@@ -1013,7 +1012,7 @@ export namespace MessageV2 {
|
||||
).toObject()
|
||||
}
|
||||
|
||||
return new MessageV2.APIError(
|
||||
return new APIError(
|
||||
{
|
||||
message: parsed.message,
|
||||
statusCode: parsed.statusCode,
|
||||
@@ -1031,7 +1030,7 @@ export namespace MessageV2 {
|
||||
const parsed = ProviderError.parseStreamError(e)
|
||||
if (parsed) {
|
||||
if (parsed.type === "context_overflow") {
|
||||
return new MessageV2.ContextOverflowError(
|
||||
return new ContextOverflowError(
|
||||
{
|
||||
message: parsed.message,
|
||||
responseBody: parsed.responseBody,
|
||||
@@ -1039,7 +1038,7 @@ export namespace MessageV2 {
|
||||
{ cause: e },
|
||||
).toObject()
|
||||
}
|
||||
return new MessageV2.APIError(
|
||||
return new APIError(
|
||||
{
|
||||
message: parsed.message,
|
||||
isRetryable: parsed.isRetryable,
|
||||
@@ -1054,4 +1053,5 @@ export namespace MessageV2 {
|
||||
return new NamedError.Unknown({ message: JSON.stringify(e) }, { cause: e }).toObject()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export * as MessageV2 from "./message-v2"
|
||||
|
||||
@@ -3,7 +3,6 @@ import { SessionID } from "./schema"
|
||||
import { ModelID, ProviderID } from "../provider/schema"
|
||||
import { NamedError } from "@opencode-ai/shared/util/error"
|
||||
|
||||
export namespace Message {
|
||||
export const OutputLengthError = NamedError.create("MessageOutputLengthError", z.object({}))
|
||||
export const AuthError = NamedError.create(
|
||||
"ProviderAuthError",
|
||||
@@ -188,4 +187,5 @@ export namespace Message {
|
||||
ref: "Message",
|
||||
})
|
||||
export type Info = z.infer<typeof Info>
|
||||
}
|
||||
|
||||
export * as Message from "./message"
|
||||
|
||||
@@ -21,7 +21,6 @@ import { errorMessage } from "@/util/error"
|
||||
import { Log } from "@/util"
|
||||
import { isRecord } from "@/util/record"
|
||||
|
||||
export namespace SessionProcessor {
|
||||
const DOOM_LOOP_THRESHOLD = 3
|
||||
const log = Log.create({ service: "session.processor" })
|
||||
|
||||
@@ -616,4 +615,5 @@ export namespace SessionProcessor {
|
||||
Layer.provide(Config.defaultLayer),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
export * as SessionProcessor from "./processor"
|
||||
|
||||
@@ -64,7 +64,6 @@ IMPORTANT:
|
||||
|
||||
const STRUCTURED_OUTPUT_SYSTEM_PROMPT = `IMPORTANT: The user has requested structured output. You MUST use the StructuredOutput tool to provide your final response. Do NOT respond with plain text - you MUST call the StructuredOutput tool with your answer formatted according to the schema.`
|
||||
|
||||
export namespace SessionPrompt {
|
||||
const log = Log.create({ service: "session.prompt" })
|
||||
const elog = EffectLogger.create({ service: "session.prompt" })
|
||||
|
||||
@@ -1851,4 +1850,5 @@ NOTE: At any point in time through this workflow you should feel free to ask the
|
||||
const argsRegex = /(?:\[Image\s+\d+\]|"[^"]*"|'[^']*'|[^\s"']+)/gi
|
||||
const placeholderRegex = /\$(\d+)/g
|
||||
const quoteTrimRegex = /^["']|["']$/g
|
||||
}
|
||||
|
||||
export * as SessionPrompt from "./prompt"
|
||||
|
||||
@@ -3,7 +3,6 @@ import { Cause, Clock, Duration, Effect, Schedule } from "effect"
|
||||
import { MessageV2 } from "./message-v2"
|
||||
import { iife } from "@/util/iife"
|
||||
|
||||
export namespace SessionRetry {
|
||||
export type Err = ReturnType<NamedError["toObject"]>
|
||||
|
||||
// This exported message is shared with the TUI upsell detector. Matching on a
|
||||
@@ -122,4 +121,5 @@ export namespace SessionRetry {
|
||||
}),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export * as SessionRetry from "./retry"
|
||||
|
||||
@@ -11,7 +11,6 @@ import { SessionID, MessageID, PartID } from "./schema"
|
||||
import { SessionRunState } from "./run-state"
|
||||
import { SessionSummary } from "./summary"
|
||||
|
||||
export namespace SessionRevert {
|
||||
const log = Log.create({ service: "session.revert" })
|
||||
|
||||
export const RevertInput = z.object({
|
||||
@@ -158,4 +157,5 @@ export namespace SessionRevert {
|
||||
Layer.provide(SessionSummary.defaultLayer),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
export * as SessionRevert from "./revert"
|
||||
|
||||
@@ -6,7 +6,6 @@ import { MessageV2 } from "./message-v2"
|
||||
import { SessionID } from "./schema"
|
||||
import { SessionStatus } from "./status"
|
||||
|
||||
export namespace SessionRunState {
|
||||
export interface Interface {
|
||||
readonly assertNotBusy: (sessionID: SessionID) => Effect.Effect<void>
|
||||
readonly cancel: (sessionID: SessionID) => Effect.Effect<void>
|
||||
@@ -105,4 +104,5 @@ export namespace SessionRunState {
|
||||
)
|
||||
|
||||
export const defaultLayer = layer.pipe(Layer.provide(SessionStatus.defaultLayer))
|
||||
}
|
||||
|
||||
export * as SessionRunState from "./run-state"
|
||||
|
||||
@@ -5,7 +5,6 @@ import { SessionID } from "./schema"
|
||||
import { Effect, Layer, Context } from "effect"
|
||||
import z from "zod"
|
||||
|
||||
export namespace SessionStatus {
|
||||
export const Info = z
|
||||
.union([
|
||||
z.object({
|
||||
@@ -85,4 +84,5 @@ export namespace SessionStatus {
|
||||
)
|
||||
|
||||
export const defaultLayer = layer.pipe(Layer.provide(Bus.layer))
|
||||
}
|
||||
|
||||
export * as SessionStatus from "./status"
|
||||
|
||||
@@ -7,7 +7,6 @@ import * as Session from "./session"
|
||||
import { MessageV2 } from "./message-v2"
|
||||
import { SessionID, MessageID } from "./schema"
|
||||
|
||||
export namespace SessionSummary {
|
||||
function unquoteGitPath(input: string) {
|
||||
if (!input.startsWith('"')) return input
|
||||
if (!input.endsWith('"')) return input
|
||||
@@ -162,4 +161,5 @@ export namespace SessionSummary {
|
||||
sessionID: SessionID.zod,
|
||||
messageID: MessageID.zod.optional(),
|
||||
})
|
||||
}
|
||||
|
||||
export * as SessionSummary from "./summary"
|
||||
|
||||
@@ -16,7 +16,6 @@ import type { Agent } from "@/agent/agent"
|
||||
import { Permission } from "@/permission"
|
||||
import { Skill } from "@/skill"
|
||||
|
||||
export namespace SystemPrompt {
|
||||
export function provider(model: Provider.Model) {
|
||||
if (model.api.id.includes("gpt-4") || model.api.id.includes("o1") || model.api.id.includes("o3"))
|
||||
return [PROMPT_BEAST]
|
||||
@@ -81,4 +80,5 @@ export namespace SystemPrompt {
|
||||
)
|
||||
|
||||
export const defaultLayer = layer.pipe(Layer.provide(Skill.defaultLayer))
|
||||
}
|
||||
|
||||
export * as SystemPrompt from "./system"
|
||||
|
||||
@@ -6,7 +6,6 @@ import z from "zod"
|
||||
import { Database, eq, asc } from "../storage"
|
||||
import { TodoTable } from "./session.sql"
|
||||
|
||||
export namespace Todo {
|
||||
export const Info = z
|
||||
.object({
|
||||
content: z.string().describe("Brief description of the task"),
|
||||
@@ -82,4 +81,5 @@ export namespace Todo {
|
||||
)
|
||||
|
||||
export const defaultLayer = layer.pipe(Layer.provide(Bus.layer))
|
||||
}
|
||||
|
||||
export * as Todo from "./todo"
|
||||
|
||||
Reference in New Issue
Block a user