export declare const SESSION_MODE: { readonly LOCKED: "locked"; }; export type SessionMode = (typeof SESSION_MODE)[keyof typeof SESSION_MODE]; export type WidgetSessionConfig = { id?: string; mode?: SessionMode; }; export declare const isSessionLocked: (session: WidgetSessionConfig | undefined) => boolean; export declare const isKnownSessionMode: (mode: unknown) => mode is "locked"; export declare const lockedSessionId: (session: WidgetSessionConfig | undefined) => string | undefined; export declare const SESSION_FOCUS: { readonly REQUEST_RESPONSE: "request-response"; readonly RESPONSE_ONLY: "response-only"; readonly REQUEST_ONLY: "request-only"; }; export type SessionFocus = (typeof SESSION_FOCUS)[keyof typeof SESSION_FOCUS]; /** * Which slice of the transcript shows, as a pair of indexes over its messages. Both ends are * inclusive and zero-based, and a negative index counts from the end — `-1` is the last message. * Mirrors Core's `SessionScopeRange`. */ export type SessionScopeRange = { from: number; to: number; }; export type DeploymentSessionScope = { sessionId: string | null; mode: SessionMode | 'unlocked'; focus: SessionFocus; messages: 'all' | SessionScopeRange; /** The owner opted into letting this embed name its own conversation. */ allowClientSession: boolean; }; export declare const readDeploymentSessionScope: (config: unknown) => DeploymentSessionScope | undefined; /** * A lock is only meaningful alongside the conversation it pins. A scope that names no session * but claims `locked` would leave the widget with nothing to render and no composer to type in, * so it is treated as unlocked rather than bricking the mount. */ export declare const isDeploymentScopeLocked: (scope: DeploymentSessionScope | undefined) => boolean;