subagent

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Sep 4, 2026 License: MIT Imports: 23 Imported by: 0

Documentation

Overview

Package subagent runs child agents in-process.

It lives under runtime/ rather than plugins/ because it must import runtime/agent to construct a child — the same reason agent/coding is registered from runtime/agent. Kind names are independent of package paths.

Why the child needs its own tool runtime

Wiring the parent's tool runtime here would be a dependency cycle:

tools.default → tool.subagent.default → subagent.default → tools.default

pluginkit rejects that at build time. So deps.tools must point at a sibling runtime instance, and since that instance does not mount tool/subagent, "only the main agent can delegate" stops being a policy and becomes structural.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func DefaultDefinitionDirs added in v0.1.2

func DefaultDefinitionDirs() []string

DefaultDefinitionDirs returns the dirs scanned when config.dirs is empty.

func FindDefinition added in v0.1.2

func FindDefinition(defs []subagent.Definition, name string) (subagent.Definition, bool)

FindDefinition looks up a definition by name, case-insensitively.

func HelpCommand added in v0.1.2

func HelpCommand(ws workspace.Service, dirs []string) agentkit.Command

HelpCommand exposes the subagent definition help slash command.

func LoadDefinitions added in v0.1.2

func LoadDefinitions(ctx context.Context, ws workspace.Service, dirs []string) ([]subagent.Definition, error)

LoadDefinitions scans dirs in precedence order and returns subagent definitions.

func New

func New(cfg Config, deps Deps) (subagent.Spawner, error)

New registers subagent/inprocess: Run a child agent in-process from an agents/<name>.md definition and return only its conclusion.

Best practices:

  • deps.tools must be a sibling tools/runtime instance that does NOT mount tool/subagent: wiring the parent's runtime is a dependency cycle, and the separate instance is what makes 'only the main agent delegates' structural.
  • Give the child a narrower tool set than the parent — read-only is the common case. Delegation is for context isolation, not for a second agent editing the same workspace.
  • Pair with prompt/section/subagents so the parent can see who it may delegate to; the delegate tool's description is static and cannot list definitions read from disk.
  • Raise the delegate entry in the parent's toolTimeouts: a child agent takes far longer than a normal tool call.

func NewComposite added in v0.1.24

func NewComposite(_ struct{}, deps CompositeDeps) (subagent.Spawner, error)

NewComposite registers subagent/composite: merge inprocess and loop-agent delegatable catalogs.

func NewLoopAgent added in v0.1.24

func NewLoopAgent(cfg LoopAgentConfig, deps LoopAgentDeps) (subagent.Spawner, error)

NewLoopAgent registers subagent/loop-agent: delegate to a Loop agent instance and return only its conclusion.

Types

type CompositeDeps added in v0.1.24

type CompositeDeps struct {
	Inprocess subagent.Spawner `json:"inprocess"`
	Loop      subagent.Spawner `json:"loop,omitempty"`
}

CompositeDeps merges multiple spawners. Inprocess definitions win on name conflict.

type Config

type Config struct {
	// Dirs are definition directories in precedence order; defaults to local:agents then global:agents.
	Dirs []string `json:"dirs,omitempty"`
	// MaxSteps is step cap for definitions that do not set their own; defaults to 20.
	MaxSteps int `json:"maxSteps,omitempty"`
	// TimeoutSeconds is wall clock for one delegation; 0 leaves the delegate tool's own timeout as the only bound.
	TimeoutSeconds int `json:"timeoutSeconds,omitempty"`
}

type Deps

type Deps struct {
	Workspace    workspace.Service        `json:"workspace"`
	SessionStore agentkit.SessionStore    `json:"sessionStore"`
	LLM          agentkit.LLMProvider     `json:"llm"`
	Tools        agentkit.ToolRuntime     `json:"tools"`
	Prompt       agentkit.PromptAssembler `json:"prompt"`
	Hooks        agentkit.HookRuntime     `json:"hooks,omitempty"`
	Compaction   []compaction.Service     `json:"compaction,omitempty"`
}

type LoopAgentConfig added in v0.1.24

type LoopAgentConfig struct {
	// Agents lists Loop-backed subagents exposed to the delegate tool.
	Agents []LoopAgentEntry `json:"agents,omitempty"`
	// TimeoutSeconds is the default wall clock for one delegation.
	TimeoutSeconds int `json:"timeoutSeconds,omitempty"`
}

LoopAgentConfig configures subagent/loop-agent.

type LoopAgentDeps added in v0.1.24

type LoopAgentDeps struct {
	SessionStore agentkit.SessionStore `json:"sessionStore"`
	Agents       []agentkit.Agent      `json:"agents"`
}

LoopAgentDeps holds injected capabilities for Loop-backed delegation.

type LoopAgentEntry added in v0.1.24

type LoopAgentEntry struct {
	Name           string `json:"name"`
	Description    string `json:"description"`
	Agent          string `json:"agent"`
	Async          bool   `json:"async,omitempty"`
	TimeoutSeconds int    `json:"timeoutSeconds,omitempty"`
}

LoopAgentEntry configures one delegatable Loop agent.

type LoopAgentSpawner added in v0.1.24

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

LoopAgentSpawner delegates to configured Loop agents (e.g. agent/acp-remote).

func (*LoopAgentSpawner) BindSubmit added in v0.1.24

func (s *LoopAgentSpawner) BindSubmit(fn capschedule.SubmitFunc)

func (*LoopAgentSpawner) Definitions added in v0.1.24

func (*LoopAgentSpawner) Run added in v0.1.24

type Spawner

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

func (*Spawner) Commands added in v0.1.2

func (s *Spawner) Commands() []agentkit.Command

func (*Spawner) Definitions

func (s *Spawner) Definitions(ctx context.Context) ([]subagent.Definition, error)

func (*Spawner) Run

Jump to

Keyboard shortcuts

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