AGENTS.md@pkg/agent · git:20260804.c57f369 · 2026-08-04 · sha256 d9b4b5d828362af3
AGENTS.md@pkg/agent git:20260804.c57f369A
Immutable. This exact content is served forever at /api/v1/blob/d9b4b5d828362af3.
# Agent Guide
Core agent engine (Observe-Think-Act, tools, sessions, hooks). LLM via `pkg/agent/llm` (`llms.Model` only).
Full docs: [docs/agent/](../../docs/agent/README.md). Reference tool: `tools/echo/`.
Product orchestration (REST/Web/platform/store) lives in `internal/server/chatagent` — do not move store/http/platform logic here. Product tools that depend on hub/capability/notify live under `internal/server/chatagent/tools/` (e.g. clip, notify).
## Structure
```
agent/
├── facade.go, types.go, doc.go # Public facade (msg aliases + loop re-exports)
├── msg/ # Core message/context/error types (canonical definitions)
├── result/ # Result[T,E], typed errors, overflow helpers
├── event/ # Lifecycle event stream
├── loop/ # Observe-Think-Act + stateful Agent runtime
├── llm/ # langchaingo adapter, retry, fake model
├── tool/ # Registry, schema, executor, ValidateArgs, FormatToolError
├── session/ # Session tree + Storage interface + JSONL helpers
├── model/ # Model catalog and dual-model router
├── transform/ # convertToLLM + multimodal helpers
├── ctxmgr/ # Context budget, compaction, branch summarization
├── hooks/ # Typed hook registry (on/observe/emit) bridged to loop Config
├── harness/ # High-level orchestration with hooks + overflow degrade
├── permission/ # Tool permission evaluation, forms, session/scheduled policies
├── approval/ # Auto approval mode: flagged detector, aux reviewer, denial breaker
├── dcg/ # Destructive Command Guard for run_terminal / run_code
├── loopdetect/ # Tool-loop detectors (generic/no-progress/ping-pong/global/post-compaction)
├── subagent/ # Subagent orchestration
├── env/ # ExecutionEnv for FS/shell with Result
├── sandbox/ # Opt-in Docker ExecutionEnv for shell/code
├── tools/
│ ├── coding/ # Code/FS/web/terminal tools
│ └── echo/ # Reference echo tool
└── eval/ # FakeModel harness eval scenarios
```
## Entry points
Hot-path packages: `loop` / `harness` / `hooks` / `tool` / `session` / `permission` / `ctxmgr` / `model` / `transform` (`DefaultConvertToLLM`). Engine tools under `tools/coding/`, `tools/echo/`; also `dcg/`, `loopdetect/`, `subagent/`, `sandbox/`. Eval: `eval/`.
External callers may keep importing `pkg/agent` for types (`AgentMessage`, `NewAgent`, `RunLoop`). Subpackages must not import the parent `pkg/agent` facade — use `msg` / `loop` instead. `ctxmgr` depends only on the `StatefulAgent` seam (`State` / `ApplyState`).
## Non-obvious rules
- **langchaingo**: only `llms.Model` in `pkg/agent/llm` — no agents/chains.
- **Modules**: prefer `pkg/agent/llm` for single-shot LLM. Web may import already-wired packages (`permission`; tests: `model`/`msg`/`session`); do not import other `pkg/agent` packages from modules until wired.
- Distinct from `pkg/types/agent.go` (instruct) and YAML `chat_agent` config.
- JSON/JSONL: `sonic`. Metrics: `metrics.Agent()` — low-cardinality labels (`status`, `model`, `tool`, `level`); never `session_id`.
- LLM retry only before first stream delta (`ErrStreamStarted`). Tool expected failures → `ToolResultMessage{IsError: true}` + `FormatToolError`.
- Result pattern: `env` / `ctxmgr` / JSONL parse return `result.Result[T,E]`; harness/session public APIs use Go `error`. Hook cancel: `hooks.ErrRunCancelled`.
- Harness bridges hooks via `hooks.BridgeConfig` only when `HasLoopHandlers()` (not Observe-only).
## Testing
```bash
go test ./pkg/agent/...
go test ./pkg/agent/eval/...
go tool task agent:eval # FakeModel regression via composer
go tool task agent:eval:live # capability path (L1/L2/L3 Total + appendix pass^k)
```
Eval notes: extend `Expectation`/`Score` (required/forbidden tools, outcome asserts); keep `ExpectedTools` order soft unless `StrictToolOrder`. Scorecard Total = 0.2*L1+0.5*L2+0.3*L3 (judge quality is appendix-only). Case YAML may set `tier` / `metrics`. Do not import `internal/server/chatagent` from this package. Product policy evals live in `internal/server/chatagent/eval`. See [docs/agent/README.md](../../docs/agent/README.md#agent-evaluation).
Path-only moves of product tools (`clip`/`notify` → `internal/server/chatagent/tools/`) keep existing package unit tests; no BDD update is required when behavior is unchanged.