import * as plugins from './plugins.js'; import { codexQualifiedIdentity } from './functions.codexidentity.js'; import type { IControllerSessionSnapshotEntry, IReconcileControllerSessionSnapshotInput, TControllerSessionSnapshotResult, } from './classes.sessionidentityservice.js'; export const authStoreSessionIdentityCapability = Symbol( 'agl.authStoreSessionIdentityCapability', ); export const openCodeSessionIdentitySnapshotCapability = Symbol( 'agl.openCodeSessionIdentitySnapshotCapability', ); export interface IOpenCodeSessionIdentitySnapshot { sessions: IControllerSessionSnapshotEntry[]; } export interface IAuthStoreSessionIdentityCapability { [authStoreSessionIdentityCapability]( inputArg: IReconcileControllerSessionSnapshotInput, ): Promise; } export interface IOpenCodeSessionIdentitySnapshotCapability { [openCodeSessionIdentitySnapshotCapability]( directoryArg: string, signalArg?: AbortSignal, ): Promise; } const generationDigest = (domainArg: string, valuesArg: unknown[]): string => ( `${domainArg}:${plugins.crypto .createHash('sha256') .update(JSON.stringify([domainArg, ...valuesArg]), 'utf8') .digest('base64url')}` ); export const openCodeSessionProviderGeneration = ( nativeIdArg: string, createdAtArg: number, ): string => generationDigest('opencode-session-generation-v1', [nativeIdArg, createdAtArg]); export const codexSessionProviderGeneration = ( nativeIdArg: string, createdAtArg: number, ): string => { const identity = codexQualifiedIdentity(nativeIdArg); return identity ? generationDigest('codex-session-generation-v2', [identity.profileId, identity.rawThreadId, createdAtArg]) : generationDigest('codex-session-generation-v1', [nativeIdArg, createdAtArg]); }; export const flexSessionProviderGeneration = ( generationIdArg: string, generationSequenceArg: number, ): string => generationDigest( 'flex-session-generation-v1', [generationIdArg, generationSequenceArg], );