{"owner":"google","repo":"adk-go","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md","CLAUDE.md","GEMINI.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\nContext for AI coding agents (Claude Code, Gemini CLI, Cursor, Copilot, etc.)\nworking in the ADK Go repository. Human contributors should start with\nCONTRIBUTING.md.\n\n## Project overview\n\nADK Go (`google.golang.org/adk/v2`) is an open-source, code-first Go toolkit for\nbuilding, evaluating, and deploying AI agents. It is model-agnostic but\noptimized for Gemini, and is one of several ADK implementations — Go, Python,\nJava, Kotlin, and TypeScript — that share a conceptual model but are independent\ncodebases. Requires the Go version declared in `go.mod` (currently 1.26.5).\n\nDevelopment happens on `main`, the 2.x line. `v1` is the maintenance branch for\n1.x; target it only for fixes that must ship to 1.x. See\n[Branches](CONTRIBUTING.md#branches).\n\n## Setup & core commands\n\nThis repo is multi-module: the root module `google.golang.org/adk/v2` plus\n`plugin/agentanalytics`. Set up a Go workspace first — `go.work` is local-only\nand gitignored, and `go work init` fails if one already exists:\n\n```bash\ntest -f go.work || go work init\ngo work use -r .\n```\n\nThen run from the repo root. The `work` pattern spans every module in the\nworkspace, while `./...` matches only the module you are standing in:\n\n- Build:       `go build -mod=readonly work`\n- Test:        `go test -race -mod=readonly -count=1 -shuffle=on work`\n- Single pkg:  `go test -race ./agent/...`\n- Lint:        `golangci-lint run`   (per module; v2, CI pins v2.3.1; config in `.golangci.yml`)\n- Tidy check:  `go mod tidy -diff`   (per module; must print nothing)\n- Format:      `golangci-lint fmt`   (per module; applies gofumpt + goimports per config)\n\nWithout a `go.work`, `work` silently falls back to the root module alone and\nstill exits 0, so confirm the workspace exists before trusting a green run.\n`golangci-lint` and `go mod tidy` are per-module either way: run them inside each\nsubmodule too (for example, `cd plugin/agentanalytics`). CI does the same,\nrunning build, test, tidy, and lint once per module, with `-v` on build and test.\n\n## Definition of done\n\nA change is complete only when all of these pass locally:\n\n1. `go build` (above) succeeds.\n2. `go test` (above) is green.\n3. `golangci-lint run` reports no findings, in every module.\n4. `go mod tidy -diff` prints nothing, in every module.\n5. New/changed behavior has tests; a bug fix has a test that reproduces the bug.\n6. Every new Go file starts with the Apache 2.0 license header (enforced by `goheader`).\n7. The root `go.mod` does not require an in-repo submodule (enforced by the\n   `guardrail` CI job).\n\n## Repository layout\n\n- `agent/`     Agent interface + types (`llmagent`, `remoteagent`, `workflowagent`;\n  `workflowagents/` holds `loopagent`, `parallelagent`, `sequentialagent`)\n- `runner/`    Execution engine that drives the run loop\n- `workflow/`  Node/graph-based workflow engine for multi-agent apps\n- `model/`     LLM abstraction (`gemini`, `apigee`, `openaimodel`)\n- `tool/`      Tool/Toolset interface + built-in tools (incl. `skilltoolset/`, `mcptoolset/`)\n- `session/`   Conversation state + events\n- `memory/`, `artifact/`   Long-term memory and file/data services\n- `auth/`      Credentials and auth providers for outbound requests\n- `agentregistry/`  Client for Google Cloud Agent Registry (A2A agents, MCP servers, models)\n- `plugin/`    Cross-cutting lifecycle hooks; `plugin/agentanalytics` is a separate module\n- `server/`    HTTP servers (`adkrest` is primary; `adka2a`, `agentengine`)\n- `cmd/`       CLI (`adkgo`) and server launchers\n- `telemetry/`, `util/`   Public helper packages\n- `platform/`  Overridable seams for time & UUID generation (deterministic tests)\n- `internal/`  Private packages — NOT public API; `internal/httprr` is vendored\n- `examples/`  Runnable example agents (quickstart, tools, a2a, skills, …)\n- `scripts/`   Repo tooling (ADK Web container build and asset refresh)\n\n## Conventions & idioms\n\n- **Streaming:** agent runs return `iter.Seq2[*session.Event, error]`; consume\n  with `for event, err := range … {}`. Don't collect events into a slice.\n- **Interface-first:** public packages expose interfaces (`Agent`, `Tool`,\n  `Toolset`, `Service`); concrete impls live in sub-packages or `internal/`.\n- **Callbacks over subclassing** (`Before*`/`After*` for Agent/Model/Tool);\n  returning non-nil from a `Before` callback short-circuits execution.\n- **Errors:** wrap with `fmt.Errorf(\"…: %w\", err)`. Use `%v` only when\n  deliberately not exposing the wrapped error's type. Don't convert existing `%w` to `%v`;\n  it might break callers silently. Wrap sentinels first:\n  `fmt.Errorf(\"%w: …: %w\", ErrX, err)`. Tool confirmation uses sentinel errors\n  (e.g. `tool.ErrConfirmationRequired`).\n- Prefer an existing helper over a new one; keep packages small and focused.\n\n## Minimal example\n\n```go\nmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\",\n    &genai.ClientConfig{APIKey: os.Getenv(\"GOOGLE_API_KEY\")})\n// handle err\na, err := llmagent.New(llmagent.Config{\n    Name:        \"assistant\",\n    Model:       model,\n    Instruction: \"You are a helpful assistant.\",\n    Tools:       []tool.Tool{ /* ... */ },\n})\n// handle err\nr, err := runner.New(runner.Config{\n    AppName:           \"my-app\",\n    Agent:             a,\n    SessionService:    session.InMemoryService(),\n    AutoCreateSession: true,\n})\n// handle err\nmsg := genai.NewContentFromText(\"Hello\", genai.RoleUser)\nfor event, err := range r.Run(ctx, userID, sessionID, msg, agent.RunConfig{}) {\n    // handle err; read event.LLMResponse.Content\n}\n```\n\nSee `examples/quickstart` for a full runnable program.\n\n## Extending the framework\n\n- **Add a tool:** wrap a Go function with\n  `functiontool.New[Args, Results](cfg, handler)` (Args/Results are structs), or\n  implement the `tool.Tool` interface for full control.\n- **Add a toolset:** implement `tool.Toolset`; its `Tools(ctx)` may return\n  different tools per invocation.\n- **Add an agent type:** follow the `agent/workflowagents/*` packages; construct\n  agents via `llmagent.New` / `agent.New`, not by implementing `agent.Agent`\n  directly.\n- **Add cross-cutting behavior:** register a `plugin.New(plugin.Config{...})`\n  hook (`Before*`/`After*` for run/agent/model/tool) instead of editing the loop.\n\n## Multi-module development\n\nSee [Multi-Module Development](CONTRIBUTING.md#multi-module-development) in\n`CONTRIBUTING.md` for policy, steps to add a new module, and release tagging.\n\n## Testing\n\n- Tests run **offline by default**: LLM HTTP traffic is replayed from\n  `testdata/*.httprr` via `internal/httprr`. Never add live model or network\n  calls to tests.\n- To (re)record a package's traffic, supply real credentials (e.g.\n  `GOOGLE_API_KEY`) and run `go generate ./<pkg>/...` (it runs\n  `go test -httprecord=…`); commit the updated `testdata/*.httprr`.\n- Prefer table-driven tests; shared helpers live in `internal/testutil`.\n\n## Boundaries\n\n**Always**\n- Run build, tests, lint, and `go mod tidy -diff` before declaring done.\n- Keep PRs small and focused — one concern per PR.\n- Add or update tests for the code you change.\n\n**Ask first**\n- Adding or upgrading a dependency (`go.mod`).\n- Changing a high-fan-in package (`session`, `agent`, `model`, `tool`,\n  `runner`) — prefer additive, backward-compatible changes.\n- Any change to the public API surface, and any breaking change.\n\n**Never**\n- Break the public API — keep changes backward-compatible.\n- Edit vendored code (`internal/httprr`) or commit secrets / API keys.\n- Add tests that make live LLM or network calls.\n\n## PRs & commits\n\nSee `CONTRIBUTING.md` for the full process and CLA. Key points for agents:\nmost PRs (beyond trivial docs/typos) need a linked issue; include a **Testing\nPlan**; attach logs or screenshots for behavior changes (Runner output / ADK Web).\n\n## Alignment with adk-python\n\n[adk-python](https://github.com/google/adk-python) is the source of truth for\nfeature behavior. When porting or validating a feature, check parity with the\nPython implementation.\n\n## Resources\n\n- Docs: https://google.github.io/adk-docs/\n- Examples: `./examples`\n- Other ADK implementations: [Python](https://github.com/google/adk-python),\n  [Java](https://github.com/google/adk-java),\n  [Kotlin](https://github.com/google/adk-kotlin),\n  [TypeScript](https://github.com/google/adk-js)\n","CLAUDE.md":"See [AGENTS.md](./AGENTS.md) for project context, commands, and contribution guidelines for AI coding agents.\n","GEMINI.md":"See [AGENTS.md](./AGENTS.md) for project context, commands, and contribution guidelines for AI coding agents.\n"},"files":{"AGENTS.md":"# AGENTS.md\n\nContext for AI coding agents (Claude Code, Gemini CLI, Cursor, Copilot, etc.)\nworking in the ADK Go repository. Human contributors should start with\nCONTRIBUTING.md.\n\n## Project overview\n\nADK Go (`google.golang.org/adk/v2`) is an open-source, code-first Go toolkit for\nbuilding, evaluating, and deploying AI agents. It is model-agnostic but\noptimized for Gemini, and is one of several ADK implementations — Go, Python,\nJava, Kotlin, and TypeScript — that share a conceptual model but are independent\ncodebases. Requires the Go version declared in `go.mod` (currently 1.26.5).\n\nDevelopment happens on `main`, the 2.x line. `v1` is the maintenance branch for\n1.x; target it only for fixes that must ship to 1.x. See\n[Branches](CONTRIBUTING.md#branches).\n\n## Setup & core commands\n\nThis repo is multi-module: the root module `google.golang.org/adk/v2` plus\n`plugin/agentanalytics`. Set up a Go workspace first — `go.work` is local-only\nand gitignored, and `go work init` fails if one already exists:\n\n```bash\ntest -f go.work || go work init\ngo work use -r .\n```\n\nThen run from the repo root. The `work` pattern spans every module in the\nworkspace, while `./...` matches only the module you are standing in:\n\n- Build:       `go build -mod=readonly work`\n- Test:        `go test -race -mod=readonly -count=1 -shuffle=on work`\n- Single pkg:  `go test -race ./agent/...`\n- Lint:        `golangci-lint run`   (per module; v2, CI pins v2.3.1; config in `.golangci.yml`)\n- Tidy check:  `go mod tidy -diff`   (per module; must print nothing)\n- Format:      `golangci-lint fmt`   (per module; applies gofumpt + goimports per config)\n\nWithout a `go.work`, `work` silently falls back to the root module alone and\nstill exits 0, so confirm the workspace exists before trusting a green run.\n`golangci-lint` and `go mod tidy` are per-module either way: run them inside each\nsubmodule too (for example, `cd plugin/agentanalytics`). CI does the same,\nrunning build, test, tidy, and lint once per module, with `-v` on build and test.\n\n## Definition of done\n\nA change is complete only when all of these pass locally:\n\n1. `go build` (above) succeeds.\n2. `go test` (above) is green.\n3. `golangci-lint run` reports no findings, in every module.\n4. `go mod tidy -diff` prints nothing, in every module.\n5. New/changed behavior has tests; a bug fix has a test that reproduces the bug.\n6. Every new Go file starts with the Apache 2.0 license header (enforced by `goheader`).\n7. The root `go.mod` does not require an in-repo submodule (enforced by the\n   `guardrail` CI job).\n\n## Repository layout\n\n- `agent/`     Agent interface + types (`llmagent`, `remoteagent`, `workflowagent`;\n  `workflowagents/` holds `loopagent`, `parallelagent`, `sequentialagent`)\n- `runner/`    Execution engine that drives the run loop\n- `workflow/`  Node/graph-based workflow engine for multi-agent apps\n- `model/`     LLM abstraction (`gemini`, `apigee`, `openaimodel`)\n- `tool/`      Tool/Toolset interface + built-in tools (incl. `skilltoolset/`, `mcptoolset/`)\n- `session/`   Conversation state + events\n- `memory/`, `artifact/`   Long-term memory and file/data services\n- `auth/`      Credentials and auth providers for outbound requests\n- `agentregistry/`  Client for Google Cloud Agent Registry (A2A agents, MCP servers, models)\n- `plugin/`    Cross-cutting lifecycle hooks; `plugin/agentanalytics` is a separate module\n- `server/`    HTTP servers (`adkrest` is primary; `adka2a`, `agentengine`)\n- `cmd/`       CLI (`adkgo`) and server launchers\n- `telemetry/`, `util/`   Public helper packages\n- `platform/`  Overridable seams for time & UUID generation (deterministic tests)\n- `internal/`  Private packages — NOT public API; `internal/httprr` is vendored\n- `examples/`  Runnable example agents (quickstart, tools, a2a, skills, …)\n- `scripts/`   Repo tooling (ADK Web container build and asset refresh)\n\n## Conventions & idioms\n\n- **Streaming:** agent runs return `iter.Seq2[*session.Event, error]`; consume\n  with `for event, err := range … {}`. Don't collect events into a slice.\n- **Interface-first:** public packages expose interfaces (`Agent`, `Tool`,\n  `Toolset`, `Service`); concrete impls live in sub-packages or `internal/`.\n- **Callbacks over subclassing** (`Before*`/`After*` for Agent/Model/Tool);\n  returning non-nil from a `Before` callback short-circuits execution.\n- **Errors:** wrap with `fmt.Errorf(\"…: %w\", err)`. Use `%v` only when\n  deliberately not exposing the wrapped error's type. Don't convert existing `%w` to `%v`;\n  it might break callers silently. Wrap sentinels first:\n  `fmt.Errorf(\"%w: …: %w\", ErrX, err)`. Tool confirmation uses sentinel errors\n  (e.g. `tool.ErrConfirmationRequired`).\n- Prefer an existing helper over a new one; keep packages small and focused.\n\n## Minimal example\n\n```go\nmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\",\n    &genai.ClientConfig{APIKey: os.Getenv(\"GOOGLE_API_KEY\")})\n// handle err\na, err := llmagent.New(llmagent.Config{\n    Name:        \"assistant\",\n    Model:       model,\n    Instruction: \"You are a helpful assistant.\",\n    Tools:       []tool.Tool{ /* ... */ },\n})\n// handle err\nr, err := runner.New(runner.Config{\n    AppName:           \"my-app\",\n    Agent:             a,\n    SessionService:    session.InMemoryService(),\n    AutoCreateSession: true,\n})\n// handle err\nmsg := genai.NewContentFromText(\"Hello\", genai.RoleUser)\nfor event, err := range r.Run(ctx, userID, sessionID, msg, agent.RunConfig{}) {\n    // handle err; read event.LLMResponse.Content\n}\n```\n\nSee `examples/quickstart` for a full runnable program.\n\n## Extending the framework\n\n- **Add a tool:** wrap a Go function with\n  `functiontool.New[Args, Results](cfg, handler)` (Args/Results are structs), or\n  implement the `tool.Tool` interface for full control.\n- **Add a toolset:** implement `tool.Toolset`; its `Tools(ctx)` may return\n  different tools per invocation.\n- **Add an agent type:** follow the `agent/workflowagents/*` packages; construct\n  agents via `llmagent.New` / `agent.New`, not by implementing `agent.Agent`\n  directly.\n- **Add cross-cutting behavior:** register a `plugin.New(plugin.Config{...})`\n  hook (`Before*`/`After*` for run/agent/model/tool) instead of editing the loop.\n\n## Multi-module development\n\nSee [Multi-Module Development](CONTRIBUTING.md#multi-module-development) in\n`CONTRIBUTING.md` for policy, steps to add a new module, and release tagging.\n\n## Testing\n\n- Tests run **offline by default**: LLM HTTP traffic is replayed from\n  `testdata/*.httprr` via `internal/httprr`. Never add live model or network\n  calls to tests.\n- To (re)record a package's traffic, supply real credentials (e.g.\n  `GOOGLE_API_KEY`) and run `go generate ./<pkg>/...` (it runs\n  `go test -httprecord=…`); commit the updated `testdata/*.httprr`.\n- Prefer table-driven tests; shared helpers live in `internal/testutil`.\n\n## Boundaries\n\n**Always**\n- Run build, tests, lint, and `go mod tidy -diff` before declaring done.\n- Keep PRs small and focused — one concern per PR.\n- Add or update tests for the code you change.\n\n**Ask first**\n- Adding or upgrading a dependency (`go.mod`).\n- Changing a high-fan-in package (`session`, `agent`, `model`, `tool`,\n  `runner`) — prefer additive, backward-compatible changes.\n- Any change to the public API surface, and any breaking change.\n\n**Never**\n- Break the public API — keep changes backward-compatible.\n- Edit vendored code (`internal/httprr`) or commit secrets / API keys.\n- Add tests that make live LLM or network calls.\n\n## PRs & commits\n\nSee `CONTRIBUTING.md` for the full process and CLA. Key points for agents:\nmost PRs (beyond trivial docs/typos) need a linked issue; include a **Testing\nPlan**; attach logs or screenshots for behavior changes (Runner output / ADK Web).\n\n## Alignment with adk-python\n\n[adk-python](https://github.com/google/adk-python) is the source of truth for\nfeature behavior. When porting or validating a feature, check parity with the\nPython implementation.\n\n## Resources\n\n- Docs: https://google.github.io/adk-docs/\n- Examples: `./examples`\n- Other ADK implementations: [Python](https://github.com/google/adk-python),\n  [Java](https://github.com/google/adk-java),\n  [Kotlin](https://github.com/google/adk-kotlin),\n  [TypeScript](https://github.com/google/adk-js)\n","CLAUDE.md":"See [AGENTS.md](./AGENTS.md) for project context, commands, and contribution guidelines for AI coding agents.\n","GEMINI.md":"See [AGENTS.md](./AGENTS.md) for project context, commands, and contribution guidelines for AI coding agents.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nContext for AI coding agents (Claude Code, Gemini CLI, Cursor, Copilot, etc.)\nworking in the ADK Go repository. Human contributors should start with\nCONTRIBUTING.md.\n\n## Project overview\n\nADK Go (`google.golang.org/adk/v2`) is an open-source, code-first Go toolkit for\nbuilding, evaluating, and deploying AI agents. It is model-agnostic but\noptimized for Gemini, and is one of several ADK implementations — Go, Python,\nJava, Kotlin, and TypeScript — that share a conceptual model but are independent\ncodebases. Requires the Go version declared in `go.mod` (currently 1.26.5).\n\nDevelopment happens on `main`, the 2.x line. `v1` is the maintenance branch for\n1.x; target it only for fixes that must ship to 1.x. See\n[Branches](CONTRIBUTING.md#branches).\n\n## Setup & core commands\n\nThis repo is multi-module: the root module `google.golang.org/adk/v2` plus\n`plugin/agentanalytics`. Set up a Go workspace first — `go.work` is local-only\nand gitignored, and `go work init` fails if one already exists:\n\n```bash\ntest -f go.work || go work init\ngo work use -r .\n```\n\nThen run from the repo root. The `work` pattern spans every module in the\nworkspace, while `./...` matches only the module you are standing in:\n\n- Build:       `go build -mod=readonly work`\n- Test:        `go test -race -mod=readonly -count=1 -shuffle=on work`\n- Single pkg:  `go test -race ./agent/...`\n- Lint:        `golangci-lint run`   (per module; v2, CI pins v2.3.1; config in `.golangci.yml`)\n- Tidy check:  `go mod tidy -diff`   (per module; must print nothing)\n- Format:      `golangci-lint fmt`   (per module; applies gofumpt + goimports per config)\n\nWithout a `go.work`, `work` silently falls back to the root module alone and\nstill exits 0, so confirm the workspace exists before trusting a green run.\n`golangci-lint` and `go mod tidy` are per-module either way: run them inside each\nsubmodule too (for example, `cd plugin/agentanalytics`). CI does the same,\nrunning build, test, tidy, and lint once per module, with `-v` on build and test.\n\n## Definition of done\n\nA change is complete only when all of these pass locally:\n\n1. `go build` (above) succeeds.\n2. `go test` (above) is green.\n3. `golangci-lint run` reports no findings, in every module.\n4. `go mod tidy -diff` prints nothing, in every module.\n5. New/changed behavior has tests; a bug fix has a test that reproduces the bug.\n6. Every new Go file starts with the Apache 2.0 license header (enforced by `goheader`).\n7. The root `go.mod` does not require an in-repo submodule (enforced by the\n   `guardrail` CI job).\n\n## Repository layout\n\n- `agent/`     Agent interface + types (`llmagent`, `remoteagent`, `workflowagent`;\n  `workflowagents/` holds `loopagent`, `parallelagent`, `sequentialagent`)\n- `runner/`    Execution engine that drives the run loop\n- `workflow/`  Node/graph-based workflow engine for multi-agent apps\n- `model/`     LLM abstraction (`gemini`, `apigee`, `openaimodel`)\n- `tool/`      Tool/Toolset interface + built-in tools (incl. `skilltoolset/`, `mcptoolset/`)\n- `session/`   Conversation state + events\n- `memory/`, `artifact/`   Long-term memory and file/data services\n- `auth/`      Credentials and auth providers for outbound requests\n- `agentregistry/`  Client for Google Cloud Agent Registry (A2A agents, MCP servers, models)\n- `plugin/`    Cross-cutting lifecycle hooks; `plugin/agentanalytics` is a separate module\n- `server/`    HTTP servers (`adkrest` is primary; `adka2a`, `agentengine`)\n- `cmd/`       CLI (`adkgo`) and server launchers\n- `telemetry/`, `util/`   Public helper packages\n- `platform/`  Overridable seams for time & UUID generation (deterministic tests)\n- `internal/`  Private packages — NOT public API; `internal/httprr` is vendored\n- `examples/`  Runnable example agents (quickstart, tools, a2a, skills, …)\n- `scripts/`   Repo tooling (ADK Web container build and asset refresh)\n\n## Conventions & idioms\n\n- **Streaming:** agent runs return `iter.Seq2[*session.Event, error]`; consume\n  with `for event, err := range … {}`. Don't collect events into a slice.\n- **Interface-first:** public packages expose interfaces (`Agent`, `Tool`,\n  `Toolset`, `Service`); concrete impls live in sub-packages or `internal/`.\n- **Callbacks over subclassing** (`Before*`/`After*` for Agent/Model/Tool);\n  returning non-nil from a `Before` callback short-circuits execution.\n- **Errors:** wrap with `fmt.Errorf(\"…: %w\", err)`. Use `%v` only when\n  deliberately not exposing the wrapped error's type. Don't convert existing `%w` to `%v`;\n  it might break callers silently. Wrap sentinels first:\n  `fmt.Errorf(\"%w: …: %w\", ErrX, err)`. Tool confirmation uses sentinel errors\n  (e.g. `tool.ErrConfirmationRequired`).\n- Prefer an existing helper over a new one; keep packages small and focused.\n\n## Minimal example\n\n```go\nmodel, err := gemini.NewModel(ctx, \"gemini-2.5-flash\",\n    &genai.ClientConfig{APIKey: os.Getenv(\"GOOGLE_API_KEY\")})\n// handle err\na, err := llmagent.New(llmagent.Config{\n    Name:        \"assistant\",\n    Model:       model,\n    Instruction: \"You are a helpful assistant.\",\n    Tools:       []tool.Tool{ /* ... */ },\n})\n// handle err\nr, err := runner.New(runner.Config{\n    AppName:           \"my-app\",\n    Agent:             a,\n    SessionService:    session.InMemoryService(),\n    AutoCreateSession: true,\n})\n// handle err\nmsg := genai.NewContentFromText(\"Hello\", genai.RoleUser)\nfor event, err := range r.Run(ctx, userID, sessionID, msg, agent.RunConfig{}) {\n    // handle err; read event.LLMResponse.Content\n}\n```\n\nSee `examples/quickstart` for a full runnable program.\n\n## Extending the framework\n\n- **Add a tool:** wrap a Go function with\n  `functiontool.New[Args, Results](cfg, handler)` (Args/Results are structs), or\n  implement the `tool.Tool` interface for full control.\n- **Add a toolset:** implement `tool.Toolset`; its `Tools(ctx)` may return\n  different tools per invocation.\n- **Add an agent type:** follow the `agent/workflowagents/*` packages; construct\n  agents via `llmagent.New` / `agent.New`, not by implementing `agent.Agent`\n  directly.\n- **Add cross-cutting behavior:** register a `plugin.New(plugin.Config{...})`\n  hook (`Before*`/`After*` for run/agent/model/tool) instead of editing the loop.\n\n## Multi-module development\n\nSee [Multi-Module Development](CONTRIBUTING.md#multi-module-development) in\n`CONTRIBUTING.md` for policy, steps to add a new module, and release tagging.\n\n## Testing\n\n- Tests run **offline by default**: LLM HTTP traffic is replayed from\n  `testdata/*.httprr` via `internal/httprr`. Never add live model or network\n  calls to tests.\n- To (re)record a package's traffic, supply real credentials (e.g.\n  `GOOGLE_API_KEY`) and run `go generate ./<pkg>/...` (it runs\n  `go test -httprecord=…`); commit the updated `testdata/*.httprr`.\n- Prefer table-driven tests; shared helpers live in `internal/testutil`.\n\n## Boundaries\n\n**Always**\n- Run build, tests, lint, and `go mod tidy -diff` before declaring done.\n- Keep PRs small and focused — one concern per PR.\n- Add or update tests for the code you change.\n\n**Ask first**\n- Adding or upgrading a dependency (`go.mod`).\n- Changing a high-fan-in package (`session`, `agent`, `model`, `tool`,\n  `runner`) — prefer additive, backward-compatible changes.\n- Any change to the public API surface, and any breaking change.\n\n**Never**\n- Break the public API — keep changes backward-compatible.\n- Edit vendored code (`internal/httprr`) or commit secrets / API keys.\n- Add tests that make live LLM or network calls.\n\n## PRs & commits\n\nSee `CONTRIBUTING.md` for the full process and CLA. Key points for agents:\nmost PRs (beyond trivial docs/typos) need a linked issue; include a **Testing\nPlan**; attach logs or screenshots for behavior changes (Runner output / ADK Web).\n\n## Alignment with adk-python\n\n[adk-python](https://github.com/google/adk-python) is the source of truth for\nfeature behavior. When porting or validating a feature, check parity with the\nPython implementation.\n\n## Resources\n\n- Docs: https://google.github.io/adk-docs/\n- Examples: `./examples`\n- Other ADK implementations: [Python](https://github.com/google/adk-python),\n  [Java](https://github.com/google/adk-java),\n  [Kotlin](https://github.com/google/adk-kotlin),\n  [TypeScript](https://github.com/google/adk-js)\n","category":"root","tokens":2067},{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"See [AGENTS.md](./AGENTS.md) for project context, commands, and contribution guidelines for AI coding agents.\n","category":"root","tokens":28},{"name":"GEMINI.md","path":"GEMINI.md","title":"GEMINI.md","content":"See [AGENTS.md](./AGENTS.md) for project context, commands, and contribution guidelines for AI coding agents.\n","category":"root","tokens":28}]}