import type { AuthClientMetadata, AuthClientSession, AuthPairingLink, AuthSessionId, } from "@t3tools/contracts"; import { Data, DateTime, Duration, Effect, Context } from "effect"; import type { SessionRole } from "./SessionCredentialService.ts"; export const DEFAULT_SESSION_SUBJECT = "cli-issued-session"; export interface IssuedPairingLink { readonly id: string; readonly credential: string; readonly role: SessionRole; readonly subject: string; readonly label?: string; readonly createdAt: DateTime.Utc; readonly expiresAt: DateTime.Utc; } export interface IssuedBearerSession { readonly sessionId: AuthSessionId; readonly token: string; readonly method: "bearer-session-token"; readonly role: SessionRole; readonly subject: string; readonly client: AuthClientMetadata; readonly expiresAt: DateTime.Utc; } export class AuthControlPlaneError extends Data.TaggedError("AuthControlPlaneError")<{ readonly message: string; readonly cause?: unknown; }> {} export interface AuthControlPlaneShape { readonly createPairingLink: (input?: { readonly ttl?: Duration.Duration; readonly label?: string; readonly role?: SessionRole; readonly subject?: string; }) => Effect.Effect; readonly listPairingLinks: (input?: { readonly role?: SessionRole; readonly excludeSubjects?: ReadonlyArray; }) => Effect.Effect, AuthControlPlaneError>; readonly revokePairingLink: (id: string) => Effect.Effect; readonly issueSession: (input?: { readonly ttl?: Duration.Duration; readonly subject?: string; readonly role?: SessionRole; readonly label?: string; }) => Effect.Effect; readonly listSessions: () => Effect.Effect< ReadonlyArray, AuthControlPlaneError >; readonly revokeSession: ( sessionId: AuthSessionId, ) => Effect.Effect; readonly revokeOtherSessionsExcept: ( sessionId: AuthSessionId, ) => Effect.Effect; } export class AuthControlPlane extends Context.Service()( "t3/AuthControlPlane", ) {}