Packages
fnord
0.9.14
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/memory/session.ex
defmodule Memory.Session do
# ----------------------------------------------------------------------------
# Behaviour Implementation
# ----------------------------------------------------------------------------
@behaviour Memory
# Session memories with these statuses have been promoted to long-term
# (project/global) storage by the indexer. They are excluded from list and
# search results to avoid redundancy with their long-term counterparts.
@promoted_statuses [:incorporated, :merged]
@impl Memory
def init() do
case get_conversation_pid() do
{:ok, _pid} -> :ok
error -> error
end
end
@impl Memory
def list() do
with {:ok, memories} <- get_conversation_memory() do
titles =
memories
|> Enum.reject(fn %Memory{index_status: s} -> s in @promoted_statuses end)
|> Enum.map(& &1.title)
{:ok, titles}
end
end
@impl Memory
def exists?(title) when is_binary(title) do
with {:ok, memories} <- get_conversation_memory() do
Enum.any?(memories, fn %Memory{title: t} -> t == title end)
else
_ -> false
end
end
@impl Memory
def read(title) when is_binary(title) do
with {:ok, memories} <- get_conversation_memory() do
memories
|> Enum.find(fn %Memory{title: t} -> t == title end)
|> case do
nil -> {:error, :not_found}
mem -> {:ok, mem}
end
end
end
@impl Memory
def save(%Memory{title: title} = memory) do
with {:ok, pid} <- get_conversation_pid(),
{:ok, memories} <- get_conversation_memory() do
updated =
memories
|> Enum.reject(fn %Memory{title: t} -> t == title end)
|> Kernel.++([memory])
|> Enum.map(fn
%Memory{scope: :session, index_status: nil} = m -> %{m | index_status: :new}
m -> m
end)
Services.Conversation.put_memory(pid, updated)
:ok
end
end
@impl Memory
def forget(title) when is_binary(title) do
with {:ok, pid} <- get_conversation_pid(),
{:ok, memories} <- get_conversation_memory() do
updated = Enum.reject(memories, fn %Memory{title: t} -> t == title end)
Services.Conversation.put_memory(pid, updated)
:ok
end
end
@impl Memory
def is_available?() do
case get_conversation_pid() do
{:ok, _pid} -> true
_ -> false
end
end
# ----------------------------------------------------------------------------
# Internals
# ----------------------------------------------------------------------------
defp get_conversation_pid() do
Services.Globals.get_env(:fnord, :current_conversation)
|> case do
nil -> {:error, :no_conversation_set}
pid when is_pid(pid) -> {:ok, pid}
_ -> {:error, :invalid_conversation}
end
end
defp get_conversation_memory() do
with {:ok, pid} <- get_conversation_pid() do
{:ok, Services.Conversation.get_memory(pid)}
end
end
end