Skip to content

Handle multiple post/preToolUse hooks more correctly#293517

Merged
roblourens merged 2 commits intomainfrom
roblou/commercial-turtle
Feb 6, 2026
Merged

Handle multiple post/preToolUse hooks more correctly#293517
roblourens merged 2 commits intomainfrom
roblou/commercial-turtle

Conversation

@roblourens
Copy link
Member

Enhance the handling of multiple post and preToolUse hooks by allowing the aggregation of additional context from all hooks. Improve tests to ensure the new functionality works as intended.

Copilot AI review requested due to automatic review settings February 6, 2026 19:45
@roblourens roblourens enabled auto-merge (squash) February 6, 2026 19:45
@vs-code-engineering vs-code-engineering bot added this to the February 2026 milestone Feb 6, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates chat tool hook execution to properly “collapse” results from multiple preToolUse/postToolUse hooks by aggregating additionalContext from all hooks and returning it to callers as an array, with corresponding test updates.

Changes:

  • Change IPreToolUseHookResult.additionalContext / IPostToolUseHookResult.additionalContext from string to string[] to represent aggregated context from multiple hooks.
  • Update HooksExecutionService to collect additionalContext across all hook results and to collapse preToolUse decisions by “most restrictive wins”.
  • Update LanguageModelToolsService and tests to consume/validate the aggregated additionalContext array, and replace timer-based test waits with flushToolUpdates() where applicable.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/vs/workbench/contrib/chat/common/hooks/hooksExecutionService.ts Collapses multiple hook outputs; aggregates additionalContext and selects winning decisions.
src/vs/workbench/contrib/chat/common/hooks/hooksTypes.ts Changes hook result types to expose aggregated additionalContext as string[].
src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.ts Appends each aggregated post-hook context entry into the tool result output.
src/vs/workbench/contrib/chat/test/common/hooksExecutionService.test.ts Updates expectations for additionalContext arrays; adds smoke tests for input→output behavior.
src/vs/workbench/contrib/chat/test/browser/tools/languageModelToolsService.test.ts Updates tests for array additionalContext and replaces timer waits with scheduler flushing.

@roblourens roblourens merged commit 94df4cd into main Feb 6, 2026
23 of 24 checks passed
@roblourens roblourens deleted the roblou/commercial-turtle branch February 6, 2026 20:14
daviddossett pushed a commit to daviddossett/vscode that referenced this pull request Feb 7, 2026
* Improve tests

* Handle multiple post/preToolUse hooks more correctly
pwang347 pushed a commit that referenced this pull request Feb 10, 2026
* Improve tests

* Handle multiple post/preToolUse hooks more correctly
sbatten pushed a commit that referenced this pull request Feb 11, 2026
* Add initial hooks support (#292699)

* Restructure hook execution to always go through the renderer process (#292763)

* Restructure hook execution to always go through the renderer process
Add output channel

* cleanup

* Fixes

* Hooks format cleanup (#292928)

* Add diagnostics for hooks (#292912)

* preToolUse hook supporting "deny" (#292890)

* preToolUse hook supporting "deny"

* Fix tests

* Simplify tests

* Fix test

* Add common output hook types and reorganize related code (#292961)

* Add common output hook types, reorganize a bit more

* test fixes

* Fix extHostHooks for web (#292968)

* Rename and clarify internal vs external chat hook types (#292979)

* Make explicit chat hook "internal" vs "external" types

* Renames

* Avoid types re-export

* Move to hooks/

* This

* Updates for chat extension hooks (#292991)

* Enhance preToolUse hook and clean up code (#293265)

* Flesh out preToolUse hook

* Cleanup

* cleanups

* Cleanup

* String update (#293298)

* PostToolUse hook (#293282)

* Add onDidExecuteHook event to HooksExecutionService (#293279)

* Add onDidExecuteHook event to HooksExecutionService

* Fix MockHooksExecutionService to include onDidExecuteHook event

* Extend Disposable instead of using DisposableStore

* Fire onDidExecuteHook event even when no hooks are registered

* Fixes

* Handle multiple post/preToolUse hooks more correctly (#293517)

* Improve tests

* Handle multiple post/preToolUse hooks more correctly

* Support OS-specific commands for hooks (#293530)

* hook streaming first pass (#293514)

* hooks streaming first pass

* Update src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatHookContentPart.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* update styling

* modify api shape

* address some comments + do not render for now

* new icons + no more continue

* make sure we render right, some comments addressed

* uncomment that stuffs

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Support transcript_path on hooks (#293567)

* updatedInput for PreToolUse (#293575)

* Support PreCompact hook (#293581)

* Support PreCompact hook

* add this

* Handle remote OS for hook detection (#293596)

* Add common blocking behaviour for hooks (#293543)

* Add /hooks slash command (#293583)

* Add /hooks slash command

* await

* Build fix

* Update configure hooks flow and supported paths (#293643)

* update

* updates

* Update src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* update handling

* PR

* test

* fix test

* cleanup

* nit

* cleanup

* clean

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Don't fail hooks when missing token (#293811)

* Make chatHooks proposal self contained

* Add support for continue, stopReason and systemMessage for tool hooks (#294016)

* Add back button to configure hooks menu (#294043)

* Move PreToolUse to extension (#294042)

* Move PreToolUse to extension

* Migrate PostToolUse

* Update handling of claude hooks config (#294187)

* Add more configuration slash commands (#294231)

* Move hook execution to extension (#294215)

* Refactor hook execution

* Fix compilation: add IExtHostHooks import, remove unused IHookResult, inline ChatRequestHooks type

* Move hooks property to chatHooks proposal, sync DTS

* cleanup

* Remove dead hook execution code: proxy, RPC, output channel, progress events

All hook execution now happens in the extension via NodeHookExecutor.
HooksExecutionService is now a pure registry (registerHooks/getHooksForSession).

Removed:
- executeHook, setProxy, onDidHookProgress from service
- IHooksExecutionProxy, IHookProgressEvent, HookAbortError, formatHookErrorMessage
- hooksCommandTypes.ts, hooksTypes.ts (dead type files)
- mainThreadHooks proxy setup
- extHostHooksNode., extHostHooksWorker.
- ExtHostHooksShape. protocol
- IExtHostHooks DI registrations
- ChatHooksProgressContribution
- All associated test files

* Remove HooksExecutionService entirely

The service was only a registry for session hooks, but hooks are already
passed directly on the chat request DTO. The registerHooks/getHooksForSession
pattern was redundant.

* Restore modelName support in chatSubagentContentPart that was accidentally removed during merge

* Revert unrelated tabIndex change on chatSubagentContentPart

* Remove empty hooks ext host infrastructure

Delete IExtHostHooks, NodeExtHostHooks, WorkerExtHostHooks,
MainThreadHooks, ExtHostHooksShape, MainThreadHooksShape -
all were empty stubs after hook execution moved to extension.

* Remove mainThreadHooks import from extensionHost.contribution

* Fix DTS comments: env and timeoutSec are values, not implementation promises

* Update hook timeout format (#294266)

* Add support for disabling all hooks and use JSONC (#294234)

* fix for moving hooks to extension (#294441)

* fix for moving hooks to extension

* fix hygiene

* address comments

---------

Co-authored-by: Rob Lourens <roblourens@gmail.com>
Co-authored-by: Justin Chen <54879025+justschen@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Matt Bierner <12821956+mjbvz@users.noreply.github.com>
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.

2 participants