agent

package
v1.97.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 7, 2026 License: Apache-2.0 Imports: 22 Imported by: 0

Documentation

Overview

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

* ChatCLI - Command Line Interface for LLM interaction * Copyright (c) 2024 Edilson Freitas * License: Apache-2.0

Index

Constants

View Source
const (
	// DefaultMaxOutputBytes is the maximum output size before truncation.
	DefaultMaxOutputBytes int64 = 1 << 20 // 1MB

	// DefaultTerminateTimeout is how long to wait for graceful shutdown.
	DefaultTerminateTimeout = 5 * time.Second
)
View Source
const (
	ColorReset  = "\033[0m"
	ColorGreen  = "\033[32m"
	ColorLime   = "\033[92m"
	ColorCyan   = "\033[36m"
	ColorGray   = "\033[90m"
	ColorPurple = "\033[35m"
	ColorBold   = "\033[1m"
	ColorYellow = "\033[33m"
)

ANSI Color codes exportados

Variables

View Source
var StatusPhrases = []string{
	"Thinking...",
	"Analyzing...",
	"Processing...",
	"Reasoning...",
	"Planning...",
	"Exploring...",
	"Connecting dots...",
	"Crafting solution...",
	"Reading code...",
	"Mapping structure...",
}

StatusPhrases are fun rotating messages shown while the LLM is thinking.

Functions

func BuildSuggestions added in v1.66.0

func BuildSuggestions(command string) []string

BuildSuggestions returns alternative commands based on the denied command.

func CompactToolLabel added in v1.97.0

func CompactToolLabel(subcmd string, rawArgs string) string

CompactToolLabel builds a compact label from a subcmd + args. Examples: "Read(main.go)", "Write(pkg/handler.go)", "Exec(go test ./...)", "Patch(3 edits)"

func DefaultAllowedCommands added in v1.97.0

func DefaultAllowedCommands() map[string]string

DefaultAllowedCommands returns the categorized command allowlist.

func IntegrateTaskTracking added in v1.47.0

func IntegrateTaskTracking(tracker *TaskTracker, reasoningText string, logger *zap.Logger)

IntegrateTaskTracking processa o reasoning e atualiza o plano de tarefas

func MarkTaskCompleted added in v1.47.0

func MarkTaskCompleted(tracker *TaskTracker)

MarkTaskCompleted marca a tarefa atual como concluída

func MarkTaskFailed added in v1.47.0

func MarkTaskFailed(tracker *TaskTracker, errorMsg string)

MarkTaskFailed marca a tarefa atual como falhada

func MarkTaskInProgress added in v1.47.0

func MarkTaskInProgress(tracker *TaskTracker)

MarkTaskInProgress marca a tarefa atual como em andamento

func SetProcessGroup added in v1.66.0

func SetProcessGroup(cmd *exec.Cmd)

SetProcessGroup configures the command to create a new process group. Must be called before cmd.Start().

func VisibleLen

func VisibleLen(s string) int

VisibleLen calcula comprimento visível em colunas do terminal (sem ANSI codes). Usa runewidth para tratar emojis e caracteres wide corretamente.

Types

type CommandAllowlist added in v1.97.0

type CommandAllowlist struct {
	// contains filtered or unexported fields
}

CommandAllowlist validates commands against a categorized allowlist. In strict mode, only allowed commands can execute. In permissive mode, unknown commands fall back to the legacy denylist validator.

func NewCommandAllowlist added in v1.97.0

func NewCommandAllowlist() *CommandAllowlist

NewCommandAllowlist creates a new allowlist validator configured from environment.

func (*CommandAllowlist) GetMode added in v1.97.0

func (al *CommandAllowlist) GetMode() SecurityMode

GetMode returns the current security mode.

func (*CommandAllowlist) IsAllowed added in v1.97.0

func (al *CommandAllowlist) IsAllowed(fullCommand string) (bool, string, string)

IsAllowed checks if a command is in the allowlist. Returns (allowed, category, reason).

type CommandBlock

type CommandBlock struct {
	Description string
	Commands    []string
	Language    string
	ContextInfo CommandContextInfo
}

CommandBlock representa um bloco de comandos executáveis

type CommandContextInfo

type CommandContextInfo struct {
	SourceType    SourceType
	FileExtension string
	IsScript      bool
	ScriptType    string // shell, python, etc.
}

CommandContextInfo contém metadados sobre a origem e natureza de um comando

type CommandExecutor

type CommandExecutor struct {
	// contains filtered or unexported fields
}

CommandExecutor executa comandos do sistema de forma segura

func NewCommandExecutor

func NewCommandExecutor(logger *zap.Logger) *CommandExecutor

NewCommandExecutor cria uma nova instância do executor

func (*CommandExecutor) CaptureOutput

func (e *CommandExecutor) CaptureOutput(ctx context.Context, shell string, args []string) ([]byte, error)

CaptureOutput executa comando e captura apenas a saída (para uso interno)

func (*CommandExecutor) Execute

func (e *CommandExecutor) Execute(ctx context.Context, command string, interactive bool) (*ExecutionResult, error)

Execute executa um comando e retorna o resultado

type CommandOutput

type CommandOutput struct {
	CommandBlock CommandBlock
	Output       string
	ErrorMsg     string
}

CommandOutput representa o resultado da execução de um comando

type CommandValidator

type CommandValidator struct {
	// contains filtered or unexported fields
}

CommandValidator valida comandos antes da execução

func NewCommandValidator

func NewCommandValidator(logger *zap.Logger) *CommandValidator

NewCommandValidator cria uma nova instância do validador

func (*CommandValidator) IsDangerous

func (v *CommandValidator) IsDangerous(cmd string) bool

IsDangerous verifica se um comando é potencialmente perigoso

func (*CommandValidator) IsLikelyInteractive

func (v *CommandValidator) IsLikelyInteractive(cmd string) bool

IsLikelyInteractive verifica se um comando provavelmente é interativo

func (*CommandValidator) ValidateCommand

func (v *CommandValidator) ValidateCommand(cmd string) error

ValidateCommand valida um comando antes da execução

type ContextManager

type ContextManager struct {
	// contains filtered or unexported fields
}

ContextManager gerencia contexto de execução para o agente

func NewContextManager

func NewContextManager(logger *zap.Logger) *ContextManager

NewContextManager cria uma nova instância do gerenciador de contexto

func (*ContextManager) CreateExecutionContext

func (cm *ContextManager) CreateExecutionContext() (context.Context, context.CancelFunc)

CreateExecutionContext cria um contexto com timeout para execução

func (*ContextManager) GetDefaultTimeout

func (cm *ContextManager) GetDefaultTimeout() time.Duration

GetDefaultTimeout retorna o timeout padrão configurado

func (*ContextManager) RequestLLMContinuation

func (cm *ContextManager) RequestLLMContinuation(
	ctx context.Context,
	llmClient interface{},
	history []models.Message,
	previousCommand string,
	output string,
	stderr string,
	userContext string,
) (string, error)

RequestLLMContinuation solicita continuação à LLM com contexto adicional

func (*ContextManager) RequestLLMWithPreExecutionContext

func (cm *ContextManager) RequestLLMWithPreExecutionContext(
	ctx context.Context,
	llmClient interface{},
	history []models.Message,
	originalCommand string,
	userContext string,
) (string, error)

RequestLLMWithPreExecutionContext solicita refinamento antes da execução

func (*ContextManager) SetDefaultTimeout

func (cm *ContextManager) SetDefaultTimeout(timeout time.Duration)

SetDefaultTimeout atualiza o timeout padrão

type EnhancedExecutionResult added in v1.66.0

type EnhancedExecutionResult struct {
	Command      string
	Output       string
	Error        string
	ExitCode     int
	Duration     time.Duration
	WasKilled    bool
	WasTruncated bool
	OriginalSize int64
	Severity     string
}

EnhancedExecutionResult extends ExecutionResult with truncation info.

type ExecutionResult

type ExecutionResult struct {
	Command   string
	Output    string
	Error     string
	ExitCode  int
	Duration  time.Duration
	WasKilled bool
}

ExecutionResult contém o resultado de uma execução

type PathValidator added in v1.66.0

type PathValidator struct {
	// contains filtered or unexported fields
}

PathValidator validates file paths against workspace boundaries.

func NewPathValidator added in v1.66.0

func NewPathValidator(workspace string, logger *zap.Logger) *PathValidator

NewPathValidator creates a new path validator.

func (*PathValidator) DetectPathTraversal added in v1.66.0

func (pv *PathValidator) DetectPathTraversal(command string) (bool, string)

DetectPathTraversal checks if a command contains path traversal attempts.

func (*PathValidator) IsWithinWorkspace added in v1.66.0

func (pv *PathValidator) IsWithinWorkspace(targetPath string) bool

IsWithinWorkspace checks if a path is within the workspace boundary.

func (*PathValidator) SetWorkspaceBoundary added in v1.66.0

func (pv *PathValidator) SetWorkspaceBoundary(path string)

SetWorkspaceBoundary updates the workspace boundary.

func (*PathValidator) ValidateFilePaths added in v1.66.0

func (pv *PathValidator) ValidateFilePaths(command string) ValidationResult

ValidateFilePaths validates all paths in a command against safety rules.

type PatternRule added in v1.66.0

type PatternRule struct {
	Pattern     string `json:"pattern"`
	Description string `json:"description"`
	Severity    string `json:"severity"` // "critical", "high", "medium", "low"
	// contains filtered or unexported fields
}

PatternRule is a configurable deny/allow pattern.

func (*PatternRule) Compile added in v1.66.0

func (pr *PatternRule) Compile() error

Compile compiles the regex pattern.

func (*PatternRule) Matches added in v1.66.0

func (pr *PatternRule) Matches(command string) bool

Matches checks if the command matches this pattern.

type ProcessManager added in v1.66.0

type ProcessManager struct {
	// contains filtered or unexported fields
}

ProcessManager handles process lifecycle management.

func NewProcessManager added in v1.66.0

func NewProcessManager(logger *zap.Logger) *ProcessManager

NewProcessManager creates a new process manager.

func (*ProcessManager) TerminateProcessTree added in v1.66.0

func (pm *ProcessManager) TerminateProcessTree(cmd *exec.Cmd, timeout time.Duration) error

TerminateProcessTree sends SIGTERM, waits for timeout, then SIGKILL. Platform-specific implementation in process_manager_unix.go / process_manager_windows.go.

func (*ProcessManager) TruncateOutput added in v1.66.0

func (pm *ProcessManager) TruncateOutput(output string, maxBytes int64) (string, bool)

TruncateOutput truncates output keeping head + tail with a marker.

type SafetyConfig added in v1.66.0

type SafetyConfig struct {
	Version           int           `json:"version"`
	DenyPatterns      []PatternRule `json:"deny_patterns,omitempty"`
	AllowPatterns     []PatternRule `json:"allow_patterns,omitempty"`
	WorkspaceBoundary string        `json:"workspace_boundary,omitempty"`
	AllowSudo         bool          `json:"allow_sudo"`
	MaxOutputBytes    int64         `json:"max_output_bytes,omitempty"`
}

SafetyConfig holds configurable safety rules.

func DefaultSafetyConfig added in v1.66.0

func DefaultSafetyConfig() *SafetyConfig

DefaultSafetyConfig returns sensible defaults.

func LoadSafetyConfig added in v1.66.0

func LoadSafetyConfig(globalPath, localPath string) (*SafetyConfig, error)

LoadSafetyConfig loads and merges global + local safety configs.

func MergeSafetyConfigs added in v1.66.0

func MergeSafetyConfigs(global, local *SafetyConfig) *SafetyConfig

MergeSafetyConfigs merges local into global. Local can only ADD deny patterns, not remove global ones. Local can add allow patterns for project-specific commands.

type SecurityMode added in v1.97.0

type SecurityMode string

SecurityMode determines how command validation works.

const (
	// SecurityModeStrict only allows commands in the allowlist (default).
	SecurityModeStrict SecurityMode = "strict"
	// SecurityModePermissive uses allowlist + falls back to denylist for unknown commands.
	SecurityModePermissive SecurityMode = "permissive"
)

type SensitiveReadPaths added in v1.97.0

type SensitiveReadPaths struct {
	// contains filtered or unexported fields
}

SensitiveReadPaths enforces read access control in agent mode. By default, only files within the workspace are readable, with specific sensitive paths blocked even within the workspace.

func NewSensitiveReadPaths added in v1.97.0

func NewSensitiveReadPaths() *SensitiveReadPaths

NewSensitiveReadPaths creates a read path validator configured from environment.

func (*SensitiveReadPaths) IsReadAllowed added in v1.97.0

func (s *SensitiveReadPaths) IsReadAllowed(path, workspace string) (bool, string)

IsReadAllowed checks whether the given path is safe to read in agent mode. workspace is the current working directory / project root. Returns (allowed, reason).

type SourceType

type SourceType int

SourceType define o tipo de origem do comando

const (
	SourceTypeUserInput SourceType = iota
	SourceTypeFile
	SourceTypeCommandOutput
)

type Task added in v1.47.0

type Task struct {
	ID          int
	Description string
	Status      TaskStatus
	StartedAt   time.Time
	CompletedAt time.Time
	Error       string
	Attempts    int
}

type TaskPlan added in v1.47.0

type TaskPlan struct {
	Tasks         []*Task
	CurrentTask   int
	CreatedAt     time.Time
	UpdatedAt     time.Time
	NeedsReplan   bool
	FailureCount  int
	PlanSignature string
}

type TaskStatus added in v1.47.0

type TaskStatus string
const (
	TaskPending    TaskStatus = "pending"
	TaskInProgress TaskStatus = "in_progress"
	TaskCompleted  TaskStatus = "completed"
	TaskFailed     TaskStatus = "failed"
)

type TaskTracker added in v1.47.0

type TaskTracker struct {
	// contains filtered or unexported fields
}

func NewTaskTracker added in v1.47.0

func NewTaskTracker(logger *zap.Logger) *TaskTracker

func (*TaskTracker) FormatProgress added in v1.47.0

func (t *TaskTracker) FormatProgress() string

func (*TaskTracker) GetCurrentTask added in v1.47.0

func (t *TaskTracker) GetCurrentTask() *Task

func (*TaskTracker) GetPlan added in v1.47.0

func (t *TaskTracker) GetPlan() *TaskPlan

func (*TaskTracker) MarkCurrentAs added in v1.47.0

func (t *TaskTracker) MarkCurrentAs(status TaskStatus, errorMsg string)

func (*TaskTracker) NeedsReplanning added in v1.47.0

func (t *TaskTracker) NeedsReplanning() bool

func (*TaskTracker) ParseReasoning added in v1.47.0

func (t *TaskTracker) ParseReasoning(reasoningText string) error

func (*TaskTracker) ResetPlan added in v1.47.0

func (t *TaskTracker) ResetPlan()

func (*TaskTracker) ResetPlanFromReasoning added in v1.47.0

func (t *TaskTracker) ResetPlanFromReasoning(reasoningText string, preserveCompleted bool) error

ResetPlanFromReasoning recria o plano a partir de um novo reasoning. Se preserveCompleted=true, tenta preservar como concluídas as tarefas ja concluídas do plano anterior.

type ToolCall added in v1.43.0

type ToolCall struct {
	Name string
	Args string
	Raw  string
}

ToolCall represents a parsed tool invocation from AI output text.

func ParseToolCalls added in v1.43.0

func ParseToolCalls(text string) ([]ToolCall, error)

ParseToolCalls extracts tool calls from AI response text.

Supported formats:

  • XML self-closing: <tool_call name="@x" args="..." />
  • XML paired: <tool_call name="@x" args="..."></tool_call>
  • Attributes in any order, single or double quotes
  • Args containing '>' characters (JSON, HTML entities, etc.)
  • JSON tool calls: {"tool_call":"@coder","args":{...}}
  • Multiple tool calls in a single response

type UIRenderer

type UIRenderer struct {
	// contains filtered or unexported fields
}

UIRenderer gerencia a renderização da interface do modo agente

func NewUIRenderer

func NewUIRenderer(logger *zap.Logger) *UIRenderer

NewUIRenderer cria uma nova instância do renderizador de UI

func (*UIRenderer) ClearScreen

func (r *UIRenderer) ClearScreen()

ClearScreen limpa a tela (se permitido)

func (*UIRenderer) Colorize

func (r *UIRenderer) Colorize(text string, color string) string

Colorize aplica cores ANSI (exportada com C maiúsculo)

func (*UIRenderer) CompactBatchSummary added in v1.97.0

func (r *UIRenderer) CompactBatchSummary(successCount, total int, hasError bool)

CompactBatchSummary renders a one-line batch summary.

✓ 4/4 ações concluídas
✗ 2/4 ações concluídas (com erros)

func (*UIRenderer) CompactError added in v1.97.0

func (r *UIRenderer) CompactError(msg string)

CompactError renders an error inline.

✗ BLOCKED  Ação negada pelo usuário

func (*UIRenderer) CompactLine added in v1.97.0

func (r *UIRenderer) CompactLine(icon, label, text string, color string)

CompactLine renders a single inline status line (no card/box). Used for reasoning, explanations, errors, summaries in compact mode.

● PLANO  Ler main.go, modificar handler, atualizar testes
✗ ERRO   Arquivo não encontrado
✓ OK     2 arquivos modificados

func (*UIRenderer) CompactMultiLine added in v1.97.0

func (r *UIRenderer) CompactMultiLine(icon, label, text string, color string, maxLines int)

CompactMultiLine renders a compact block: icon + label on first line, then indented content lines (max N lines). For reasoning/plan display.

● PLANO
  1. Ler main.go
  2. Modificar handleRequest
  3. Atualizar testes

func (*UIRenderer) CompactToolDone added in v1.97.0

func (r *UIRenderer) CompactToolDone(toolLabel string, duration string, isError bool)

CompactToolDone renders a completed tool call in compact format:

✓ Read(main.go) 1.2s

func (*UIRenderer) CompactToolStart added in v1.97.0

func (r *UIRenderer) CompactToolStart(toolLabel string)

CompactToolStart renders a tool call start in compact format:

↻ Read(main.go)

func (*UIRenderer) PrintHeader

func (r *UIRenderer) PrintHeader()

PrintHeader imprime o cabeçalho do modo agente

func (*UIRenderer) PrintLastResult

func (r *UIRenderer) PrintLastResult(outputs []*CommandOutput, lastIdx int)

PrintLastResult imprime o último resultado

func (*UIRenderer) PrintMenu

func (r *UIRenderer) PrintMenu()

PrintMenu imprime o menu de opções

func (*UIRenderer) PrintPlanCompact

func (r *UIRenderer) PrintPlanCompact(blocks []CommandBlock, outputs []*CommandOutput)

PrintPlanCompact imprime plano em formato compacto

func (*UIRenderer) PrintPlanFull

func (r *UIRenderer) PrintPlanFull(blocks []CommandBlock, outputs []*CommandOutput, validator *CommandValidator)

PrintPlanFull imprime plano em formato completo

func (*UIRenderer) PrintPrompt

func (r *UIRenderer) PrintPrompt() string

PrintPrompt imprime o prompt de entrada

func (*UIRenderer) RenderBatchHeader added in v1.45.0

func (r *UIRenderer) RenderBatchHeader(totalActions int)

RenderBatchHeader exibe um cabeçalho indicando o início de um lote

func (*UIRenderer) RenderBatchSummary added in v1.45.0

func (r *UIRenderer) RenderBatchSummary(successCount, total int, hasError bool)

RenderBatchSummary exibe o resultado final do lote

func (*UIRenderer) RenderMarkdownTimelineEvent added in v1.43.7

func (r *UIRenderer) RenderMarkdownTimelineEvent(icon, title, renderedMarkdownANSI, color string)

RenderMarkdownTimelineEvent renderiza markdown (já convertido para ANSI fora) dentro do card. Ele só delega para RenderTimelineEvent, mas existe para explicitar intenção e padronizar chamadas.

func (*UIRenderer) RenderStreamBoxEnd added in v1.47.8

func (r *UIRenderer) RenderStreamBoxEnd(color string)

desenha APENAS o rodapé

func (*UIRenderer) RenderStreamBoxStart added in v1.47.8

func (r *UIRenderer) RenderStreamBoxStart(icon, title, color string)

desenha APENAS o cabeçalho do card

func (*UIRenderer) RenderThinking added in v1.40.0

func (r *UIRenderer) RenderThinking(thought string)

RenderThinking exibe o pensamento da IA

func (*UIRenderer) RenderTimelineEvent added in v1.40.0

func (r *UIRenderer) RenderTimelineEvent(icon, title, content, color string)

RenderTimelineEvent desenha um "card" estilizado ajustado à largura do terminal

func (*UIRenderer) RenderToolCall added in v1.40.0

func (r *UIRenderer) RenderToolCall(toolName, rawArgs string)

RenderToolCall exibe a chamada da ferramenta de forma limpa (escondendo Base64 e sujeira HTML)

func (*UIRenderer) RenderToolCallMinimal added in v1.52.0

func (r *UIRenderer) RenderToolCallMinimal(toolName, rawArgs string, current, total int)

RenderToolCallMinimal exibe a chamada de ferramenta em modo compacto

func (*UIRenderer) RenderToolCallWithProgress added in v1.45.0

func (r *UIRenderer) RenderToolCallWithProgress(toolName, rawArgs string, current, total int)

RenderToolCallWithProgress exibe a chamada da ferramenta em formato de CARD (Box), limpando barras invertidas visuais e mostrando o progresso.

func (*UIRenderer) RenderToolResult added in v1.40.0

func (r *UIRenderer) RenderToolResult(output string, isError bool)

RenderToolResult exibe o resultado da execução

func (*UIRenderer) RenderToolResultMinimal added in v1.52.0

func (r *UIRenderer) RenderToolResultMinimal(output string, isError bool)

RenderToolResultMinimal exibe o resultado em modo compacto

func (*UIRenderer) SetSkipClearOnNextDraw

func (r *UIRenderer) SetSkipClearOnNextDraw(skip bool)

SetSkipClearOnNextDraw define se o próximo clear deve ser pulado

func (*UIRenderer) ShowInPager

func (r *UIRenderer) ShowInPager(text string) error

ShowInPager abre texto em pager (less/more)

func (*UIRenderer) StreamOutput added in v1.47.8

func (r *UIRenderer) StreamOutput(line string)

imprime a linha COM A BARRA LATERAL para parecer que está dentro

type ValidationResult added in v1.66.0

type ValidationResult struct {
	Allowed     bool
	Reason      string
	Severity    string
	Suggestions []string
	MatchedRule string
}

ValidationResult is the detailed result of command validation.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL