import type { ProviderInstanceId, ProviderDriverKind, ProviderSessionRuntimeStatus, RuntimeMode, ThreadId, } from "@t3tools/contracts"; import * as Option from "effect/Option"; import * as Context from "effect/Context"; import type * as Effect from "effect/Effect"; import type { ProviderSessionDirectoryPersistenceError, ProviderValidationError, } from "../Errors.ts"; export interface ProviderRuntimeBinding { readonly threadId: ThreadId; readonly provider: ProviderDriverKind; /** * Routing key for the configured provider instance that owns this * session. The persistence layer promotes legacy null rows before * exposing bindings; runtime callers must not infer this from `provider`. */ readonly providerInstanceId?: ProviderInstanceId; readonly adapterKey?: string; readonly status?: ProviderSessionRuntimeStatus; readonly resumeCursor?: unknown | null; readonly runtimePayload?: unknown | null; readonly runtimeMode?: RuntimeMode; } export interface ProviderRuntimeBindingWithMetadata extends ProviderRuntimeBinding { readonly lastSeenAt: string; } export type ProviderSessionDirectoryReadError = ProviderSessionDirectoryPersistenceError; export type ProviderSessionDirectoryWriteError = | ProviderValidationError | ProviderSessionDirectoryPersistenceError; export interface ProviderSessionDirectoryShape { readonly upsert: ( binding: ProviderRuntimeBinding, ) => Effect.Effect; readonly getProvider: ( threadId: ThreadId, ) => Effect.Effect; readonly getBinding: ( threadId: ThreadId, ) => Effect.Effect, ProviderSessionDirectoryReadError>; readonly listThreadIds: () => Effect.Effect< ReadonlyArray, ProviderSessionDirectoryPersistenceError >; readonly listBindings: () => Effect.Effect< ReadonlyArray, ProviderSessionDirectoryPersistenceError >; } export class ProviderSessionDirectory extends Context.Service< ProviderSessionDirectory, ProviderSessionDirectoryShape >()("t3/provider/Services/ProviderSessionDirectory") {}