/** * ProjectionThreadSessionRepository - Repository interface for thread sessions. * * Owns persistence operations for projected provider-session linkage and * runtime status for each thread. * * @module ProjectionThreadSessionRepository */ import { RuntimeMode, IsoDateTime, OrchestrationSessionStatus, ProviderInstanceId, ThreadId, TurnId, } from "@t3tools/contracts"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import * as Context from "effect/Context"; import type * as Effect from "effect/Effect"; import type { ProjectionRepositoryError } from "../Errors.ts"; export const ProjectionThreadSession = Schema.Struct({ threadId: ThreadId, status: OrchestrationSessionStatus, providerName: Schema.NullOr(Schema.String), providerInstanceId: Schema.NullOr(ProviderInstanceId), runtimeMode: RuntimeMode, activeTurnId: Schema.NullOr(TurnId), lastError: Schema.NullOr(Schema.String), updatedAt: IsoDateTime, }); export type ProjectionThreadSession = typeof ProjectionThreadSession.Type; export const GetProjectionThreadSessionInput = Schema.Struct({ threadId: ThreadId, }); export type GetProjectionThreadSessionInput = typeof GetProjectionThreadSessionInput.Type; export const DeleteProjectionThreadSessionInput = Schema.Struct({ threadId: ThreadId, }); export type DeleteProjectionThreadSessionInput = typeof DeleteProjectionThreadSessionInput.Type; /** * ProjectionThreadSessionRepositoryShape - Service API for projected thread sessions. */ export interface ProjectionThreadSessionRepositoryShape { /** * Insert or replace a projected thread-session row. * * Upserts by `threadId`. */ readonly upsert: (row: ProjectionThreadSession) => Effect.Effect; /** * Read projected thread-session state by thread id. */ readonly getByThreadId: ( input: GetProjectionThreadSessionInput, ) => Effect.Effect, ProjectionRepositoryError>; /** * Delete projected thread-session state by thread id. */ readonly deleteByThreadId: ( input: DeleteProjectionThreadSessionInput, ) => Effect.Effect; } /** * ProjectionThreadSessionRepository - Service tag for thread-session persistence. */ export class ProjectionThreadSessionRepository extends Context.Service< ProjectionThreadSessionRepository, ProjectionThreadSessionRepositoryShape >()("t3/persistence/Services/ProjectionThreadSessions/ProjectionThreadSessionRepository") {}