mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
## Summary - reuse workspace agent context within a single `runChat()` turn - remove duplicate latest-build agent lookups between `resolveInstructions()` and `getWorkspaceConn()` - avoid the extra `GetWorkspaceAgentByID` fetch when the selected `WorkspaceAgent` already has the needed metadata - add focused internal tests for reuse and refresh-on-dial-failure ## Why This came out of a 5000-chat / 10-turn scaletest on bravo against a single workspace. The run completed successfully, but coderd stayed DB-pool bound, and one workspace-backed hot path stood out: - `GetWorkspaceAgentsInLatestBuildByWorkspaceID ≈ 46.7k` - `GetWorkspaceByID ≈ 48.0k` - `GetWorkspaceAgentByID ≈ 2.2k` Within one `runChat()` turn, chatd was rediscovering the same workspace agent multiple times just to resolve instructions and open the workspace connection. ## What this changes This PR introduces a **turn-local** workspace context helper so a single acquired turn can: - resolve the selected workspace agent once - reuse that agent for instruction resolution - reuse the same `AgentConn` for workspace tools and reload/compaction This stays turn-local only, so a later turn on another replica still rebuilds fresh context from the DB. ## Expected impact This is an incremental improvement, not a full fix. It should reduce duplicated workspace-agent lookups and shave some DB pressure from a hot path for workspace-backed chats, while preserving multi-replica correctness. ## Testing - `go test ./coderd/chatd/...` - `golangci-lint run ./coderd/chatd/...`