Packages
fnord
0.7.24
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/cmd/default.ex
defmodule Cmd.Default do
@moduledoc """
Converses with the default AI agent.
Conversations are a "floating window" of messages that are stored in the
default project.
"""
@behaviour Cmd
@impl Cmd
def requires_project?, do: false
@impl Cmd
def spec() do
[
default: [
name: "default",
about: """
Converse with the default AI agent. This feature is *alpha* and not
fully functional yet. It uses the current directory to determine
whether it is within a project context. If called from within a
previously indexed project's directory, it can use the research tools,
but it cannot yet access the project's notes or past research. Please
open an issue if you notice any bugs.
Usage: fnord "<prompt>"
"""
]
]
end
@impl Cmd
def run(_opts, _subcommands, []) do
IO.puts(:stderr, "Error: Missing required positional argument 'prompt'.")
end
def run(_opts, _subcommands, [prompt]) do
with {:ok, result} <- AI.Agent.Default.get_response(%{prompt: prompt}) do
UI.say(result.response)
# Allow time for the response to be displayed before rolling up to avoid
# the confirmation prompt being shown before beam flushes stdout.
Process.sleep(100)
maybe_rollup(result.usage, result.num_msgs)
end
end
# ----------------------------------------------------------------------------
# Rollups: Archive older messages as a summary when the size of the
# conversation exceeds a threshold based on the model's context window.
# ----------------------------------------------------------------------------
@rollup_prompt """
The conversation is beginning to fill the context window. Would you like to
archive older messages? Older messages will be archived as a monthly summary
for reference. The AI will continue to have access to those summaries.
"""
@rollup_context_threshold 0.5
defp maybe_rollup(usage, num_msgs) do
UI.log_usage(AI.Agent.Default.model(), usage)
UI.info("Conversation length: #{num_msgs} messages")
if usage / AI.Agent.Default.model().context > @rollup_context_threshold do
if UI.confirm(@rollup_prompt) do
last_interaction = Store.DefaultProject.Conversation.last_interaction()
AI.Agent.Default.Rollups.get_response(%{})
|> case do
{:ok, summaries} ->
Store.DefaultProject.Conversation.replace_messages(summaries ++ last_interaction)
UI.info("Summarized and archived older messages.")
{:error, reason} ->
UI.error("Failed to generate summaries: #{reason}")
end
else
UI.info("Conversation not consolidated.")
end
end
end
end