agents

package
v0.5.0 Latest Latest
Warning

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

Go to latest
Published: Mar 6, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AcquireSlot

func AcquireSlot(ctx context.Context, a Agent) error

AcquireSlot blocks until a test slot is available for the agent or the context is cancelled. Returns a non-nil error if the context expires before a slot opens.

func DefaultDroidModel added in v0.5.0

func DefaultDroidModel() string

DefaultDroidModel returns the default model string for Droid BYOK configuration. Format is "custom:<baseModelID>" which the Droid API expects for custom model selection.

func Register

func Register(a Agent)

func RegisterGate

func RegisterGate(name string, defaultMax int)

RegisterGate sets a concurrency limit for an agent's tests. Tests call AcquireSlot/ReleaseSlot to respect this limit. The limit can be overridden via E2E_CONCURRENT_TEST_LIMIT.

func ReleaseSlot

func ReleaseSlot(a Agent)

ReleaseSlot frees a test slot for the agent.

Types

type Agent

type Agent interface {
	Name() string
	// Binary returns the CLI binary name (e.g. "claude", "gemini").
	Binary() string
	EntireAgent() string
	PromptPattern() string
	// TimeoutMultiplier returns a factor applied to per-test timeouts.
	// Slower agents (e.g. Gemini) return values > 1.
	TimeoutMultiplier() float64
	RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)
	StartSession(ctx context.Context, dir string) (Session, error)
	// Bootstrap performs one-time CI setup (auth config, warmup, etc.).
	// Called before any tests run. Implementations should be idempotent.
	Bootstrap() error
	// IsTransientError returns true if the error from RunPrompt looks like
	// a transient API failure (e.g. 500, rate limit, network error) that
	// is worth retrying.
	IsTransientError(out Output, err error) bool
}

func All

func All() []Agent

type Claude

type Claude struct{}

func (*Claude) Binary

func (c *Claude) Binary() string

func (*Claude) Bootstrap

func (c *Claude) Bootstrap() error

func (*Claude) EntireAgent

func (c *Claude) EntireAgent() string

func (*Claude) IsTransientError

func (c *Claude) IsTransientError(out Output, _ error) bool

func (*Claude) Name

func (c *Claude) Name() string

func (*Claude) PromptPattern

func (c *Claude) PromptPattern() string

func (*Claude) RunPrompt

func (c *Claude) RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)

func (*Claude) StartSession

func (c *Claude) StartSession(ctx context.Context, dir string) (Session, error)

func (*Claude) TimeoutMultiplier

func (c *Claude) TimeoutMultiplier() float64

type CopilotCLI added in v0.5.0

type CopilotCLI struct{}

func (*CopilotCLI) Binary added in v0.5.0

func (c *CopilotCLI) Binary() string

func (*CopilotCLI) Bootstrap added in v0.5.0

func (c *CopilotCLI) Bootstrap() error

func (*CopilotCLI) EntireAgent added in v0.5.0

func (c *CopilotCLI) EntireAgent() string

func (*CopilotCLI) IsTransientError added in v0.5.0

func (c *CopilotCLI) IsTransientError(out Output, err error) bool

func (*CopilotCLI) Name added in v0.5.0

func (c *CopilotCLI) Name() string

func (*CopilotCLI) PromptPattern added in v0.5.0

func (c *CopilotCLI) PromptPattern() string

func (*CopilotCLI) RunPrompt added in v0.5.0

func (c *CopilotCLI) RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)

func (*CopilotCLI) StartSession added in v0.5.0

func (c *CopilotCLI) StartSession(ctx context.Context, dir string) (Session, error)

func (*CopilotCLI) TimeoutMultiplier added in v0.5.0

func (c *CopilotCLI) TimeoutMultiplier() float64

type CursorCLI added in v0.5.0

type CursorCLI struct{}

CursorCLI implements the E2E Agent interface for the Cursor Agent CLI binary. The CLI binary is called "agent" and uses Cursor's hooks system via .cursor/hooks.json. It maps to the same Entire agent as Cursor IDE ("cursor").

All E2E interactions use interactive (tmux) mode so that the full hook lifecycle fires (sessionStart, beforeSubmitPrompt, stop, sessionEnd). Headless (-p) mode skips beforeSubmitPrompt and stop hooks.

func (*CursorCLI) Binary added in v0.5.0

func (a *CursorCLI) Binary() string

func (*CursorCLI) Bootstrap added in v0.5.0

func (a *CursorCLI) Bootstrap() error

func (*CursorCLI) EntireAgent added in v0.5.0

func (a *CursorCLI) EntireAgent() string

func (*CursorCLI) IsTransientError added in v0.5.0

func (a *CursorCLI) IsTransientError(out Output, err error) bool

func (*CursorCLI) Name added in v0.5.0

func (a *CursorCLI) Name() string

func (*CursorCLI) PromptPattern added in v0.5.0

func (a *CursorCLI) PromptPattern() string

PromptPattern returns a regex matching the Cursor CLI's TUI input prompt. The CLI shows a styled input box with placeholder text when ready for input.

func (*CursorCLI) RunPrompt added in v0.5.0

func (a *CursorCLI) RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)

func (*CursorCLI) StartSession added in v0.5.0

func (a *CursorCLI) StartSession(ctx context.Context, dir string) (Session, error)

func (*CursorCLI) TimeoutMultiplier added in v0.5.0

func (a *CursorCLI) TimeoutMultiplier() float64

type Droid added in v0.4.9

type Droid struct{}

Droid implements the Agent interface for Factory AI Droid.

func (*Droid) Binary added in v0.4.9

func (d *Droid) Binary() string

func (*Droid) Bootstrap added in v0.4.9

func (d *Droid) Bootstrap() error

func (*Droid) EntireAgent added in v0.4.9

func (d *Droid) EntireAgent() string

func (*Droid) IsTransientError added in v0.4.9

func (d *Droid) IsTransientError(out Output, err error) bool

func (*Droid) Name added in v0.4.9

func (d *Droid) Name() string

func (*Droid) PromptPattern added in v0.4.9

func (d *Droid) PromptPattern() string

func (*Droid) RunPrompt added in v0.4.9

func (d *Droid) RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)

func (*Droid) StartSession added in v0.4.9

func (d *Droid) StartSession(ctx context.Context, dir string) (Session, error)

func (*Droid) TimeoutMultiplier added in v0.4.9

func (d *Droid) TimeoutMultiplier() float64

type Gemini

type Gemini struct{}

func (*Gemini) Binary

func (g *Gemini) Binary() string

func (*Gemini) Bootstrap

func (g *Gemini) Bootstrap() error

func (*Gemini) EntireAgent

func (g *Gemini) EntireAgent() string

func (*Gemini) IsTransientError

func (g *Gemini) IsTransientError(out Output, err error) bool

func (*Gemini) Name

func (g *Gemini) Name() string

func (*Gemini) PromptPattern

func (g *Gemini) PromptPattern() string

func (*Gemini) RunPrompt

func (g *Gemini) RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)

func (*Gemini) StartSession

func (g *Gemini) StartSession(ctx context.Context, dir string) (Session, error)

func (*Gemini) TimeoutMultiplier

func (g *Gemini) TimeoutMultiplier() float64

type Option

type Option func(*runConfig)

func WithModel

func WithModel(model string) Option

func WithPermissionMode

func WithPermissionMode(mode string) Option

func WithPromptTimeout

func WithPromptTimeout(d time.Duration) Option

type Output

type Output struct {
	Command  string
	Stdout   string
	Stderr   string
	ExitCode int
}

type Session

type Session interface {
	Send(input string) error
	WaitFor(pattern string, timeout time.Duration) (string, error)
	Capture() string
	Close() error
}

type TmuxSession

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

TmuxSession implements Session using tmux for PTY-based interactive agents.

func NewTmuxSession

func NewTmuxSession(name string, dir string, unsetEnv []string, command string, args ...string) (*TmuxSession, error)

NewTmuxSession creates a new tmux session running the given command in dir. unsetEnv lists environment variable names to strip from the session.

The command is wrapped with `env` to propagate PATH from the current process. tmux sessions inherit the tmux server's environment (not the client's), so without this, binaries added to PATH by the test runner (e.g., freshly built `entire` and `vogon`) would not be found inside the session.

func (*TmuxSession) Capture

func (s *TmuxSession) Capture() string

func (*TmuxSession) Close

func (s *TmuxSession) Close() error

func (*TmuxSession) IsPaneDead added in v0.5.0

func (s *TmuxSession) IsPaneDead() bool

IsPaneDead returns true if the process inside the tmux pane has exited. This relies on the remain-on-exit option being set (which NewTmuxSession does).

func (*TmuxSession) OnClose

func (s *TmuxSession) OnClose(fn func())

OnClose registers a function to run when the session is closed.

func (*TmuxSession) Send

func (s *TmuxSession) Send(input string) error

func (*TmuxSession) SendKeys

func (s *TmuxSession) SendKeys(keys ...string) error

SendKeys sends raw tmux key names without appending Enter.

func (*TmuxSession) WaitFor

func (s *TmuxSession) WaitFor(pattern string, timeout time.Duration) (string, error)

type Vogon added in v0.5.0

type Vogon struct{}

Vogon implements the Agent interface using a deterministic binary that creates files and fires hooks without making any API calls. Named after the Vogons from The Hitchhiker's Guide to the Galaxy.

func (*Vogon) Binary added in v0.5.0

func (v *Vogon) Binary() string

func (*Vogon) Bootstrap added in v0.5.0

func (v *Vogon) Bootstrap() error

func (*Vogon) EntireAgent added in v0.5.0

func (v *Vogon) EntireAgent() string

func (*Vogon) IsTransientError added in v0.5.0

func (v *Vogon) IsTransientError(_ Output, _ error) bool

func (*Vogon) Name added in v0.5.0

func (v *Vogon) Name() string

func (*Vogon) PromptPattern added in v0.5.0

func (v *Vogon) PromptPattern() string

func (*Vogon) RunPrompt added in v0.5.0

func (v *Vogon) RunPrompt(ctx context.Context, dir string, prompt string, opts ...Option) (Output, error)

func (*Vogon) StartSession added in v0.5.0

func (v *Vogon) StartSession(_ context.Context, dir string) (Session, error)

func (*Vogon) TimeoutMultiplier added in v0.5.0

func (v *Vogon) TimeoutMultiplier() float64

Jump to

Keyboard shortcuts

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