Skip to content

Instantly share code, notes, and snippets.

@cypriss
Created January 7, 2026 22:31
Show Gist options
  • Select an option

  • Save cypriss/ec4153a142566267488958cec6f4b7cb to your computer and use it in GitHub Desktop.

Select an option

Save cypriss/ec4153a142566267488958cec6f4b7cb to your computer and use it in GitHub Desktop.
Codalotl Initial Context Example
<current-package>
Module path: "/Users/theuser/code/codalotl"
Package relative path: "internal/agent"
Absolute package path: "/Users/theuser/code/codalotl/internal/agent"
Package import path: "github.com/codalotl/codalotl/internal/agent"
</current-package>
<ls ok="true" cwd="/Users/theuser/code/codalotl/internal/agent">
$ ls -1p
SPEC.md
agent.go
agent_test.go
event.go
status.go
subagent.go
</ls>
<pkg-map type="non-tests">
// agent.go:
package agent
import (
"context"
"crypto/rand"
"encoding/hex"
"errors"
"fmt"
"github.com/codalotl/codalotl/internal/llmmodel"
"github.com/codalotl/codalotl/internal/llmstream"
"sync"
)
var (
ErrAlreadyRunning = errors.New("agent: already running")
errMissingCompletion = errors.New("agent: llmstream completed without a final turn")
errNoToolCallsPresent = errors.New("agent: finish reason requested tool use but no tool calls were present")
)
var newConversation = llmstream.NewConversation
type Agent struct {
sessionID string
agentID string
model llmmodel.ModelID
conv llmstream.StreamingConversation
mu sync.Mutex
status Status
turns []llmstream.Turn
tokenUsage llmstream.TokenUsage
contextUsageTokens int64
tools map[string]llmstream.Tool
toolList []llmstream.Tool
parent *Agent
depth int
parentOut chan<- Event
currentOut chan<- Event
}
func NewAgent(model llmmodel.ModelID, systemPrompt string, tools []llmstream.Tool) (*Agent, error)
func (a *Agent) SessionID() string
func (a *Agent) Status() Status
func (a *Agent) TokenUsage() llmstream.TokenUsage
func (a *Agent) ContextUsagePercent() int
func (a *Agent) Turns() []llmstream.Turn
func (a *Agent) AddUserTurn(text string) error
func (a *Agent) SendUserMessage(ctx context.Context, message string) <-chan Event
func (a *Agent) run(ctx context.Context, out chan<- Event)
func (a *Agent) sendOnce(ctx context.Context, out chan<- Event) (*llmstream.Turn, map[string]struct{}, error)
func (a *Agent) handleToolUse(ctx context.Context, out chan<- Event, calls []llmstream.ToolCall, seen map[string]struct{}) error
func (a *Agent) emitTerminalEvent(out chan<- Event, err error)
func newTextTurn(role llmstream.Role, text string) llmstream.Turn
func toolResultTurn(results []llmstream.ToolResult) llmstream.Turn
func cloneTurns(src []llmstream.Turn) []llmstream.Turn
func cloneTurn(t llmstream.Turn) llmstream.Turn
func (a *Agent) meta() AgentMeta
func (a *Agent) dispatchEvent(local chan<- Event, ev Event)
func (a *Agent) relayFromChild(ev Event, child chan<- Event)
func (a *Agent) finishRun()
func (a *Agent) addUsage(usage llmstream.TokenUsage)
func (a *Agent) updateContextUsage(usage llmstream.TokenUsage)
func contextTokensFromUsage(usage llmstream.TokenUsage) int64
func clampNonNegative(v int64) int64
func percentOfContext(used, capacity int64) int
func buildToolRegistry(tools []llmstream.Tool) (map[string]llmstream.Tool, []llmstream.Tool)
func cloneToolSlice(tools []llmstream.Tool) []llmstream.Tool
func newAgentInstance(model llmmodel.ModelID, systemPrompt string, tools []llmstream.Tool, sessionID, agentID string, parent *Agent, depth int, parentOut chan<- Event) (*Agent, error)
func generateSessionID() (string, error)
// event.go:
package agent
import "github.com/codalotl/codalotl/internal/llmstream"
type EventType string
const (
EventTypeError EventType = "error"
EventTypeCanceled EventType = "canceled"
EventTypeDoneSuccess EventType = "done_success"
EventTypeAssistantText EventType = "assistant_text"
EventTypeAssistantReasoning EventType = "assistant_reasoning"
EventTypeToolCall EventType = "tool_call"
EventTypeToolComplete EventType = "tool_complete"
EventTypeAssistantTurnComplete EventType = "assistant_turn_complete"
EventTypeWarning EventType = "warning"
EventTypeRetry EventType = "retry"
)
type Event struct {
Agent AgentMeta
Type EventType
Error error
TextContent llmstream.TextContent
ReasoningContent llmstream.ReasoningContent
Tool string
ToolCall *llmstream.ToolCall
ToolResult *llmstream.ToolResult
Turn *llmstream.Turn
}
type AgentMeta struct {
ID string
Depth int
}
// status.go:
package agent
type Status int
const (
StatusIdle Status = iota
StatusRunning
)
// subagent.go:
package agent
import (
"context"
"github.com/codalotl/codalotl/internal/llmmodel"
"github.com/codalotl/codalotl/internal/llmstream"
"sync"
)
type AgentCreator interface {
New(model llmmodel.ModelID, systemPrompt string, tools []llmstream.Tool) (*Agent, error)
NewWithDefaultModel(systemPrompt string, tools []llmstream.Tool) (*Agent, error)
}
type SubAgentCreator interface {
AgentCreator
}
func NewAgentCreator() AgentCreator
type defaultAgentCreator struct {
defaultModel llmmodel.ModelID
}
func (c *defaultAgentCreator) New(model llmmodel.ModelID, systemPrompt string, tools []llmstream.Tool) (*Agent, error)
func (c *defaultAgentCreator) NewWithDefaultModel(systemPrompt string, tools []llmstream.Tool) (*Agent, error)
type subAgentFactory struct {
mu sync.Mutex
parent *Agent
parentOut chan<- Event
defaultModel llmmodel.ModelID
tools []llmstream.Tool
closed bool
}
func newSubAgentFactory(parent *Agent) *subAgentFactory
func (f *subAgentFactory) New(model llmmodel.ModelID, systemPrompt string, tools []llmstream.Tool) (*Agent, error)
func (f *subAgentFactory) NewWithDefaultModel(systemPrompt string, tools []llmstream.Tool) (*Agent, error)
func (f *subAgentFactory) create(model llmmodel.ModelID, systemPrompt string, tools []llmstream.Tool) (*Agent, error)
func (f *subAgentFactory) Close()
func withSubAgentContext(ctx context.Context, factory *subAgentFactory, depth int) context.Context
func SubAgentCreatorFromContext(ctx context.Context) SubAgentCreator
func SubAgentDepth(ctx context.Context) int
func AgentToolsFromContext(ctx context.Context) []llmstream.Tool
type toolContextKey struct{}
type toolContextValues struct {
depth int
tools []llmstream.Tool
creator *subAgentFactory
}
var _ AgentCreator = (*defaultAgentCreator)(nil)
var _ AgentCreator = (*subAgentFactory)(nil)
var _ SubAgentCreator = (*subAgentFactory)(nil)
</pkg-map>
<pkg-map type="tests">
elided; limited to 25 lines for tests
</pkg-map>
<used-by>
github.com/codalotl/codalotl/internal/agentformatter
github.com/codalotl/codalotl/internal/noninteractive
github.com/codalotl/codalotl/internal/subagents/clarifydocs
github.com/codalotl/codalotl/internal/subagents/clarifydocs_test
github.com/codalotl/codalotl/internal/subagents/packagemode
github.com/codalotl/codalotl/internal/subagents/packagemode_test
github.com/codalotl/codalotl/internal/tools/pkgtools
github.com/codalotl/codalotl/internal/tui
</used-by>
<diagnostics-status ok="true" message="build succeeded">
$ go build -o /dev/null ./internal/agent
</diagnostics-status>
<test-status ok="true">
$ go test ./internal/agent
ok github.com/codalotl/codalotl/internal/agent (cached)
</test-status>
<lint-status ok="true" message="no issues found">
$ gofmt -l internal/agent
</lint-status>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment