/ src / lib / server / memory / session-memory-scope.ts
session-memory-scope.ts
 1  import type { Session } from '@/types'
 2  import type { MemoryScopeFilter, MemoryScopeMode } from '@/lib/server/memory/memory-db'
 3  import { isDirectConnectorSession } from '@/lib/server/connectors/session-kind'
 4  
 5  type SessionMemoryShape = {
 6    id?: string | null
 7    agentId?: string | null
 8    memoryScopeMode?: MemoryScopeMode | string | null
 9    connectorContext?: Session['connectorContext'] | null
10    name?: string | null
11    user?: string | null
12  }
13  
14  function normalizeMemoryScopeMode(value: unknown): MemoryScopeMode | null {
15    if (value === null || value === undefined) return null
16    if (value === 'auto' || value === 'all' || value === 'global' || value === 'agent' || value === 'session' || value === 'project') {
17      return value
18    }
19    return null
20  }
21  
22  export function shouldForceSessionScopedConnectorMemory(session?: SessionMemoryShape | null): boolean {
23    if (!session) return false
24    return isDirectConnectorSession(session) && session.connectorContext?.isOwnerConversation !== true
25  }
26  
27  export function resolveEffectiveSessionMemoryScopeMode(
28    session?: SessionMemoryShape | null,
29    fallbackMode: MemoryScopeMode | null = null,
30  ): MemoryScopeMode | null {
31    if (shouldForceSessionScopedConnectorMemory(session)) return 'session'
32    const sessionMode = normalizeMemoryScopeMode(session?.memoryScopeMode)
33    return sessionMode || fallbackMode || null
34  }
35  
36  export function buildSessionMemoryScopeFilter(
37    session: SessionMemoryShape,
38    fallbackMode: MemoryScopeMode | null = null,
39    projectRoot: string | null = null,
40  ): MemoryScopeFilter {
41    return {
42      mode: resolveEffectiveSessionMemoryScopeMode(session, fallbackMode) || 'auto',
43      agentId: session.agentId ?? null,
44      sessionId: session.id ?? null,
45      projectRoot,
46    }
47  }