engines

package
v0.1.13 Latest Latest
Warning

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

Go to latest
Published: Jun 23, 2026 License: Apache-2.0 Imports: 20 Imported by: 0

Documentation

Overview

Package engines 定义外部 Agent CLI 引擎的执行边界。

Index

Constants

View Source
const (
	// EngineNative 是内置 Eino 引擎的注册名称。
	EngineNative = "leros"
	// EngineClaude 是 Claude Code 的注册名称。
	EngineClaude = "claude"
	// EngineCodex 是 Codex CLI 的注册名称。
	EngineCodex = "codex"
)
View Source
const (
	ApprovalActionApprove = "approve"
	ApprovalActionDeny    = "deny"
	ApprovalActionAlways  = "always"
)

统一审批决策值,前端 API 和引擎 Responder 共用。

View Source
const (
	// EventProviderSessionStarted 表示提供者创建或暴露了一个原生会话 ID。
	EventProviderSessionStarted events.EventType = "provider_session.started"
)

Variables

View Source
var BuiltinCLITools = []CLIToolSpec{
	{
		Name:         "claude",
		DisplayName:  "Claude Code",
		Binary:       "claude",
		InstallCmd:   "npm install -g @anthropic-ai/claude-code",
		DetectCmd:    "claude --version",
		VersionRegex: `Claude CLI[,:]? v?(\d+\.\d+\.\d+)`,
		Default:      true,
	},
	{
		Name:         "codex",
		DisplayName:  "Codex CLI",
		Binary:       "codex",
		InstallCmd:   "npm install -g @openai/codex",
		DetectCmd:    "codex --version",
		VersionRegex: `(\d+\.\d+\.\d+)`,
		Default:      false,
	},
}

BuiltinCLITools lists the external AI coding CLIs Leros can detect.

View Source
var DefaultApprovalRouter = NewApprovalRouter()

DefaultApprovalRouter 是全局审批路由器实例,供 HTTP handler 和 runtime 共享。

Functions

func BuildBaseEnv

func BuildBaseEnv(extraEnv map[string]string) []string

BuildBaseEnv 返回当前环境并附加额外的环境变量。

func BuildRunEnv

func BuildRunEnv(baseEnv []string, extraEnv []string, modelEnv map[string]string) []string

BuildRunEnv 为 CLI 进程组装环境变量条目。

func EnsureExternalSkillLink(skillName string, cliSkillDirs []string) error

EnsureExternalSkillLink 为单个 skill 在所有外部 CLI 目录下创建或替换 symlink。 与 ReconcileExternalSkillLinks 不同,本函数只处理一个 skill,用于 create 后增量维护。 限定条件:skillName 不能包含路径分隔符、不能是绝对路径、不能是 ".."。 若 .leros/skills/{skillName} 不存在,返回错误。

func GetDefaultEngineName

func GetDefaultEngineName(available []CLIToolStatus) string

GetDefaultEngineName chooses the preferred installed engine from detected CLI status.

func LerosMCPTokenEnvVar

func LerosMCPTokenEnvVar() string

LerosMCPTokenEnvVar returns the env var name used for CLI MCP bearer token registration.

func ReconcileExternalSkillLinks(cliSkillDirs []string) error

ReconcileExternalSkillLinks 全量对齐外部 CLI skill 目录与 .leros/skills。 遍历 .leros/skills 下所有合法 skill 子目录,在每个外部 CLI skill 根目录下创建 {skillName} → .leros/skills/{skillName} 的 symlink。

同名目标处理规则(由 ensureSymlink 实现):

  • 不存在:创建 symlink。
  • 正确 symlink:跳过(幂等)。
  • 错误 symlink:删除并重建。
  • 真实目录或文件:删除并替换为 symlink。

安全:删除前使用 Lstat,不跟随 symlink。仅删除 external/{skillName} 子路径, 不删除外部根目录或 .leros/skills 源目录。 适用场景:worker 启动 / bootstrap 时的全量初始化。

func RemoveExternalSkillLink(skillName string, cliSkillDirs []string) error

RemoveExternalSkillLink removes external symlinks for a single skill from all CLI directories. Only symlinks are removed; real directories or files are left untouched. Logs warnings on failures but continues to the next directory (same pattern as EnsureExternalSkillLink). No-op if the symlink does not exist.

func ResolveRunWorkDir

func ResolveRunWorkDir(workDir string) (string, error)

ResolveRunWorkDir returns the configured run workdir or the workspace temp fallback.

func RunCLICommand

func RunCLICommand(ctx context.Context, cliPath string, args []string, extraEnv []string) error

RunCLICommand runs a CLI command with a bounded timeout.

func ScanJSONLines

func ScanJSONLines(r io.Reader, visit func(line string) bool)

ScanJSONLines 扫描换行符分隔的 JSON 日志,支持更大的 token 缓冲区。

func SyncServerSkillsDir added in v0.1.1

func SyncServerSkillsDir(sourceDir string) error

SyncServerSkillsDir copies server built-in skills to the workspace skills directory ({workspace}/skills).

func SyncToLerosDir

func SyncToLerosDir(sourceDir string) error

SyncToLerosDir copies worker built-in skills to the Leros workspace skills directory (.leros/skills).

Types

type ApprovalDecision

type ApprovalDecision struct {
	RequestID string
	Action    string // "approve" | "deny" | "always"
	Reason    string
}

ApprovalDecision 包含用户对审批请求的决策。

type ApprovalHandler

type ApprovalHandler interface {
	// RequestApproval 提交审批请求并阻塞直到做出决策。
	// 返回决策,如果请求被取消/超时则返回错误。
	RequestApproval(ctx context.Context, req *ApprovalRequest) (*ApprovalDecision, error)
}

ApprovalHandler 处理来自引擎的审批请求。 实现必须是线程安全的。

type ApprovalRequest

type ApprovalRequest struct {
	RequestID   string
	ToolCallID  string
	ToolName    string
	Arguments   map[string]any
	Description string
	Engine      string // "claude" | "codex"
}

ApprovalRequest 描述需要用户审批的工具调用。

type ApprovalResponder

type ApprovalResponder interface {
	WriteDecision(requestID string, action string) error
}

ApprovalResponder 将审批决策写回引擎的标准输入。 每种引擎提供自己的实现,知道如何格式化引擎特定的协议。

type ApprovalRouter

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

ApprovalRouter 管理审批请求的异步等待和 HTTP 回传。 替代阻塞式 ApprovalHandler,通过 channel 桥接前端 HTTP 决策和引擎 goroutine。

func NewApprovalRouter

func NewApprovalRouter() *ApprovalRouter

NewApprovalRouter 创建审批路由器。

func (*ApprovalRouter) GetResponder

func (r *ApprovalRouter) GetResponder(requestID string) ApprovalResponder

GetResponder 获取审批请求对应的 Responder。

func (*ApprovalRouter) RequestApproval

func (r *ApprovalRouter) RequestApproval(ctx context.Context, req *ApprovalRequest) (*ApprovalDecision, error)

Wait 注册 pending 并阻塞等待前端 HTTP 回传决策。 实现 ApprovalHandler 接口,供 consumeEvents 调用。

func (*ApprovalRouter) Resolve

func (r *ApprovalRouter) Resolve(requestID, action, reason string) error

Resolve 由 HTTP handler 调用,填入前端决策并唤醒阻塞的 goroutine。

func (*ApprovalRouter) SetResponder

func (r *ApprovalRouter) SetResponder(requestID string, responder ApprovalResponder)

SetResponder 设置审批请求对应的 Responder(由 consumeEvents 在发送审批请求后调用)。

type CLIToolSpec

type CLIToolSpec struct {
	Name         string
	DisplayName  string
	Binary       string
	InstallCmd   string
	DetectCmd    string
	VersionRegex string
	Default      bool
}

CLIToolSpec describes a built-in external AI coding CLI.

func GetEngineSpecByName

func GetEngineSpecByName(name string) *CLIToolSpec

GetEngineSpecByName returns the built-in CLI spec with the given engine name.

type CLIToolStatus

type CLIToolStatus struct {
	Name        string `json:"name"`
	DisplayName string `json:"display_name"`
	Binary      string `json:"binary"`
	Installed   bool   `json:"installed"`
	Version     string `json:"version,omitempty"`
	Path        string `json:"path,omitempty"`
	InstallCmd  string `json:"install_cmd"`
	Default     bool   `json:"is_default"`
}

CLIToolStatus reports whether a built-in CLI is available in the current environment.

func DiscoverAvailableCLI

func DiscoverAvailableCLI() []CLIToolStatus

DiscoverAvailableCLI detects all built-in CLI tools from the current PATH.

func GetCLIStatusSummary

func GetCLIStatusSummary() []CLIToolStatus

GetCLIStatusSummary returns the current detection status for all built-in CLI engines.

type CmdProcess

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

CmdProcess 实现 os/exec.Cmd 的 Process 接口。

func NewCmdProcess

func NewCmdProcess(cmd *exec.Cmd) *CmdProcess

NewCmdProcess 将 cmd 包装为 Process。

func (*CmdProcess) PID

func (p *CmdProcess) PID() int

PID 返回命令启动后的进程 ID。

func (*CmdProcess) Stop

func (p *CmdProcess) Stop() error

Stop 如果进程仍在运行则终止它。

type Engine

type Engine interface {
	Prepare(ctx context.Context, req PrepareRequest) error
	GetSkillDir() string
	Run(ctx context.Context, req RunRequest) (*RunHandle, error)
}

Engine 通过外部 AI CLI 执行提示。

type MCPServerConfig

type MCPServerConfig struct {
	Name        string
	URL         string            // HTTP 传输
	BearerToken string            // HTTP 传输:bearer token
	Command     string            // Stdio 传输:可执行文件路径
	Args        []string          // Stdio 传输:命令参数
	Env         map[string]string // Stdio 传输:进程额外环境变量
}

MCPServerConfig describes the Leros MCP endpoint registered with an external CLI client.

func NormalizeMCPServerConfig

func NormalizeMCPServerConfig(cfg MCPServerConfig) MCPServerConfig

NormalizeMCPServerConfig fills defaults for an MCP server registration.

type ModelConfig

type ModelConfig struct {
	Provider string
	Model    string
	APIKey   string
	BaseURL  string
}

ModelConfig 包含注入到 CLI 进程中的模型设置。

type PendingApproval

type PendingApproval struct {
	Request   *ApprovalRequest
	Responder ApprovalResponder
	ResultCh  chan *ApprovalDecision
	CreatedAt time.Time
}

PendingApproval 表示一个等待前端决策的审批请求。

type PermissionMode

type PermissionMode string

PermissionMode 控制引擎是否/如何请求用户审批工具调用。

const (
	// PermissionModeBypass 跳过所有审批请求。
	PermissionModeBypass PermissionMode = "bypass"
	// PermissionModeOnRequest 将每个工具调用审批请求转发给用户。
	PermissionModeOnRequest PermissionMode = "on-request"
	// PermissionModeAuto 自动批准安全操作,将有风险的操作转发给用户。
	PermissionModeAuto PermissionMode = "auto"
)

type PrepareRequest

type PrepareRequest struct {
	WorkDir string
}

PrepareRequest 包含引擎特定的工作区准备输入。

type Process

type Process interface {
	PID() int
	Stop() error
}

Process 是正在运行的外部 CLI 进程句柄。

type Registry

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

Registry 存储按名称启用的外部 CLI 引擎。

func NewRegistry

func NewRegistry() *Registry

NewRegistry 创建一个空的引擎注册表。

func (*Registry) Get

func (r *Registry) Get(name string) (Engine, bool)

Get 按名称获取引擎。

func (*Registry) Names

func (r *Registry) Names() []string

Names 返回已启用引擎的名称列表。

func (*Registry) Register

func (r *Registry) Register(name string, engine Engine) error

Register 添加或替换引擎。

type RunHandle

type RunHandle struct {
	Process   Process
	Events    <-chan events.Event
	Responder ApprovalResponder // 引擎特定的审批响应写入器
}

RunHandle 在引擎进程启动后返回。

type RunRequest

type RunRequest struct {
	ExecutionID     string
	SessionID       string
	Resume          bool
	WorkDir         string
	TaskDir         string // task 目录(跨 turn 持久化),引擎可在此写入配置文件
	SystemPrompt    string
	Prompt          string
	Model           ModelConfig
	ExtraEnv        []string
	PermissionMode  PermissionMode    // 控制审批行为
	ApprovalHandler ApprovalHandler   // 可选:由运行时注入,用于 on-request/auto 模式
	MCPServers      []MCPServerConfig // MCP 服务配置,用于引擎启动时注入
}

RunRequest 包含执行一次外部 CLI 运行所需的所有输入。

Directories

Path Synopsis
Package builtin 提供外部 CLI 引擎的编排服务。
Package builtin 提供外部 CLI 引擎的编排服务。
Package claude 将 Claude Code 适配到 Leros 外部 CLI 引擎接口。
Package claude 将 Claude Code 适配到 Leros 外部 CLI 引擎接口。
Package codex 将 Codex CLI 适配到 Leros 外部 CLI 引擎接口。
Package codex 将 Codex CLI 适配到 Leros 外部 CLI 引擎接口。
Package native implements the built-in Eino-backed Leros engine.
Package native implements the built-in Eino-backed Leros engine.

Jump to

Keyboard shortcuts

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