shell

package
v0.44.0 Latest Latest
Warning

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

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

Documentation

Overview

Package shell exposes a model-callable shell tool over the Executor SPI. Local, sandboxed, or remote backends implement Executor; NewLocalExecutor runs commands on the host.

A non-zero exit status is a completed execution result. Transport, collection, and cleanup errors can leave the outcome unknown; Tool retains the observed output as core/tool.CallError evidence without inventing a definite failure. Response streams use content.Content so binary data and a UTF-8 prefix split by a byte limit survive serialization without losing the other observations.

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrEmptyCommand and ErrInvalidInput reject the command before execution.
	// Backends must not return either after dispatch or mutation.
	ErrEmptyCommand  = errors.New("shell: command must not be empty")
	ErrInvalidConfig = errors.New("shell: executor configuration is invalid")
	ErrInvalidInput  = errors.New("shell: input is invalid")
	ErrNilExecutor   = errors.New("shell: executor must not be nil")
)

Functions

This section is empty.

Types

type Config added in v0.20.0

type Config struct {
	Executor Executor
	// Description replaces the neutral default with the host's actual shell
	// semantics and tool-use policy. Empty selects the neutral description.
	Description string
}

type Executor

type Executor interface {
	// Run executes one command, honoring ctx and Input.Timeout. A non-zero exit
	// status is Output, not an error. An error reports spawn, I/O, or
	// collection failure and leaves side effects uncertain; Output still
	// carries every available observation. Return core/tool.Failure only for an
	// established unsuccessful outcome, since it owns its model-visible output.
	Run(ctx context.Context, in Input) (Output, error)
}

Executor is the authority boundary behind the model-facing shell tool. The concrete implementation owns process creation, working-directory policy, environment exposure, output capture, termination, and platform semantics.

type Input

type Input struct {
	Cmd string

	// Timeout zero means no timeout beyond ctx.
	Timeout time.Duration
}

type LocalExecutor

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

LocalExecutor runs commands on the local host through one immutable construction-time configuration. Each call owns a Unix process group and kills that group on cancellation or return, including background children. A command that deliberately creates another session requires a host sandbox to keep its lifetime confined; this executor is not a process sandbox.

func NewLocalExecutor

func NewLocalExecutor(config LocalExecutorConfig) (*LocalExecutor, error)

NewLocalExecutor freezes an absolute working directory and output limits.

func (*LocalExecutor) Run

func (l *LocalExecutor) Run(ctx context.Context, in Input) (Output, error)

type LocalExecutorConfig added in v0.41.0

type LocalExecutorConfig struct {
	Directory string
	Shell     string
	// MaxBytesPerStream caps captured stdout and stderr independently.
	// Zero selects 30 KiB per stream; truncation markers are additional bytes.
	MaxBytesPerStream int
}

LocalExecutorConfig makes the local process authority visible at construction. The directory controls relative-path resolution but is not a filesystem jail; callers that need confinement must supply an OS sandbox or container.

type Output

type Output struct {
	Stdout   []byte
	Stderr   []byte
	ExitCode int
	Duration time.Duration
	// Truncation is observed by the executor, independent of markers in the
	// output. False does not prove complete collection when Run returns an error.
	StdoutTruncated bool
	StderrTruncated bool

	// CancellationObserved reports that cancellation or timeout was observed
	// before returning; it does not establish why the process exited.
	CancellationObserved bool
}

Output retains the executor's observations. ExitCode is -1 when no exit status was obtained, so an unobserved exit is never reported as success.

type Request

type Request struct {
	Command   string `` /* 128-byte string literal not displayed */
	TimeoutMS int    `` /* 168-byte string literal not displayed */
}

Environment, working directory, and streaming remain executor-owned.

type Response

type Response struct {
	Stdout               content.Content `json:"stdout"`
	Stderr               content.Content `json:"stderr"`
	StdoutTruncated      bool            `json:"stdout_truncated,omitzero"`
	StderrTruncated      bool            `json:"stderr_truncated,omitzero"`
	ExitCode             int             `json:"exit_code"`
	CancellationObserved bool            `json:"cancellation_observed,omitzero"`
	Duration             string          `json:"duration"`
}

Captured bytes remain lossless for binary output and truncated UTF-8 text.

type Tool

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

Tool retains Host-selected execution authority; model arguments cannot change the shell, working directory, or process policy.

func NewTool

func NewTool(config Config) (*Tool, error)

func (*Tool) Call

func (t *Tool) Call(ctx context.Context, invocation toolcontract.Invocation) (chat.ToolOutput, error)

func (*Tool) Definition

func (t *Tool) Definition() chat.ToolDefinition

func (*Tool) Unwrap added in v0.19.0

func (t *Tool) Unwrap() toolcontract.Tool

Jump to

Keyboard shortcuts

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