Skip to content

refactor: unify call type and ensure typesafety - #2659

Merged
Lightning00Blade merged 1 commit into
mainfrom
pre-fix-types
Sep 18, 2026
Merged

Lightning00Blade merged 1 commit into
mainfrom
pre-fix-types

Conversation

@Lightning00Blade

@Lightning00Blade Lightning00Blade commented Sep 4, 2026 •

Copy link
Copy Markdown
Collaborator

Prefactoring for the SDK v2.

@Lightning00Blade
Lightning00Blade force-pushed the pre-fix-types branch 4 times, most recently from 1401270 to 80dc15b Compare September 17, 2026 12:44
@Lightning00Blade
Lightning00Blade marked this pull request as ready for review September 17, 2026 12:44
Comment thread src/tools/ToolDefinition.ts Outdated
Comment thread src/tools/performance.ts Outdated
@Lightning00Blade
Lightning00Blade added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 882f93e Sep 18, 2026
31 of 33 checks passed
@Lightning00Blade
Lightning00Blade deleted the pre-fix-types branch September 18, 2026 12:26
pull Bot pushed a commit to oogalieboogalie/chrome-devtools-mcp that referenced this pull request Sep 23, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.10.0](ChromeDevTools/chrome-devtools-mcp@chrome-devtools-mcp-v1.9.0...chrome-devtools-mcp-v1.10.0)
(2026-09-23)


### 🎉 Features

* add css formatter class
([ChromeDevTools#2707](ChromeDevTools#2707))
([f0b5fa4](ChromeDevTools@f0b5fa4))
* add get_css_style tool
([ChromeDevTools#2612](ChromeDevTools#2612))
([4454ae0](ChromeDevTools@4454ae0))
* **performance:** chunked trace buffer parser for large recordings
([ChromeDevTools#2721](ChromeDevTools#2721))
([23b9a48](ChromeDevTools@23b9a48))
* set default pageSize and pageIdx for get_css_styles tool
([ChromeDevTools#2799](ChromeDevTools#2799))
([dc9d14d](ChromeDevTools@dc9d14d))
* support config file
([ChromeDevTools#2661](ChromeDevTools#2661))
([314a5fa](ChromeDevTools@314a5fa))
* **telemetry:** persist date of the last tool call.
([ChromeDevTools#2705](ChromeDevTools#2705))
([c54a493](ChromeDevTools@c54a493))
* **telemetry:** recording a sanitized version of the client name
([ChromeDevTools#2757](ChromeDevTools#2757))
([55fbc57](ChromeDevTools@55fbc57))
* **telemetry:** report hermes client usage.
([ChromeDevTools#2703](ChromeDevTools#2703))
([fb47e6c](ChromeDevTools@fb47e6c))
* update css formatter class to add AtRule, PositionTryRule,
PropertyRule, FunctionRule
([ChromeDevTools#2717](ChromeDevTools#2717))
([d4a0620](ChromeDevTools@d4a0620))
* update css formatter class to add inherited rules
([ChromeDevTools#2715](ChromeDevTools#2715))
([3d7e7bb](ChromeDevTools@3d7e7bb))
* update css formatter class to add matched rules
([ChromeDevTools#2713](ChromeDevTools#2713))
([8c8616f](ChromeDevTools@8c8616f))
* update css formatter class to add pseudo element
([ChromeDevTools#2716](ChromeDevTools#2716))
([df1469a](ChromeDevTools@df1469a))
* update css formatter to add keyframes rules
([ChromeDevTools#2718](ChromeDevTools#2718))
([cdc365c](ChromeDevTools@cdc365c))


### 🛠️ Fixes

* bound ConsoleCollector retention per navigation
([ChromeDevTools#2773](ChromeDevTools#2773))
([e98a3ca](ChromeDevTools@e98a3ca))
* **cli:** forward explicit false options on start
([ChromeDevTools#2702](ChromeDevTools#2702))
([d9a8cb6](ChromeDevTools@d9a8cb6))
* **config:** preserve raw values for config coercion
([ChromeDevTools#2747](ChromeDevTools#2747))
([906c83b](ChromeDevTools@906c83b))
* don't log Puppeteer logs to file unless requested
([ChromeDevTools#2743](ChromeDevTools#2743))
([4fbfbc4](ChromeDevTools@4fbfbc4))
* explain launch failures caused by running as root
([ChromeDevTools#2634](ChromeDevTools#2634))
([9d29223](ChromeDevTools@9d29223))
* handle JavaScript dialogs opened during input tool actions
([ChromeDevTools#2794](ChromeDevTools#2794))
([266112b](ChromeDevTools@266112b))
* **performance:** prevent memory leak by scoping trace engine model per
parse
([ChromeDevTools#2720](ChromeDevTools#2720))
([d05cbc0](ChromeDevTools@d05cbc0))
* preserve console history across same-document navigations
([ChromeDevTools#2676](ChromeDevTools#2676))
([aa25562](ChromeDevTools@aa25562))
* preserve underlying error message in input tool actions
([ChromeDevTools#2792](ChromeDevTools#2792))
([6e47dbb](ChromeDevTools@6e47dbb))
* set emulatedUserAgent and use finalDisplayedUrl in lighthouse_audit
([ChromeDevTools#2795](ChromeDevTools#2795))
([941f82a](ChromeDevTools@941f82a))
* timout in WaitForHelper.ts
([ChromeDevTools#2772](ChromeDevTools#2772))
([dc1d055](ChromeDevTools@dc1d055))


### 📄 Documentation

* add FLUJO client configuration
([ChromeDevTools#2690](ChromeDevTools#2690))
([65a679e](ChromeDevTools@65a679e))
* fix categories not being configured correclty
([ChromeDevTools#2807](ChromeDevTools#2807))
([2250cdc](ChromeDevTools@2250cdc))
* fix defaults for non-boolean values
([ChromeDevTools#2744](ChromeDevTools#2744))
([342d243](ChromeDevTools@342d243))
* update page routing option name
([ChromeDevTools#2748](ChromeDevTools#2748))
([8939965](ChromeDevTools@8939965))
* update SKILL for chrome-devtools to use get_css_styles tool
([ChromeDevTools#2760](ChromeDevTools#2760))
([421011e](ChromeDevTools@421011e))


### 🏗️ Refactor

* disable tools instead of not registering them
([ChromeDevTools#2636](ChromeDevTools#2636))
([b455469](ChromeDevTools@b455469))
* extract browser in a BrowserManager class
([ChromeDevTools#2787](ChromeDevTools#2787))
([3228f44](ChromeDevTools@3228f44))
* migrate the MCP SDK to v2
([ChromeDevTools#2408](ChromeDevTools#2408))
([da3c406](ChromeDevTools@da3c406))
* move comments formatting to CommentFormatter class
([ChromeDevTools#2719](ChromeDevTools#2719))
([e3cded0](ChromeDevTools@e3cded0))
* prepare for SDK v2
([ChromeDevTools#2771](ChromeDevTools#2771))
([61780c7](ChromeDevTools@61780c7))
* simplify our gen scritps
([ChromeDevTools#2793](ChromeDevTools#2793))
([5068584](ChromeDevTools@5068584))
* unify call type and ensure typesafety
([ChromeDevTools#2659](ChromeDevTools#2659))
([882f93e](ChromeDevTools@882f93e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
bitbay added a commit to bitbay/chrome-devtools-mcp that referenced this pull request Sep 23, 2026
…connection

Re-implemented as a fresh diff against upstream's current ToolHandler.ts
(post-ChromeDevTools#2659/ChromeDevTools#2787, which predates this branch's whole timeout-wrapping
fix), not a literal merge of this branch's prior diff — unrelated
upstream divergences (.strict() input schema, `disabled` field, `handle`
as a class-field arrow function using `using _guard = ...`) are left
as-is.

Replaces the ToolHandler.ts portion of this branch's 6d2d4e9, and
f67b230 in full:

- TOOL_CALL_TIMEOUT_MS, ToolCallTimeoutError, and #raceWithTimeout<T>()
  ported verbatim. Puppeteer gives no way to cancel a pending call, so a
  timeout only stops the handler from waiting — the underlying attempt
  keeps running abandoned, which is exactly why the onTimeout callbacks
  below exist.
- getContext() is wrapped in #raceWithTimeout, calling the injected
  abandonPendingBrowserAttemptOnTimeout on timeout (see the BrowserManager
  commit) so a resolution nobody is waiting for anymore doesn't get
  silently installed for a later caller.
- The tool.handler() + response.handle() sequence is wrapped in a single
  shared budget (matching f67b230's reasoning: several tools' actual CDP
  calls happen inside response.handle(), not tool.handler(), so both need
  covering by one timeout or the second phase hangs unprotected after the
  first one's already accounted for). On timeout, forgetBrowserOnTimeout
  is called with the resolved context's browser.

- src/index.ts: threads BrowserManager's forget()/abandonPendingAttempt()
  down as bound closures into ToolHandler's two new required constructor
  params (`forgetBrowserOnTimeout`, `abandonPendingBrowserAttemptOnTimeout`)
  instead of the old free-function defaults browser.ts used to provide,
  since BrowserManager is now private instance state owned by McpServer
  rather than importable module state. #getContext() itself needs no
  change — it already calls this.#browserManager.ensureBrowser().

This branch's 3d9dd88 (AGENTS.md style fixes: no `!`, no hand-rolled
mocks, sinon.assert over Node's assert) has nothing to port forward —
this diff was written directly against those rules and upstream's
current tests/mocks.ts conventions, so there was nothing to retrofit.

Tests: ~23 existing `new ToolHandler(...)` call sites updated for the
two new required constructor params (no-op sinon.spy() stand-ins where
the test doesn't care about them). Three new regression tests ported
from this branch's prior versions: a hung tool.handler() times out and
forgets the browser; a hung response.handle() times out even when
tool.handler() resolves fast; a hung getContext() times out and abandons
the pending attempt without touching forgetBrowserOnTimeout (no resolved
browser exists to forget in that case).
bitbay added a commit to bitbay/chrome-devtools-mcp that referenced this pull request Sep 28, 2026
…connection

Re-implemented as a fresh diff against upstream's current ToolHandler.ts
(post-ChromeDevTools#2659/ChromeDevTools#2787, which predates this branch's whole timeout-wrapping
fix), not a literal merge of this branch's prior diff — unrelated
upstream divergences (.strict() input schema, `disabled` field, `handle`
as a class-field arrow function using `using _guard = ...`) are left
as-is.

Replaces the ToolHandler.ts portion of this branch's 6d2d4e9, and
f67b230 in full:

- TOOL_CALL_TIMEOUT_MS, ToolCallTimeoutError, and #raceWithTimeout<T>()
  ported verbatim. Puppeteer gives no way to cancel a pending call, so a
  timeout only stops the handler from waiting — the underlying attempt
  keeps running abandoned, which is exactly why the onTimeout callbacks
  below exist.
- getContext() is wrapped in #raceWithTimeout, calling the injected
  abandonPendingBrowserAttemptOnTimeout on timeout (see the BrowserManager
  commit) so a resolution nobody is waiting for anymore doesn't get
  silently installed for a later caller.
- The tool.handler() + response.handle() sequence is wrapped in a single
  shared budget (matching f67b230's reasoning: several tools' actual CDP
  calls happen inside response.handle(), not tool.handler(), so both need
  covering by one timeout or the second phase hangs unprotected after the
  first one's already accounted for). On timeout, forgetBrowserOnTimeout
  is called with the resolved context's browser.

- src/index.ts: threads BrowserManager's forget()/abandonPendingAttempt()
  down as bound closures into ToolHandler's two new required constructor
  params (`forgetBrowserOnTimeout`, `abandonPendingBrowserAttemptOnTimeout`)
  instead of the old free-function defaults browser.ts used to provide,
  since BrowserManager is now private instance state owned by McpServer
  rather than importable module state. #getContext() itself needs no
  change — it already calls this.#browserManager.ensureBrowser().

This branch's 3d9dd88 (AGENTS.md style fixes: no `!`, no hand-rolled
mocks, sinon.assert over Node's assert) has nothing to port forward —
this diff was written directly against those rules and upstream's
current tests/mocks.ts conventions, so there was nothing to retrofit.

Tests: ~23 existing `new ToolHandler(...)` call sites updated for the
two new required constructor params (no-op sinon.spy() stand-ins where
the test doesn't care about them). Three new regression tests ported
from this branch's prior versions: a hung tool.handler() times out and
forgets the browser; a hung response.handle() times out even when
tool.handler() resolves fast; a hung getContext() times out and abandons
the pending attempt without touching forgetBrowserOnTimeout (no resolved
browser exists to forget in that case).
bitbay added a commit to bitbay/chrome-devtools-mcp that referenced this pull request Sep 29, 2026
…connection

Re-implemented as a fresh diff against upstream's current ToolHandler.ts
(post-ChromeDevTools#2659/ChromeDevTools#2787, which predates this branch's whole timeout-wrapping
fix), not a literal merge of this branch's prior diff — unrelated
upstream divergences (.strict() input schema, `disabled` field, `handle`
as a class-field arrow function using `using _guard = ...`) are left
as-is.

Replaces the ToolHandler.ts portion of this branch's 6d2d4e9, and
f67b230 in full:

- TOOL_CALL_TIMEOUT_MS, ToolCallTimeoutError, and #raceWithTimeout<T>()
  ported verbatim. Puppeteer gives no way to cancel a pending call, so a
  timeout only stops the handler from waiting — the underlying attempt
  keeps running abandoned, which is exactly why the onTimeout callbacks
  below exist.
- getContext() is wrapped in #raceWithTimeout, calling the injected
  abandonPendingBrowserAttemptOnTimeout on timeout (see the BrowserManager
  commit) so a resolution nobody is waiting for anymore doesn't get
  silently installed for a later caller.
- The tool.handler() + response.handle() sequence is wrapped in a single
  shared budget (matching f67b230's reasoning: several tools' actual CDP
  calls happen inside response.handle(), not tool.handler(), so both need
  covering by one timeout or the second phase hangs unprotected after the
  first one's already accounted for). On timeout, forgetBrowserOnTimeout
  is called with the resolved context's browser.

- src/index.ts: threads BrowserManager's forget()/abandonPendingAttempt()
  down as bound closures into ToolHandler's two new required constructor
  params (`forgetBrowserOnTimeout`, `abandonPendingBrowserAttemptOnTimeout`)
  instead of the old free-function defaults browser.ts used to provide,
  since BrowserManager is now private instance state owned by McpServer
  rather than importable module state. #getContext() itself needs no
  change — it already calls this.#browserManager.ensureBrowser().

This branch's 3d9dd88 (AGENTS.md style fixes: no `!`, no hand-rolled
mocks, sinon.assert over Node's assert) has nothing to port forward —
this diff was written directly against those rules and upstream's
current tests/mocks.ts conventions, so there was nothing to retrofit.

Tests: ~23 existing `new ToolHandler(...)` call sites updated for the
two new required constructor params (no-op sinon.spy() stand-ins where
the test doesn't care about them). Three new regression tests ported
from this branch's prior versions: a hung tool.handler() times out and
forgets the browser; a hung response.handle() times out even when
tool.handler() resolves fast; a hung getContext() times out and abandons
the pending attempt without touching forgetBrowserOnTimeout (no resolved
browser exists to forget in that case).
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