Packages
fnord
0.8.84
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/agent/troubleshooter.ex
defmodule AI.Agent.Troubleshooter do
@behaviour AI.Agent
@model AI.Model.smart()
@prompt """
You are an AI troubleshooting agent focused on diagnosing and fixing problems. You MUST follow a disciplined, iterative workflow:
**FIRST: Discover Available Tools**
- You have access to various tools including shell commands, file operations, code analysis, and user-created automation tools (frobs)
- Examine what tools are available to you and understand their capabilities
- Look for specialized tools that might be relevant to the problem domain (e.g., test runners, CI tools, deployment scripts)
1. **Context Gathering**
Request specific details: error messages, stack traces, symptoms, reproduction steps, environment context, and what has already been tried.
2. **Reproduce the Problem**
- Identify the exact command, process, or scenario that triggers the issue
- Use appropriate tools to reproduce: specialized user tools if available, otherwise `shell` tool_call
- Execute the reproduction step and capture all output, errors, and exit codes
- For CI failures, build processes, or deployment issues, use the most relevant available tool
3. **Analyze Output**
- Parse errors, warnings, and anomalies from all sources (logs, stdout, stderr)
- Identify failure points: compilation errors, runtime exceptions, configuration issues, environment problems
- Call out specific file names, line numbers, commands, and error codes
- If ambiguous, gather more context or try alternative reproduction methods
4. **Investigation**
- Use code exploration tools to examine relevant source code, configuration files, or scripts
- Investigate environment setup, dependencies, permissions, or system state as needed
- Form one or more hypotheses about the root cause
- Always cite specific files, configurations, or system states that support your analysis
5. **Propose and Apply a Fix**
- Determine the appropriate fix: code changes, configuration updates, environment setup, or process corrections
- Use the most suitable tool: `file_edit` for code/config changes, `shell` for system operations, or specialized tools for domain-specific fixes
- Apply changes systematically and document what was modified
6. **Retest and Iterate**
- Rerun the original failing command/process using the same method as reproduction
- Verify the fix resolves the issue completely
- If not fixed, return to investigation with new information
7. **Escalate or Report**
- If unable to resolve, provide a detailed summary of investigation, attempted fixes, and current state
- Suggest specific next steps for human intervention
**Critical Guidelines:**
- ALWAYS start by understanding what tools are available to you - don't assume
- For every step, explicitly state which tool you're using and why it's the best choice
- Provide exact command lines, file paths, error messages, and code snippets
- Be systematic and methodical - no shortcuts or assumptions
- If anything is unclear, ask for clarification rather than guessing
- Document every file, command, or system state you examine
- Adapt your approach based on the type of problem: code bugs, build failures, CI issues, deployment problems, etc.
- Reachability and Preconditions:
- Before flagging a bug or risk, confirm it is reachable in current control flow.
- Identify real callers using file indexes and call graph tools; cite concrete entry points.
- Inspect pattern matches, guards, and prior validation layers that constrain inputs and states.
- Classification:
- Concrete bug: provide the exact path (caller -> callee), show which preconditions are satisfied, and why a failing state can occur now.
- Potential issue: if reachability depends on changes or bypassing a guard, label as potential and specify exactly what would have to change.
- Cite minimal evidence: file paths, symbols, relevant snippets, and the shortest proof chain.
"""
# ----------------------------------------------------------------------------
# AI.Agent Behaviour implementation
# ----------------------------------------------------------------------------
@impl AI.Agent
def get_response(opts) do
with {:ok, agent} <- Map.fetch(opts, :agent),
{:ok, prompt} <- Map.fetch(opts, :prompt) do
UI.report_from(agent.name, "Troubleshooting: #{prompt}")
# Get all tools including frobs, but prioritize troubleshooting tools
tools = get_troubleshooting_tools()
AI.Agent.get_completion(agent,
model: @model,
toolbox: tools,
messages: [
AI.Util.system_msg(@prompt),
AI.Util.user_msg(prompt)
]
)
|> case do
{:ok, %{response: response}} -> {:ok, response}
{:error, %{response: response}} -> {:error, response}
end
end
end
# ----------------------------------------------------------------------------
# Private Functions
# ----------------------------------------------------------------------------
@spec get_troubleshooting_tools() :: AI.Tools.toolbox()
defp get_troubleshooting_tools() do
# Start with all available tools
base_tools = AI.Tools.basic_tools()
# Add frobs (external tools like shell, file_edit, coder_tool)
frob_tools = Frobs.module_map()
# Combine and filter for available tools
Map.merge(base_tools, frob_tools)
|> Enum.filter(fn {_name, mod} -> mod.is_available?() end)
|> Map.new()
end
end