Documentation
¶
Overview ¶
Package ampacp exposes Amp as an Agent Client Protocol agent.
Serve translates ACP requests into native Amp commands. Each prompt owns one stream-json child process with the inherited environment and session overlays and a temporary lifecycle plugin. Native end receipts and quiet thread state gate export verification and durable terminal publication. ACP session identity stays stable while the native binding is stored beside history.
WithSessionStore supplies durable native exports and configuration records. Load reconciles the remote thread and replays history; resume omits replay. Confirmed missing threads recover through native import into a new thread; verified history and the replacement binding commit together. Close preserves native state.
Hosts supply telemetry through WithTracerProvider and WithMeterProvider; the package does not configure global providers.
Index ¶
- Constants
- func Serve(ctx context.Context, input io.Reader, output io.Writer, opts ...Option) (returnErr error)
- func SetModelRequest(sessionID acp.SessionId, model string) acp.SetSessionConfigOptionRequest
- func ValidateAmpSessionMeta(meta map[string]any) error
- func WithSessionAmpOptions(options AmpOptions) wire.SessionRequestOption
- func WithSessionRawEvents(enabled bool) wire.SessionRequestOption
- type Agent
- func (a *Agent) Authenticate(_ context.Context, params acp.AuthenticateRequest) (acp.AuthenticateResponse, error)
- func (a *Agent) Cancel(ctx context.Context, params acp.CancelNotification) (err error)
- func (a *Agent) Close() error
- func (a *Agent) CloseSession(ctx context.Context, params acp.CloseSessionRequest) (resp acp.CloseSessionResponse, err error)
- func (a *Agent) HandleExtensionMethod(_ context.Context, method string, params json.RawMessage) (any, error)
- func (a *Agent) Initialize(ctx context.Context, params acp.InitializeRequest) (resp acp.InitializeResponse, err error)
- func (a *Agent) ListSessions(ctx context.Context, params acp.ListSessionsRequest) (resp acp.ListSessionsResponse, err error)
- func (a *Agent) LoadSession(ctx context.Context, params acp.LoadSessionRequest) (resp acp.LoadSessionResponse, err error)
- func (a *Agent) Logout(_ context.Context, params acp.LogoutRequest) (acp.LogoutResponse, error)
- func (a *Agent) NewSession(ctx context.Context, params acp.NewSessionRequest) (resp acp.NewSessionResponse, err error)
- func (a *Agent) Prompt(ctx context.Context, params acp.PromptRequest) (resp acp.PromptResponse, err error)
- func (a *Agent) ResumeSession(ctx context.Context, params acp.ResumeSessionRequest) (resp acp.ResumeSessionResponse, err error)
- func (a *Agent) SetSessionConfigOption(ctx context.Context, params acp.SetSessionConfigOptionRequest) (resp acp.SetSessionConfigOptionResponse, err error)
- func (a *Agent) SetSessionMode(_ context.Context, params acp.SetSessionModeRequest) (acp.SetSessionModeResponse, error)
- func (a *Agent) UnstableDeleteSession(ctx context.Context, params acp.UnstableDeleteSessionRequest) (resp acp.UnstableDeleteSessionResponse, err error)
- type AmpOption
- type AmpOptions
- type ConcurrencyLimits
- type ImageLimits
- type Option
- func WithAgentName(name string) Option
- func WithAgentTitle(title string) Option
- func WithAgentVersion(version string) Option
- func WithConcurrencyLimits(limits ConcurrencyLimits) Option
- func WithConfiguredModels(ids []string) Option
- func WithDefaultModel(model string) Option
- func WithEnv(env map[string]string) Option
- func WithExecutablePath(path string) Option
- func WithHome(path string) Option
- func WithImageLimits(limits ImageLimits) Option
- func WithInputHandoffRoot(dir string) Option
- func WithLogger(logger *slog.Logger) Option
- func WithMeterProvider(provider metric.MeterProvider) Option
- func WithScratchDir(dir string) Option
- func WithSeedFiles(files map[string]string) Option
- func WithSessionStore(store acpcore.SessionStore) Option
- func WithTextMapPropagator(propagator propagation.TextMapPropagator) Option
- func WithTracerProvider(provider trace.TracerProvider) Option
- type Options
Examples ¶
Constants ¶
const ( // RawEventMethod is the notification carrying one raw Amp event when a // session opted in through _meta.amp.rawEvent.enabled. RawEventMethod = "_amp/rawEvent" // SessionStoreFormat identifies the store layout this package writes: raw // Amp thread exports under the main subpath plus the adapter's session // record under the config subpath. SessionStoreFormat = "amp-thread-json-v1" )
Variables ¶
This section is empty.
Functions ¶
func Serve ¶
func Serve(ctx context.Context, input io.Reader, output io.Writer, opts ...Option) (returnErr error)
Serve runs an ACP agent over the provided streams. It blocks until the context is cancelled or the peer closes the connection, then closes the agent.
Example (Initialize) ¶
ExampleServe_initialize embeds the agent over a pair of pipes, the same wiring a host uses for stdio, and reads the capabilities the handshake advertises.
package main
import (
"bufio"
"context"
"encoding/json"
"fmt"
"io"
ampacp "github.com/savid/acp-go-amp"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
clientToAgentReader, clientToAgentWriter := io.Pipe()
agentToClientReader, agentToClientWriter := io.Pipe()
done := make(chan error, 1)
go func() {
done <- ampacp.Serve(ctx, clientToAgentReader, agentToClientWriter)
}()
_, _ = fmt.Fprintln(clientToAgentWriter,
`{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}`)
line, _ := bufio.NewReader(agentToClientReader).ReadString('\n')
cancel()
_ = clientToAgentWriter.Close()
<-done
var response struct {
Result struct {
AuthMethods []any `json:"authMethods"`
AgentCapabilities struct {
LoadSession bool `json:"loadSession"`
SessionCapabilities map[string]any `json:"sessionCapabilities"`
} `json:"agentCapabilities"`
} `json:"result"`
}
_ = json.Unmarshal([]byte(line), &response)
fmt.Println(len(response.Result.AuthMethods))
fmt.Println(response.Result.AgentCapabilities.LoadSession)
fmt.Println(len(response.Result.AgentCapabilities.SessionCapabilities))
}
Output: 0 true 5
func SetModelRequest ¶
func SetModelRequest(sessionID acp.SessionId, model string) acp.SetSessionConfigOptionRequest
SetModelRequest constructs a model selector update, which Amp refuses: it advertises no model config option.
func ValidateAmpSessionMeta ¶
ValidateAmpSessionMeta runs the owned-namespace parsing of a session lifecycle request's _meta without an Agent and returns the same refusal.
func WithSessionAmpOptions ¶
func WithSessionAmpOptions(options AmpOptions) wire.SessionRequestOption
WithSessionAmpOptions merges Amp-specific options into _meta.amp.options.
func WithSessionRawEvents ¶
func WithSessionRawEvents(enabled bool) wire.SessionRequestOption
WithSessionRawEvents toggles raw Amp event emission for the session.
Types ¶
type Agent ¶
type Agent struct {
// contains filtered or unexported fields
}
Agent exposes the Amp coding agent through ACP.
func NewAgent ¶
NewAgent creates an ACP agent for the Amp coding agent CLI. Construction never fails; a refused option is reported by Initialize and every session-establishing method as amp_invalid_options.
func (*Agent) Authenticate ¶
func (a *Agent) Authenticate(_ context.Context, params acp.AuthenticateRequest) (acp.AuthenticateResponse, error)
Authenticate exists because the SDK interface requires it. The harness authenticates itself in its own home, outside ACP.
func (*Agent) Cancel ¶
Cancel interrupts the session's in-flight turn. It is wire-silent on an unknown session or with no turn in flight.
func (*Agent) Close ¶
Close runs the shutdown ladder for every session and refuses every later request.
func (*Agent) CloseSession ¶
func (a *Agent) CloseSession(ctx context.Context, params acp.CloseSessionRequest) (resp acp.CloseSessionResponse, err error)
CloseSession runs the shutdown ladder for one session.
func (*Agent) HandleExtensionMethod ¶
func (a *Agent) HandleExtensionMethod(_ context.Context, method string, params json.RawMessage) (any, error)
HandleExtensionMethod answers every extension method with method-not-found. The only extension surface is the outbound RawEventMethod notification.
func (*Agent) Initialize ¶
func (a *Agent) Initialize(ctx context.Context, params acp.InitializeRequest) (resp acp.InitializeResponse, err error)
Initialize implements ACP initialize.
func (*Agent) ListSessions ¶
func (a *Agent) ListSessions(ctx context.Context, params acp.ListSessionsRequest) (resp acp.ListSessionsResponse, err error)
ListSessions lists live sessions and stored sessions, newest first.
func (*Agent) LoadSession ¶
func (a *Agent) LoadSession(ctx context.Context, params acp.LoadSessionRequest) (resp acp.LoadSessionResponse, err error)
LoadSession restores a session and replays its history.
func (*Agent) Logout ¶
func (a *Agent) Logout(_ context.Context, params acp.LogoutRequest) (acp.LogoutResponse, error)
Logout exists because the SDK interface requires it.
func (*Agent) NewSession ¶
func (a *Agent) NewSession(ctx context.Context, params acp.NewSessionRequest) (resp acp.NewSessionResponse, err error)
NewSession creates a native Amp thread.
func (*Agent) Prompt ¶
func (a *Agent) Prompt(ctx context.Context, params acp.PromptRequest) (resp acp.PromptResponse, err error)
Prompt sends one turn to Amp and streams updates until it settles.
func (*Agent) ResumeSession ¶
func (a *Agent) ResumeSession(ctx context.Context, params acp.ResumeSessionRequest) (resp acp.ResumeSessionResponse, err error)
ResumeSession restores a session without replaying its history.
func (*Agent) SetSessionConfigOption ¶
func (a *Agent) SetSessionConfigOption(ctx context.Context, params acp.SetSessionConfigOptionRequest) (resp acp.SetSessionConfigOptionResponse, err error)
SetSessionConfigOption applies one select value.
func (*Agent) SetSessionMode ¶
func (a *Agent) SetSessionMode(_ context.Context, params acp.SetSessionModeRequest) (acp.SetSessionModeResponse, error)
SetSessionMode exists because the SDK interface requires it. Native modes are config options, never ACP session modes.
func (*Agent) UnstableDeleteSession ¶
func (a *Agent) UnstableDeleteSession(ctx context.Context, params acp.UnstableDeleteSessionRequest) (resp acp.UnstableDeleteSessionResponse, err error)
UnstableDeleteSession tombstones the session first, then closes any live session with the same id. The native thread remains on Amp's service.
type AmpOption ¶
type AmpOption func(*AmpOptions)
AmpOption configures AmpOptions values.
func WithAmpEnv ¶
WithAmpEnv configures the session environment overlay.
func WithAmpExtraPathDirs ¶
WithAmpExtraPathDirs configures the directories prepended to the session PATH.
func WithAmpMode ¶
WithAmpMode selects a native built-in or plugin mode.
func WithAmpModel ¶
WithAmpModel sets the model field, which Amp refuses at session start: the native CLI selects models through its modes.
type AmpOptions ¶
type AmpOptions struct {
// Mode selects a native built-in or plugin mode.
Mode string `json:"mode,omitempty"`
// Model is unsupported by Amp; use Mode.
Model string `json:"model,omitempty"`
// Env overlays the session's amp process environment.
Env map[string]string `json:"env,omitempty"`
// ExtraPathDirs are absolute directories prepended, in order, to the PATH
// of this session's amp process.
ExtraPathDirs []string `json:"extraPathDirs,omitempty"`
}
AmpOptions is the per-session options struct carried at _meta.amp.options.
func NewAmpOptions ¶
func NewAmpOptions(opts ...AmpOption) AmpOptions
NewAmpOptions constructs AmpOptions from functional options.
Example ¶
package main
import (
"fmt"
ampacp "github.com/savid/acp-go-amp"
)
func main() {
options := ampacp.NewAmpOptions(ampacp.WithAmpMode("medium"))
fmt.Println(options.Mode)
}
Output: medium
func (AmpOptions) Meta ¶
func (options AmpOptions) Meta() map[string]any
Meta returns exactly {"amp": {"options": {...}}} with the selected fields.
type ConcurrencyLimits ¶
ConcurrencyLimits controls per-agent backpressure. Zero fields use defaults.
type ImageLimits ¶
type ImageLimits struct {
MaxInputBytesPerImage int64
MaxInputBytesPerPrompt int64
MaxOutputBytesPerImage int64
MaxOutputBytesPerToolCall int64
}
ImageLimits bounds decoded image bytes. A zero field disables that policy limit; the frame clamp still applies.
type Option ¶
type Option func(*Options)
Option configures the amp ACP agent.
func WithAgentName ¶
WithAgentName sets the protocol identifier advertised during ACP initialize.
func WithAgentTitle ¶
WithAgentTitle sets the human-readable agent name advertised during ACP initialize.
func WithAgentVersion ¶
WithAgentVersion sets the agent version advertised during ACP initialize.
func WithConcurrencyLimits ¶
func WithConcurrencyLimits(limits ConcurrencyLimits) Option
WithConcurrencyLimits sets process-local backpressure limits.
func WithConfiguredModels ¶
WithConfiguredModels is unsupported by Amp.
func WithDefaultModel ¶
WithDefaultModel is unsupported by Amp.
func WithEnv ¶
WithEnv sets the static agent-scoped environment overlay applied to every amp process after the inherited environment and before the session env.
func WithExecutablePath ¶
WithExecutablePath selects the amp executable.
func WithImageLimits ¶
func WithImageLimits(limits ImageLimits) Option
WithImageLimits bounds decoded image bytes. A zero field disables that policy limit; a negative field fails construction.
func WithInputHandoffRoot ¶
WithInputHandoffRoot sets the absolute directory under which handoff-form prompt images are read. The adapter never writes there.
func WithLogger ¶
WithLogger configures structured diagnostic logging.
func WithMeterProvider ¶
func WithMeterProvider(provider metric.MeterProvider) Option
WithMeterProvider configures the OpenTelemetry meter provider.
func WithScratchDir ¶
WithScratchDir sets the parent directory for ephemeral adapter state.
func WithSeedFiles ¶
WithSeedFiles registers files written into amp's config root before each launch. Keys are paths relative to that root; values are the contents.
func WithSessionStore ¶
func WithSessionStore(store acpcore.SessionStore) Option
WithSessionStore configures the session store.
func WithTextMapPropagator ¶
func WithTextMapPropagator(propagator propagation.TextMapPropagator) Option
WithTextMapPropagator configures trace-context extraction from ACP _meta.
func WithTracerProvider ¶
func WithTracerProvider(provider trace.TracerProvider) Option
WithTracerProvider configures the OpenTelemetry tracer provider.
type Options ¶
type Options struct {
// AgentName is the protocol identifier advertised during ACP initialize.
AgentName string
// AgentTitle is the human-readable agent name advertised during ACP initialize.
AgentTitle string
// AgentVersion is the agent version advertised during ACP initialize.
AgentVersion string
// ExecutablePath selects the amp executable. A bare name is searched on the
// base PATH; a path containing a separator is used as given. Empty means
// "amp".
ExecutablePath string
// Home is unsupported; Amp resolves its native files from the inherited environment.
Home string
// ScratchDir is the parent directory for ephemeral adapter state. Empty
// means the system temp directory.
ScratchDir string
// InputHandoffRoot is the absolute directory under which handoff-form
// prompt images are read. Empty rejects the handoff form.
InputHandoffRoot string
// DefaultModel is unsupported; use the native mode option.
DefaultModel string
// ConfiguredModels is unsupported because Amp has no model catalog.
ConfiguredModels []string
// Env is the static agent-scoped overlay on the inherited process
// environment every amp process runs with.
Env map[string]string
// Logger receives structured diagnostic logs. If nil, the default logger is used.
Logger *slog.Logger
// TracerProvider records adapter spans. If nil, tracing is a no-op.
TracerProvider trace.TracerProvider
// MeterProvider records adapter metrics. If nil, metrics are no-ops.
MeterProvider metric.MeterProvider
// TextMapPropagator extracts trace context from ACP _meta. If nil, W3C
// trace context plus baggage propagation is used.
TextMapPropagator propagation.TextMapPropagator
// SessionStore is the durability boundary for session rows. Nil installs a
// fresh in-memory store.
SessionStore acpcore.SessionStore
// ConcurrencyLimits controls process-local backpressure.
ConcurrencyLimits ConcurrencyLimits
// SeedFiles maps paths relative to amp's config root to file contents
// written there before each launch.
SeedFiles map[string]string
// ImageLimits bounds decoded image bytes on prompt input and emitted
// output. Every field defaults to 6 MiB when the option is omitted.
ImageLimits ImageLimits
// contains filtered or unexported fields
}
Options configures the ACP agent process and the native Amp prompt processes.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
acp-go-amp
command
|
|
|
Package integration holds the tests that run against an installed Amp.
|
Package integration holds the tests that run against an installed Amp. |
|
internal
|
|
|
amp
Package amp implements the native Amp command and stream-json boundary.
|
Package amp implements the native Amp command and stream-json boundary. |