Packages
fnord
0.6.5
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/ai/tools/file/spelunker.ex
defmodule AI.Tools.File.Spelunker do
@behaviour AI.Tools
@impl AI.Tools
def ui_note_on_request(_args), do: nil
@impl AI.Tools
def ui_note_on_result(_args, _result), do: nil
@impl AI.Tools
def read_args(args) do
with {:ok, symbol} <- read_symbol(args),
{:ok, start_file} <- read_start_file(args),
{:ok, question} <- read_question(args) do
{:ok,
%{
"symbol" => symbol,
"start_file" => start_file,
"question" => question
}}
end
end
defp read_question(%{"question" => question}), do: {:ok, question}
defp read_question(_args), do: AI.Tools.required_arg_error("question")
defp read_symbol(%{"symbol" => symbol}), do: {:ok, symbol}
defp read_symbol(_args), do: AI.Tools.required_arg_error("symbol")
defp read_start_file(%{"start_file" => start_file}), do: {:ok, start_file}
defp read_start_file(%{"start_file_path" => start_file}), do: {:ok, start_file}
defp read_start_file(%{"file_path" => start_file}), do: {:ok, start_file}
defp read_start_file(%{"file" => start_file}), do: {:ok, start_file}
defp read_start_file(_args), do: AI.Tools.required_arg_error("start_file")
@impl AI.Tools
def spec() do
%{
type: "function",
function: %{
name: "file_spelunker_tool",
description: """
Instructs an LLM to trace execution paths through the code to identify
callers, callees, paths, and conditional logic affecting them. It can
answer questions about the structure of the code and traverse multiple
files to provide a call tree.
""",
strict: true,
parameters: %{
additionalProperties: false,
type: "object",
required: ["symbol", "start_file", "question"],
properties: %{
symbol: %{
type: "string",
description: """
A symbol to use as an anchor reference to start the search from.
For example, a function name, variable, or value.
"""
},
start_file: %{
type: "string",
description: "A file path from the file_list_tool or file_search_tool."
},
question: %{
type: "string",
description: """
A prompt for the spelunker agent to respond to. For example:
- Identify all functions called by <symbol>
- Identify all functions that call <symbol>
- Starting from <start file>:<symbol>, trace logic to <end file>:<symbol>
"""
}
}
}
}
}
end
@impl AI.Tools
def call(completion, args) do
with {:ok, symbol} <- Map.fetch(args, "symbol"),
{:ok, start_file} <- Map.fetch(args, "start_file"),
{:ok, question} <- Map.fetch(args, "question") do
AI.Agent.Spelunker.get_response(completion.ai, %{
symbol: symbol,
start_file: start_file,
question: question
})
end
end
end