Concrete package skeleton for an agent runtime in Go with domain-first boundaries.
agent: runtime core contracts and command/lifecycle semantics.agentreact: ReAct engine implementation built on top ofagentcontracts.policy/retry: optional retry wrappers for model/tool execution.
Layering still exists, but it is represented by file-level boundaries inside agent instead of generic package names.
- Load transcript and tool definitions.
- Ask model for next assistant message.
- If no tool calls, finish run.
- Execute tool calls and append tool observation messages.
- Repeat until completion or
maxSteps.
import (
"context"
"fmt"
"github.com/Gurpartap/agentframe/agent"
"github.com/Gurpartap/agentframe/agentreact"
eventinginmem "github.com/Gurpartap/agentframe/eventing/inmem"
runstoreinmem "github.com/Gurpartap/agentframe/runstore/inmem"
toolingregistry "github.com/Gurpartap/agentframe/tooling/registry"
)
type staticIDGenerator struct{}
func (staticIDGenerator) NewRunID(context.Context) (agent.RunID, error) {
return "generated-run-id", nil
}
type scriptedModel struct {
messages []agent.Message
index int
}
func (m *scriptedModel) Generate(_ context.Context, _ agentreact.ModelRequest) (agent.Message, error) {
if m.index >= len(m.messages) {
return agent.Message{}, fmt.Errorf("script exhausted")
}
msg := m.messages[m.index]
m.index++
if msg.Role == "" {
msg.Role = agent.RoleAssistant
}
return msg, nil
}
func newRunner(model agentreact.Model) (*agent.Runner, *runstoreinmem.Store, error) {
store := runstoreinmem.New()
events := eventinginmem.New()
tools, err := toolingregistry.New(map[string]toolingregistry.Handler{})
if err != nil {
return nil, nil, err
}
engine, err := agentreact.New(model, tools, events)
if err != nil {
return nil, nil, err
}
runner, err := agent.NewRunner(agent.Dependencies{
IDGenerator: staticIDGenerator{},
RunStore: store,
Engine: engine,
EventSink: events,
})
if err != nil {
return nil, nil, err
}
return runner, store, nil
}ctx := context.Background()
model := &scriptedModel{
messages: []agent.Message{
{Content: "done"},
},
}
runner, _, err := newRunner(model)
if err != nil {
panic(err)
}
result, err := runner.Run(ctx, agent.RunInput{
RunID: "run-quickstart",
UserPrompt: "Solve task",
MaxSteps: 4,
})
if err != nil {
panic(err)
}
fmt.Println(result.State.Status) // completed
fmt.Println(result.State.Output) // donectx := context.Background()
model := &scriptedModel{
messages: []agent.Message{
{
Content: "approval required",
Requirement: &agent.PendingRequirement{
ID: "req-approval-1",
Kind: agent.RequirementKindApproval,
Prompt: "Approve this run",
},
},
{Content: "approved and completed"},
},
}
runner, _, err := newRunner(model)
if err != nil {
panic(err)
}
runResult, err := runner.Run(ctx, agent.RunInput{
RunID: "run-suspend-continue",
UserPrompt: "Start flow",
MaxSteps: 4,
})
if err != nil {
panic(err)
}
fmt.Println(runResult.State.Status) // suspended
continued, err := runner.Continue(ctx, runResult.State.ID, 4, nil, &agent.Resolution{
RequirementID: "req-approval-1",
Kind: agent.RequirementKindApproval,
Outcome: agent.ResolutionOutcomeApproved,
})
if err != nil {
panic(err)
}
fmt.Println(continued.State.Status) // completedimport "errors"
ctx := context.Background()
model := &scriptedModel{
messages: []agent.Message{
{
Content: "approval required",
Requirement: &agent.PendingRequirement{
ID: "req-1",
Kind: agent.RequirementKindApproval,
},
},
},
}
runner, store, err := newRunner(model)
if err != nil {
panic(err)
}
suspended, err := runner.Run(ctx, agent.RunInput{
RunID: "run-suspended",
UserPrompt: "Start flow",
MaxSteps: 2,
})
if err != nil {
panic(err)
}
_, err = runner.Continue(ctx, suspended.State.ID, 2, nil, nil)
fmt.Println(errors.Is(err, agent.ErrResolutionRequired)) // true
_, err = runner.Continue(ctx, suspended.State.ID, 2, nil, &agent.Resolution{
RequirementID: "wrong-id",
Kind: agent.RequirementKindApproval,
Outcome: agent.ResolutionOutcomeApproved,
})
fmt.Println(errors.Is(err, agent.ErrResolutionInvalid)) // true
_, err = runner.Steer(ctx, suspended.State.ID, "new instruction")
fmt.Println(errors.Is(err, agent.ErrResolutionRequired)) // true
_, err = runner.FollowUp(ctx, suspended.State.ID, "continue", 2, nil)
fmt.Println(errors.Is(err, agent.ErrResolutionRequired)) // true
if err := store.Save(ctx, agent.RunState{
ID: "run-open",
Status: agent.RunStatusPending,
}); err != nil {
panic(err)
}
_, err = runner.Continue(ctx, "run-open", 2, nil, &agent.Resolution{
RequirementID: "req-1",
Kind: agent.RequirementKindApproval,
Outcome: agent.ResolutionOutcomeApproved,
})
fmt.Println(errors.Is(err, agent.ErrResolutionUnexpected)) // trueMIT © 2026 Gurpartap Singh (https://x.com/Gurpartap)