108 lines
3.5 KiB
Go
108 lines
3.5 KiB
Go
package agents
|
|
|
|
import (
|
|
"context"
|
|
_ "embed"
|
|
"time"
|
|
|
|
"github.com/kandev/kandev/internal/agentctl/server/adapter"
|
|
"github.com/kandev/kandev/internal/agentctl/server/adapter/transport/streamjson"
|
|
"github.com/kandev/kandev/internal/common/logger"
|
|
"github.com/kandev/kandev/pkg/agent"
|
|
)
|
|
|
|
//go:embed logos/mock_light.svg
|
|
var mockLogoLight []byte
|
|
|
|
//go:embed logos/mock_dark.svg
|
|
var mockLogoDark []byte
|
|
|
|
var _ Agent = (*MockAgent)(nil)
|
|
|
|
type MockAgent struct {
|
|
enabled bool
|
|
binaryPath string
|
|
}
|
|
|
|
func NewMockAgent() *MockAgent { return &MockAgent{} }
|
|
|
|
// SetEnabled enables or disables the mock agent at runtime.
|
|
func (a *MockAgent) SetEnabled(enabled bool) { a.enabled = enabled }
|
|
|
|
// SetBinaryPath overrides the mock-agent binary path.
|
|
func (a *MockAgent) SetBinaryPath(path string) { a.binaryPath = path }
|
|
|
|
func (a *MockAgent) ID() string { return "mock-agent" }
|
|
func (a *MockAgent) Name() string { return "Mock Agent" }
|
|
func (a *MockAgent) DisplayName() string { return "Mock" }
|
|
func (a *MockAgent) Description() string {
|
|
return "Mock agent for testing. Generates simulated responses with all message types."
|
|
}
|
|
func (a *MockAgent) Enabled() bool { return a.enabled }
|
|
|
|
func (a *MockAgent) Logo(v LogoVariant) []byte {
|
|
if v == LogoDark {
|
|
return mockLogoDark
|
|
}
|
|
return mockLogoLight
|
|
}
|
|
|
|
func (a *MockAgent) IsInstalled(ctx context.Context) (*DiscoveryResult, error) {
|
|
// Mock agent is always "available" when enabled (forced by settings controller)
|
|
return &DiscoveryResult{Available: false}, nil
|
|
}
|
|
|
|
func (a *MockAgent) DefaultModel() string { return "mock-default" }
|
|
|
|
func (a *MockAgent) ListModels(ctx context.Context) (*ModelList, error) {
|
|
return &ModelList{Models: mockStaticModels(), SupportsDynamic: false}, nil
|
|
}
|
|
|
|
func (a *MockAgent) CreateAdapter(cfg *adapter.Config, log *logger.Logger) (adapter.AgentAdapter, error) {
|
|
return newStreamJSONAdapterWrapper(streamjson.NewAdapter(cfg.ToSharedConfig(), log)), nil
|
|
}
|
|
|
|
func (a *MockAgent) BuildCommand(opts CommandOptions) Command {
|
|
binary := "mock-agent"
|
|
if a.binaryPath != "" {
|
|
binary = a.binaryPath
|
|
}
|
|
return Cmd(binary).
|
|
Model(NewParam("--model", "{model}"), opts.Model).
|
|
Build()
|
|
}
|
|
|
|
func (a *MockAgent) Runtime() *RuntimeConfig {
|
|
canRecover := false
|
|
return &RuntimeConfig{
|
|
Cmd: Cmd("mock-agent").Build(),
|
|
WorkingDir: "{workspace}",
|
|
Env: map[string]string{},
|
|
ResourceLimits: ResourceLimits{MemoryMB: 512, CPUCores: 0.5, Timeout: time.Hour},
|
|
Capabilities: []string{"code_generation", "code_review", "refactoring", "testing", "shell_execution"},
|
|
Protocol: agent.ProtocolClaudeCode,
|
|
ModelFlag: NewParam("--model", "{model}"),
|
|
SessionConfig: SessionConfig{
|
|
CanRecover: &canRecover,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (a *MockAgent) PermissionSettings() map[string]PermissionSetting {
|
|
return mockPermSettings
|
|
}
|
|
|
|
var mockPermSettings = map[string]PermissionSetting{
|
|
"auto_approve": {Supported: true, Default: true, Label: "Auto-approve", Description: "Automatically approve tool calls",
|
|
ApplyMethod: "stdio"},
|
|
"dangerously_skip_permissions": {Supported: true, Default: false, Label: "Skip Permissions (YOLO)", Description: "Bypass all permission checks"},
|
|
}
|
|
|
|
func mockStaticModels() []Model {
|
|
return []Model{
|
|
{ID: "mock-default", Name: "Mock Default", Provider: "mock", ContextWindow: 200000, IsDefault: true, Source: "static"},
|
|
{ID: "mock-slow", Name: "Mock Slow", Description: "Longer delays", Provider: "mock", ContextWindow: 200000, Source: "static"},
|
|
{ID: "mock-fast", Name: "Mock Fast", Description: "Minimal delays", Provider: "mock", ContextWindow: 200000, Source: "static"},
|
|
}
|
|
}
|