import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as S from "effect/Schema"; import { AgentId } from "../Agent.ts"; import { StreamTextPart } from "../llm/stream-text-part.ts"; import { Task, TaskId } from "../process/task.ts"; import { ChannelId } from "./channel.ts"; import { Message, MessageId } from "./message.ts"; import { Thread, ThreadId } from "./thread.ts"; export type SenderId = string; export const SenderId = S.String.annotate({ description: "The ID of the Agent or User who sent the message", }); export class GetThreadRequest extends S.Class( "GetThreadRequest", )({ threadId: ThreadId, }) {} export class GetThreadResponse extends S.Class( "GetThreadResponse", )({ thread: S.optional(Thread), }) {} export class CreateThreadRequest extends S.Class( "CreateThreadRequest", )({ channelId: ChannelId, parentThreadId: S.optional(ThreadId), }) {} export class CreateThreadResponse extends S.Class( "CreateThreadResponse", )({ thread: Thread, }) {} export class SendMessageRequest extends S.Class( "SendMessageRequest", )({ threadId: ThreadId, sender: SenderId, content: S.String, }) {} export class SendMessageResponse extends S.Class( "SendMessageResponse", )({ messageId: MessageId, }) {} export class ListMessagesRequest extends S.Class( "ListMessagesRequest", )({ threadId: ThreadId, nextToken: S.optional(S.String), }) {} export class ListMessagesResponse extends S.Class( "ListMessagesResponse", )({ messages: S.Array(Message), nextToken: S.optional(S.String), }) {} export class ListThreadsRequest extends S.Class( "ListThreadsRequest", )({ channelId: ChannelId, nextToken: S.optional(S.String), }) {} export class ListThreadsResponse extends S.Class( "ListThreadsResponse", )({ threads: S.Array(Thread), nextToken: S.optional(S.String), }) {} export class AppendRequest extends S.Class("AppendRequest")({ taskId: TaskId, part: StreamTextPart, }) {} export class SubscribeRequest extends S.Class( "SubscribeRequest", )({ taskId: TaskId, }) {} export class CreateTaskRequest extends S.Class( "CreateTaskRequest", )({ threadId: ThreadId, agentId: AgentId, }) {} /** * The ChatService is the central service for managing Channels, Threads, and Messages. */ export class Chat extends Context.Service< Chat, { getThread: (request: GetThreadRequest) => Effect.Effect; createThread: ( request: CreateThreadRequest, ) => Effect.Effect; listThreads: ( request: ListThreadsRequest, ) => Effect.Effect; sendMessage: ( request: SendMessageRequest, ) => Effect.Effect; listMessages: ( request: ListMessagesRequest, ) => Effect.Effect; subscribe: (request: SubscribeRequest) => Effect.Effect; createTask: (request: CreateTaskRequest) => Effect.Effect; appendTask: (request: AppendRequest) => Effect.Effect; subscribeTask: (request: SubscribeRequest) => Effect.Effect; sinkTask: ( taskId: TaskId, sink: (part: StreamTextPart) => Effect.Effect, ) => Effect.Effect; sinkThreadDriver: ( threadId: ThreadId, sink: (part: StreamTextPart) => Effect.Effect, ) => Effect.Effect; } >()("Chat") {}