| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import { SessionV2 } from "@opencode-ai/core/session"
- import { SessionMessage } from "@opencode-ai/core/session/message"
- import { Schema } from "effect"
- import { HttpApiEndpoint, HttpApiGroup, OpenApi } from "effect/unstable/httpapi"
- import { InvalidCursorError, SessionNotFoundError, UnknownError } from "../errors"
- import { SessionLocationMiddleware } from "../middleware/session-location"
- export const SessionMessagesQuery = Schema.Struct({
- limit: Schema.optional(
- Schema.NumberFromString.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(200)),
- ).annotate({
- description: "Maximum number of messages to return. When omitted, the endpoint returns its default page size.",
- }),
- order: Schema.optional(Schema.Union([Schema.Literal("asc"), Schema.Literal("desc")])).annotate({
- description: "Message order for the first page. Use desc for newest first or asc for oldest first.",
- }),
- cursor: Schema.optional(
- Schema.String.annotate({
- description:
- "Opaque pagination cursor returned as cursor.previous or cursor.next in the previous response. Do not combine with order.",
- }),
- ),
- }).annotate({ identifier: "SessionMessagesQuery" })
- export const MessageGroup = HttpApiGroup.make("server.message")
- .add(
- HttpApiEndpoint.get("session.messages", "/api/session/:sessionID/message", {
- params: { sessionID: SessionV2.ID },
- query: SessionMessagesQuery,
- success: Schema.Struct({
- data: Schema.Array(SessionMessage.Message),
- cursor: Schema.Struct({
- previous: Schema.String.pipe(Schema.optional),
- next: Schema.String.pipe(Schema.optional),
- }),
- }).annotate({ identifier: "SessionMessagesResponse" }),
- error: [InvalidCursorError, SessionNotFoundError, UnknownError],
- })
- .middleware(SessionLocationMiddleware)
- .annotateMerge(
- OpenApi.annotations({
- identifier: "v2.session.messages",
- summary: "Get session messages",
- description:
- "Retrieve projected messages for a session. Items keep the requested order across pages; use cursor.next or cursor.previous to move through the ordered timeline.",
- }),
- ),
- )
- .annotateMerge(
- OpenApi.annotations({
- title: "messages",
- description: "Experimental message routes.",
- }),
- )
|