Skip to content

refactor(coderd/x/chatd/chatloop): resolve tool name aliases in one toolBatch method - #30939

Draft
ibetitsmike wants to merge 3 commits into
mike/chatloop-tool-batchfrom
mike/chatloop-tool-batch-aliases
Draft

ibetitsmike wants to merge 3 commits into
mike/chatloop-tool-batchfrom
mike/chatloop-tool-batch-aliases

Conversation

@ibetitsmike

@ibetitsmike ibetitsmike commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Adds (*toolBatch).resolve for the ToolNameAliases lookup that runOne, notifyStepToolCallObservers, notifyStepToolResultObservers, and isSerialToolCall each repeated. The last three become toolBatch methods instead of taking the tool map and the alias map. Where they looked up a tool and then type-asserted it, they now assert on the map value: a missing name gives a nil interface, so the assertion fails as the missing-key check did.

It also fixes a latent bug: runOne looked up result provider metadata by the name the model sent, while its other lookups use the resolved name, so a runner called by an alias lost its metadata. This cannot happen in production today: the only alias is close_agent to interrupt_agent (subagent.go:45), and only computer_use.go:112 sets ResultProviderMetadata.

Why it is safe

Each mutant below puts the raw name back at one call site, and each fails a test:

Call site Failing test
runOne tool lookup TestExecuteSingleTool_ResolvesToolNameAlias and 5 more
runOne metadata lookup TestExecuteLocalTools_ProviderToolRunner
notifyStepToolCallObservers TestExecuteToolsNotifiesStepToolCallObservers
notifyStepToolResultObservers (either loop) TestExecuteToolsNotifiesStepToolResultObservers
isSerialToolCall TestExecuteToolsSerialToolCallOrder

No test called a serial tool or a provider runner by an alias, so this PR adds one aliased call to TestExecuteToolsSerialToolCallOrder and one to TestExecuteLocalTools_ProviderToolRunner. With the chatloop.go of #30938, the first test still passes, and the second fails because the aliased result has no metadata.

Validation

Stack

This stack replaces the 20-parameter executeTools and the 15-parameter executeSingleTool in chatloop with methods on one toolBatch type, and resolves tool name aliases in one place. Production behavior does not change.

  1. test(coderd/x/chatd/chatloop): cover provider tool runners in ExecuteLocalTools #30937 Cover provider tool runners in ExecuteLocalTools
  2. refactor(coderd/x/chatd): replace executeTools and executeSingleTool with toolBatch #30938 Replace executeTools and executeSingleTool with toolBatch
  3. refactor(coderd/x/chatd/chatloop): resolve tool name aliases in one toolBatch method #30939 Resolve tool name aliases in one toolBatch method

Xum, an AI agent, opened this PR for @ibetitsmike and wrote this description.

…oolBatch method

runOne, notifyStepToolCallObservers, notifyStepToolResultObservers, and
isSerialToolCall each repeated the ToolNameAliases lookup. They now call
(*toolBatch).resolve, and the observers and isSerialToolCall become
toolBatch methods instead of taking the tool map and alias map.

runOne also looks up result provider metadata by the resolved name, like
its other lookups. No production alias maps to a provider tool with
result metadata, so this changes nothing in production.

TestExecuteToolsSerialToolCallOrder calls one serial tool by an alias,
so dropping the alias lookup from isSerialToolCall now fails a test.
@ibetitsmike

ibetitsmike commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator Author

@codex review

Xum, an AI agent, posted this comment for @ibetitsmike.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-18T17:20:41.506226Z 00b4af0 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Swish!

Reviewed commit: 76b4c2b115

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

TestExecuteLocalTools_ProviderToolRunner now also calls the runner by an
alias and checks that the result keeps the runner's provider metadata.
This pins the resolved-name metadata lookup in runOne: with the raw name
from the model, a runner called by an alias loses its metadata, and the
test fails on the layer below.
@ibetitsmike

Copy link
Copy Markdown
Collaborator Author

@codex review

Xum, an AI agent, posted this comment for @ibetitsmike.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Delightful!

Reviewed commit: 00b4af02a4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant