chrome-devtools-mcp-v1.6.0
1007 次代码提交
| 作者 | SHA1 | 备注 | 提交日期 | |
|---|---|---|---|---|
|
|
f621d0052f |
chore(main): release chrome-devtools-mcp 1.6.0 (#2306)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop* --- ## [1.6.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v1.5.0...chrome-devtools-mcp-v1.6.0) (2026-07-14) ### 🎉 Features * add experimentalGcfFormat flag for GCF-encoded tool responses ([#2235](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/2235)) ([chrome-devtools-mcp-v1.6.0 |
||
|
|
d0025b3908 |
fix: paginate page 0 in list_network_requests and list_console_messages (#2359)
`list_network_requests` and `list_console_messages` treat an explicit
`pageIdx: 0` as "no pagination" and dump every result, while `pageIdx:
1` and up paginate correctly.
The guards in `setIncludeNetworkRequests`/`setIncludeConsoleData` build
the pagination options with `options?.pageSize || options?.pageIdx`, so
a bare `{pageIdx: 0}` collapses to `undefined` — 0 is falsy — and
`paginate()` never runs. That's a bit odd since `paginate()` already
decides for itself when there's nothing to paginate
(`noPaginationOptions` checks `pageSize === undefined && pageIdx ===
undefined`), so page 0 is a perfectly valid first page there. The memory
tools, which pass their options straight through to `paginate()`, handle
`pageIdx: 0` fine — only these two guards get it wrong, so an agent
walking pages 0, 1, 2… gets the full list on page 0 and a 20-item window
from page 1 on.
Switched both guards to an explicit `!== undefined` check so `pageIdx:
0` reaches `paginate()` and gets the default page size like every other
page. Both-omitted still short-circuits to the full list, so nothing
else changes. Added a regression test for the `{pageIdx: 0}` case.
|
||
|
|
c1736a071b |
docs: update memory leak debugging skill (#2330)
## Summary - Update the memory leak debugging skill to prefer the built-in heap snapshot tools. - Add guidance for comparing snapshots, inspecting retainers, and closing loaded snapshots. - Keep memlab and the fallback comparison script as external fallback paths. Issue #2329. ## Validation - `git diff --check origin/main...HEAD` - `npm run check-format` |
||
|
|
9c3542bd74 |
refactor: move and rename files (#2355)
- move utilities to sub-folders where applicable - changes issue-descriptions to issuesDescriptions.ts and moves it to devtools/ |
||
|
|
3e8d92245c |
fix: keep page ids unique across browser reconnects (#2345)
Closes #2339 Reconnecting after a browser restart builds a fresh `McpContext`, which restarted the page id counter at 1 – ids from before the restart silently resolved to unrelated pages of the new browser (repro in #2339). Two changes: - The new context continues the id counter where the previous one left off (`startingPageId` option), so a stale id now fails with the existing "No page found" error and the agent re-lists - The first response after a reconnect carries a one-time note ("the browser was restarted or reconnected since the last call. Page ids have changed..."), like the #2308 fallback note. Since tool errors run through the same response formatting, the note shows up together with the very error the stale id produces Verified against the #2339 repro: the stale `select_page` now returns the note plus "No page found", and the next listing shows the new browser's pages under fresh ids. One thing I noticed but left alone: The replaced context isn't `dispose()`d on reconnect – pre-existing, and everything it holds is tied to the dead browser anyway. Happy to add that here if you'd like. |
||
|
|
4094e8eb27 |
chore(deps-dev): bump @google/genai from 2.10.0 to 2.11.0 in the dev-dependencies group (#2350)
Bumps the dev-dependencies group with 1 update: [@google/genai](https://github.com/googleapis/js-genai). Updates `@google/genai` from 2.10.0 to 2.11.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/js-genai/releases">@google/genai's releases</a>.</em></p> <blockquote> <h2>v2.11.0</h2> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.10.0...v2.11.0">2.11.0</a> (2026-07-09)</h2> <h3>Features</h3> <ul> <li>Add environment_id in network config (<a href="https://github.com/googleapis/js-genai/commit/85fe0a5bef70c507ba8641016eca5f10359cbac1">85fe0a5</a>)</li> <li>Add response_format and Translation_config in GenerationConfig (<a href="https://github.com/googleapis/js-genai/commit/3f3b7bc5179d0252470e7a6e87519ff894464a7e">3f3b7bc</a>)</li> <li>add retrieval result step and new fields to maps and search results (<a href="https://github.com/googleapis/js-genai/commit/ecfdc69cffe071e5841c562cacac0d4574a86303">ecfdc69</a>)</li> <li>Add Tool.exa_ai_search for Gemini Enterprise API (<a href="https://github.com/googleapis/js-genai/commit/3f3b7bc5179d0252470e7a6e87519ff894464a7e">3f3b7bc</a>)</li> <li>support Function declarations during Agent Creation (<a href="https://github.com/googleapis/js-genai/commit/824badf72b009e72696e3ce5bd39d99e6f17888c">824badf</a>)</li> <li>voice consent signature types across all SDK languages. (<a href="https://github.com/googleapis/js-genai/commit/5fb5354de34e8fe394c92ad279bd07e756328005">5fb5354</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>interactions:</strong> accept both dict and list[dict] for transform (<a href="https://github.com/googleapis/js-genai/commit/67d2f683643946e512875065f98bf9b8d628bc61">67d2f68</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li><strong>interactions:</strong> remove cached_content, presence_penalty, and frequency_penalty; expose safety_settings and labels (<a href="https://github.com/googleapis/js-genai/commit/0f414be2babac4e5d94a23a1880b898cfc5919d4">0f414be</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/googleapis/js-genai/blob/main/CHANGELOG.md">@google/genai's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.10.0...v2.11.0">2.11.0</a> (2026-07-09)</h2> <h3>Features</h3> <ul> <li>Add environment_id in network config (<a href="https://github.com/googleapis/js-genai/commit/85fe0a5bef70c507ba8641016eca5f10359cbac1">85fe0a5</a>)</li> <li>Add response_format and Translation_config in GenerationConfig (<a href="https://github.com/googleapis/js-genai/commit/3f3b7bc5179d0252470e7a6e87519ff894464a7e">3f3b7bc</a>)</li> <li>add retrieval result step and new fields to maps and search results (<a href="https://github.com/googleapis/js-genai/commit/ecfdc69cffe071e5841c562cacac0d4574a86303">ecfdc69</a>)</li> <li>Add Tool.exa_ai_search for Gemini Enterprise API (<a href="https://github.com/googleapis/js-genai/commit/3f3b7bc5179d0252470e7a6e87519ff894464a7e">3f3b7bc</a>)</li> <li>support Function declarations during Agent Creation (<a href="https://github.com/googleapis/js-genai/commit/824badf72b009e72696e3ce5bd39d99e6f17888c">824badf</a>)</li> <li>voice consent signature types across all SDK languages. (<a href="https://github.com/googleapis/js-genai/commit/5fb5354de34e8fe394c92ad279bd07e756328005">5fb5354</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>interactions:</strong> accept both dict and list[dict] for transform (<a href="https://github.com/googleapis/js-genai/commit/67d2f683643946e512875065f98bf9b8d628bc61">67d2f68</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li><strong>interactions:</strong> remove cached_content, presence_penalty, and frequency_penalty; expose safety_settings and labels (<a href="https://github.com/googleapis/js-genai/commit/0f414be2babac4e5d94a23a1880b898cfc5919d4">0f414be</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/js-genai/commit/136ea2616b056230d48a07119e1becf3c4b4dea9"><code>136ea26</code></a> chore(main): release 2.11.0 (<a href="https://redirect.github.com/googleapis/js-genai/issues/1743">#1743</a>)</li> <li><a href="https://github.com/googleapis/js-genai/commit/3bf5090a86104ed73bb7d68207a2a3f7481b9c03"><code>3bf5090</code></a> chore: update the release.txt</li> <li><a href="https://github.com/googleapis/js-genai/commit/43c53804bf01d0f4af960c4c55efb2690b901087"><code>43c5380</code></a> chore: release 2.11.0</li> <li><a href="https://github.com/googleapis/js-genai/commit/824badf72b009e72696e3ce5bd39d99e6f17888c"><code>824badf</code></a> feat: support Function declarations during Agent Creation</li> <li><a href="https://github.com/googleapis/js-genai/commit/0f414be2babac4e5d94a23a1880b898cfc5919d4"><code>0f414be</code></a> refactor(interactions)!: remove cached_content, presence_penalty, and frequen...</li> <li><a href="https://github.com/googleapis/js-genai/commit/1127b438548009c571b26f6a30ec1409644f7f21"><code>1127b43</code></a> chore: Add multiple approval check for major releases</li> <li><a href="https://github.com/googleapis/js-genai/commit/67d2f683643946e512875065f98bf9b8d628bc61"><code>67d2f68</code></a> fix(interactions): accept both dict and list[dict] for transform</li> <li><a href="https://github.com/googleapis/js-genai/commit/5fb5354de34e8fe394c92ad279bd07e756328005"><code>5fb5354</code></a> feat: voice consent signature types across all SDK languages.</li> <li><a href="https://github.com/googleapis/js-genai/commit/aad178eda1aaf735ba8a471beb58c81eda0c8eac"><code>aad178e</code></a> chore: Remove default api-revision header</li> <li><a href="https://github.com/googleapis/js-genai/commit/be7ab10138e15046a56a6e0bae4ba8502eeefe44"><code>be7ab10</code></a> chore: sort 'properties' keys in OpenAPI schemas</li> <li>Additional commits viewable in <a href="https://github.com/googleapis/js-genai/compare/v2.10.0...v2.11.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
68cfce2bcb |
refactor: clean up page snapshot generation (#2348)
- remove obsolete devtools page detection step - move isolated context processing out of the browser pages fetching - move filtering of pages out of getPages(). That should just be a getter. |
||
|
|
c53c1ec4c9 | refactor: use response page in formatting (#2349) | ||
|
|
78ccb193e0 |
fix: release held modifiers when press_key key event fails (#2347)
## What
`press_key` currently presses each modifier down, presses the main key,
then releases the modifiers — in three sequential steps with no
`try/finally`:
```ts
for (const modifier of modifiers) {
await page.pptrPage.keyboard.down(modifier);
}
await page.pptrPage.keyboard.press(key); // if this rejects…
for (const modifier of modifiers.toReversed()) {
await page.pptrPage.keyboard.up(modifier); // …this never runs
}
```
If `keyboard.press(key)` rejects — a CDP hiccup, a target crash, or a
dropped connection — the release loop is skipped and the modifier keys
are left **logically held down in the browser**.
`waitForEventsAfterAction` re-throws the action error, so nothing
downstream releases them either.
This is the unpaired-`keyDown` class of defect asked about in #2309
(*"whether any code path sends a keyDown without a guaranteed matching
keyUp on an error/timeout branch"*). This PR fixes the one concrete
instance of it in this repo.
## Fix
Wrap the down/press sequence in `try/finally` and track which modifiers
were actually pressed, releasing each held modifier even when the main
press throws. Only modifiers whose `keyboard.down()` succeeded are
released, so a failure *while* pressing a modifier doesn't emit a
spurious `keyUp`.
## Test
Adds a regression test (real browser, keydown/keyup logging) that
injects a `press()` failure mid-sequence and asserts both modifiers are
still released. It fails on `main` (`['dControl','dShift']` — no keyups)
and passes with the fix (`['dControl','dShift','uShift','uControl']`).
Verified locally: full `tests/tools/input.test.ts` suite passes, `npm
run typecheck`, eslint, and prettier all clean.
## Scope note re: #2309
I want to be precise about what this does and does not address. This
closes a **browser-level** stuck-key path: leaked keys here live in
Chromium's input state (CDP `Input.dispatchKeyEvent` is injected into
the renderer), so the observable effect is a modifier stuck **within the
driven page**. The report in #2309 is a bare `Space` that repeats
**system-wide** and survives physically unplugging the keyboard — that
symptom is at the OS input layer, which CDP-injected input doesn't route
through, so I don't claim this fully explains that case (details and a
non-reboot workaround are in a comment on the issue). Still, an unpaired
keyDown on an error branch is a real defect worth closing on its own,
and it's exactly the code path the issue asked to audit.
Prepared with AI assistance (Claude Code) and verified against a local
build before submission.
|
||
|
|
58ba174273 |
refactor: move remaining McpContext getters (#2342)
Moves various getters to McpPage. |
||
|
|
eb049513d2 |
fix: resolve page ids only among listed pages (#2332)
Follow-up to #2304, and to #2328 which fixed the symptom. After #2333, `getPages()` – what `list_pages` presents – is a filtered view over `#mcpPages` that excludes `devtools://` frontends (unless `experimentalDevToolsDebugging` is set; they enter `#mcpPages` via `handleDevToolsAsPage`). `getPageById()` still searches all of `#mcpPages`, though – so `select_page`, and every other tool that takes a `pageId`, can target a page `list_pages` never showed. #2328 stopped that from silently stealing a still-open selection. This goes to the root: `getPageById()` now resolves through `getPages()`, so an unlisted page isn't targetable in the first place. Page ids only ever reach the client through the listing, so an unlisted id has no legitimate source. `experimentalDevToolsDebugging` is unaffected – the listing already includes devtools frontends there. All five callers (`select_page`, `close_page`, `evaluate_script`, `get_tab_id`, and the generic `pageId` handler) benefit uniformly. Also trims the now-impossible example from the fallback comment – an unlisted `devtools://` page can no longer be selected. Test: with DevTools open, the frontend page is tracked but unlisted; the new test asserts no id outside `getPages()` resolves through `getPageById()`. Refs: #2304 |
||
|
|
c006c9ba5e | refactor: move DevTools universe to McpPage (#2341) | ||
|
|
515f8afb58 |
chore: report exact bundled package versions during release (#2318)
At bundle time, we know exactly which version of the package is installed, we should report exact version instead of a range from package.json. This change parses package-lock.json to obtain this information. This approach aligns better with upstream security analyzers relying on dependency version information. Co-authored-by: Piotr Paulski <piotrpaulski@chromium.org> |
||
|
|
5b33debf1a | refactor: clean up McpContext getters (#2340) | ||
|
|
8a4ddb3256 | refactor: remove isolated context getter (#2336) | ||
|
|
64005f924f |
refactor: use helper for Dialog handle (#2334)
Re-use the logic in the wait for helper to expose per dialog type handling. |
||
|
|
9cd734b0a3 |
refactor: clean up more of the context interface (#2335)
- removed redundant page getters |
||
|
|
16db01f79c |
refactor: clean up page management (#2333)
- remove `#pages` and Puppeteer page getters - rename methods for clarity |
||
|
|
ca8d219ede |
revert: support experimental allowlist for navigate tool calls (#1935) (#2203)
This reverts commit
|
||
|
|
15a6b789da |
feat: Print object count and total sizes in get_heapsnapshot_details (#2325)
This emits object count and total shallow sizes for get_heapsnapshot_details. |
||
|
|
9bc61b43d6 | refactor: make collectors work per page (#2324) | ||
|
|
2812902ba9 |
feat: Support filter with heap snapshots aggregates (#2323)
This exposes DevTools named filters in get_heapsnapshot_details and get_heapsnapshot_class_nodes tools. This allows the client to list e.g. all objects retained through detached DOM objects. Co-authored-by: Dominik Inführ <dinfuehr@chromium.org> |
||
|
|
c065fd90ce |
fix(telemetry): resolve enum values through nested schema wrappers (#2315)
## What
`generateToolMetrics` reads an enum parameter's values by unwrapping
**at most
one** `optional` wrapper:
```ts
if (schema._def.values?.length > 0) {
values = schema._def.values;
} else {
values = schema._def.innerType._def.values; // only one level
}
```
An enum parameter wrapped in `.default().optional()` (or any nested
`optional`/`default`/`nullable` combination) therefore falls through to
`schema._def.innerType._def.values === undefined`, and `npm run
update-metrics`
(run as part of `npm run gen`) crashes:
```
TypeError: Cannot read properties of undefined (reading '0')
at validateEnumHomogeneity (build/src/telemetry/metricsRegistry.js:12)
at generateToolMetrics (build/src/telemetry/metricsRegistry.js:59)
```
## Why it matters
`npm run gen` is required whenever a tool is added or changed (per
`CONTRIBUTING.md`). Declaring an enum parameter with a default — a
natural,
documented zod pattern — silently breaks docs/metrics generation.
## Fix
Add `getEnumValues()` in `transformation.ts` that recursively unwraps
`optional` / `default` / `nullable` / `effects` wrappers, mirroring the
existing
`getZodType()`, and use it in `generateToolMetrics`. Behavior is
unchanged for
the existing bare-enum and single-`optional` cases.
## Tests
- `getEnumValues` unit tests: bare enum, `optional`, `default`, both
orders of
`default`+`optional`, and throws for a non-enum type.
- `generateToolMetrics` regression test with
`zod.enum(...).default(...).optional()`.
- `npm run typecheck`, the telemetry tests, and `npm run check-format`
pass.
---
First-time contributor here — happy to sign the CLA.
|
||
|
|
c645eee875 |
fix: keep a still-open selected page instead of falling back to the first page (#2328)
Follow-up to #2304. `createPagesSnapshot()` reselects `#pages[0]` whenever the selected page is missing from `#pages`, even when that page is still open. So a live selection can be silently swapped, not only a closed one. The case that hit us is a `devtools://` page: - the server connects with `handleDevToolsAsPage: true` (`src/browser.ts`), so DevTools frontends are pages and land in `#mcpPages` - `#pages` filters `devtools://` out (`src/McpContext.ts`, unless `experimentalDevToolsDebugging` is set) - `getPageById()` (used by `select_page`) reads `#mcpPages`, not `#pages`, so a devtools page can be selected even though `list_pages` never lists it - the next snapshot finds it missing from `#pages` and, because the fallback keys on `#pages` membership rather than `isClosed()`, reselects `#pages[0]` with the page still open (`isClosed() === false`) This reproduces on a normal Chrome (details and a repro in #2304). This change gates the fallback on `isClosed()`, as proposed in #2304. A still-open selection is kept; a genuinely closed page still auto-advances, so the browser-like behavior for closed tabs is unchanged. One consequence: the "is no longer listed" wording added in #2308 becomes unreachable, since a live page missing from the list no longer triggers a fallback. I left it in place to keep this diff focused, but I'm happy to simplify it here or in a follow-up. The unit test that covered the missing-but-open case now asserts the selection is retained. Refs: #2304 |
||
|
|
ed7e95d3e0 | fix: Wait until daemon is started (#2327) | ||
|
|
6e56c028cf |
feat: support --allow-unrestricted-paths configuration (#2296)
## Summary validatePath() in McpContext returned immediately, with no restriction at all, whenever roots() returned undefined. roots() only returns undefined when the connecting MCP client never negotiates the optional roots capability during initialize, which any minimal client can trigger simply by omitting it from its declared capabilities. Since roots() already always appends the OS temp directory to whatever explicit roots are configured, this change makes it return that same default (temp directory only) instead of undefined when no roots have been set. This removes the early return in validatePath() entirely, so path validation now runs unconditionally rather than being conditional on whether the connecting client happened to negotiate a capability it was never required to declare per the MCP spec. Any filePath-accepting tool (take_screenshot, saveFile, and the performance/Lighthouse export tools that route through the same check) had its only path-traversal guard silently disabled for the lifetime of a connection whenever the client omitted the optional roots capability. Since this server is designed to let an LLM drive a browser, and browsed page content is not trusted input, this meant a client that simply doesn't implement roots (a plausible, non-adversarial default for lightweight or custom MCP clients) removed the only boundary preventing the connected agent from writing to any path the process can reach. Added a test that exercises the actual default state of roots (never calling setRoots()) directly, since the existing tests always call setRoots(), even with an empty array, before validating. Verified locally with a minimal MCP client that declares no capabilities: before this change, take_screenshot with a filePath outside any root wrote a real file to an arbitrary path with no error; after this change, the same call is rejected with the existing Access denied error. Also verified that a client that does declare roots is unaffected, and that writes to the OS temp directory continue to succeed with no roots negotiated, matching prior behavior for that path. |
||
|
|
ff53b7bb82 |
refactor: Use array instead of Map for idToClassKey (#2321)
Switches idToClassKey to an array since ids are strictly incremented from 1. This also allows us to drop the id generator use. Co-authored-by: Dominik Inführ <dinfuehr@chromium.org> |
||
|
|
a8c7c73ca5 |
chore: add dependabot cooldown option (#2320)
Co-authored-by: Natallia Harshunova <nharshunova@chromium.org> |
||
|
|
2c16ac311b |
fix: report when the selected page was auto-replaced by the fallback (#2308)
Follow-up to #2304 (the "note" part discussed there). When the selected page disappears from the page list, `createPagesSnapshot()` silently re-selects the first page. The agent gets no signal: if its next call is `list_pages` (which is what the closed-page error message recommends), the listing already shows the new selection and every subsequent tool call runs against a page the agent never picked. This PR records the automatic fallback and surfaces it as a one-line note in the pages section of the same response: ``` ## Pages Note: the previously selected page was closed. Page 1 is now selected. 1: about:blank [selected] ``` For a selected page that is missing from the list without being closed, the note reads "is no longer listed" instead. If the expectation from #2304 holds (a page stays listed as long as it is not closed), that wording never renders; if the transient case discussed there does occur in the wild, the note will make it visible. The fallback behavior itself is unchanged (as discussed in #2304, closed tabs keep the browser-like auto-selection). No note is emitted on first connect, when nothing was selected before. Tests: two unit tests for the fallback bookkeeping (closed page, regular selection), one for the missing-but-open case via a stubbed page list, and the one affected snapshot updated (`close_page` now includes the note). Refs: #2304 |
||
|
|
ffc6060acf |
feat: update Lighthouse to 13.4.0 (#2317)
See https://github.com/GoogleChrome/lighthouse/releases/tag/v13.4.0 |
||
|
|
b2c63e644e |
perf: concurrent I/O in Root Path Resolution (#2279)
💡 **What:** Modified `McpContext.validatePath` to resolve the absolute paths for all configured workspace roots concurrently using `Promise.allSettled`, replacing the previous sequential iteration. 🎯 **Why:** The previous implementation executed potentially expensive disk I/O operations (`fs.realpath()`) synchronously one-by-one in a `for...of` loop. This caused a performance bottleneck when a user had several configured roots or during heavy file load activity, as each root had to fully resolve before proceeding to the next. 📊 **Measured Improvement:** Measured with 10 workspace roots (where only the last one matches). The change reduced execution time for a 1,000-iteration micro-benchmark from ~1,350ms to ~400ms, yielding a 70% speedup in this code path. --- *PR created automatically by Jules for task [14748109266156669449](https://jules.google.com/task/14748109266156669449) started by @Lightning00Blade* Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> |
||
|
|
74cea492b6 |
chore(deps-dev): bump puppeteer from 25.2.1 to 25.3.0 in the bundled group (#2300)
Bumps the bundled group with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 25.2.1 to 25.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/puppeteer/puppeteer/releases">puppeteer's releases</a>.</em></p> <blockquote> <h2>puppeteer-core: v25.3.0</h2> <h2><a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v25.2.1...puppeteer-core-v25.3.0">25.3.0</a> (2026-07-01)</h2> <h3>🎉 Features</h3> <ul> <li>support installing extensions for browser contexts (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15164">#15164</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/118d84d2622306f1b9e85ed9acee22b2931f12c7">118d84d</a>)</li> </ul> <h3>🛠️ Fixes</h3> <ul> <li>handle swaps without a timer (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15198">#15198</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/2356a15404acca1e00243a4f72408ecdb916ac11">2356a15</a>)</li> <li>normalize duplicate set-cookie headers using newline (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15173">#15173</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/55787d515570109ba7e5cb97df18499d743923fb">55787d5</a>)</li> <li>roll to Firefox 152.0.3 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15158">#15158</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/2d648522d4a90ed7fc5c79e6298f36f0dc0781f4">2d64852</a>)</li> <li>roll to Firefox 152.0.4 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15195">#15195</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/d382a218051c323e1d4d4d1a528c53370a6b1ee7">d382a21</a>)</li> </ul> <h3>📄 Documentation</h3> <ul> <li>fix the typos on documentation (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15167">#15167</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/ab74e6a6720ec05768979e3c2d9b26bcb5cd763f">ab74e6a</a>)</li> </ul> <h3>Dependencies</h3> <ul> <li>The following workspace dependencies were updated <ul> <li>dependencies <ul> <li><code>@puppeteer/browsers</code> bumped from 3.0.5 to 3.0.6</li> </ul> </li> </ul> </li> </ul> <h2>puppeteer: v25.3.0</h2> <h2><a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.2.1...puppeteer-v25.3.0">25.3.0</a> (2026-07-01)</h2> <h3>♻️ Chores</h3> <ul> <li><strong>puppeteer:</strong> Synchronize puppeteer versions</li> </ul> <h3>Dependencies</h3> <ul> <li>The following workspace dependencies were updated <ul> <li>dependencies <ul> <li><code>@puppeteer/browsers</code> bumped from 3.0.5 to 3.0.6</li> <li>puppeteer-core bumped from 25.2.1 to 25.3.0</li> </ul> </li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md">puppeteer's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.2.1...puppeteer-v25.3.0">25.3.0</a> (2026-07-01)</h2> <h3>♻️ Chores</h3> <ul> <li><strong>puppeteer:</strong> Synchronize puppeteer versions</li> </ul> <h3>Dependencies</h3> <ul> <li>The following workspace dependencies were updated <ul> <li>dependencies <ul> <li><code>@puppeteer/browsers</code> bumped from 3.0.5 to 3.0.6</li> </ul> </li> </ul> </li> </ul> <h3>🎉 Features</h3> <ul> <li>support installing extensions for browser contexts (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15164">#15164</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/118d84d2622306f1b9e85ed9acee22b2931f12c7">118d84d</a>)</li> </ul> <h3>🛠️ Fixes</h3> <ul> <li>handle swaps without a timer (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15198">#15198</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/2356a15404acca1e00243a4f72408ecdb916ac11">2356a15</a>)</li> <li>normalize duplicate set-cookie headers using newline (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15173">#15173</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/55787d515570109ba7e5cb97df18499d743923fb">55787d5</a>)</li> <li>roll to Firefox 152.0.3 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15158">#15158</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/2d648522d4a90ed7fc5c79e6298f36f0dc0781f4">2d64852</a>)</li> <li>roll to Firefox 152.0.4 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15195">#15195</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/d382a218051c323e1d4d4d1a528c53370a6b1ee7">d382a21</a>)</li> </ul> <h3>📄 Documentation</h3> <ul> <li>fix the typos on documentation (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15167">#15167</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/ab74e6a6720ec05768979e3c2d9b26bcb5cd763f">ab74e6a</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/puppeteer/puppeteer/commit/58d9b023ed74c3a1f14ec5fd9315872602270c72"><code>58d9b02</code></a> chore: release main (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15165">#15165</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/d382a218051c323e1d4d4d1a528c53370a6b1ee7"><code>d382a21</code></a> fix: roll to Firefox 152.0.4 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15195">#15195</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/2356a15404acca1e00243a4f72408ecdb916ac11"><code>2356a15</code></a> fix: handle swaps without a timer (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15198">#15198</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/537232e28297c38023cd4f56db4d110f31cc9e08"><code>537232e</code></a> chore(webmcp): Clean unnecessary Protocol interfaces (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15199">#15199</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/ab74e6a6720ec05768979e3c2d9b26bcb5cd763f"><code>ab74e6a</code></a> docs: fix the typos on documentation (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15167">#15167</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/9560bcfceb4445db889abb7b735177e13b46eb3a"><code>9560bcf</code></a> chore(deps-dev): bump the dev-dependencies group across 1 directory with 20 u...</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/04a95878db8eec2263d895fed2e98180a158ec76"><code>04a9587</code></a> refactor: extract zip archives with yauzl instead of CLI tools (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15085">#15085</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/54143a6c9aacd788679e42ee989e796c69bcff18"><code>54143a6</code></a> chore: fix the typos on the code test and API documentation (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15169">#15169</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/55787d515570109ba7e5cb97df18499d743923fb"><code>55787d5</code></a> fix: normalize duplicate set-cookie headers using newline (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15173">#15173</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/118d84d2622306f1b9e85ed9acee22b2931f12c7"><code>118d84d</code></a> feat: support installing extensions for browser contexts (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15164">#15164</a>)</li> <li>Additional commits viewable in <a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.2.1...puppeteer-v25.3.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Natasha Gorshunova <47688881+nattallius@users.noreply.github.com> |
||
|
|
e17c7cbdc1 |
chore(deps-dev): bump the dev-dependencies group with 6 updates (#2298)
Bumps the dev-dependencies group with 6 updates: | Package | From | To | | --- | --- | --- | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.0.1` | `26.1.0` | | [@types/sinon](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sinon) | `21.0.1` | `22.0.0` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.62.0` | `8.62.1` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.62.0` | `8.62.1` | | [prettier](https://github.com/prettier/prettier) | `3.9.3` | `3.9.4` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.62.0` | `8.62.1` | Updates `@types/node` from 26.0.1 to 26.1.0 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare view</a></li> </ul> </details> <br /> Updates `@types/sinon` from 21.0.1 to 22.0.0 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sinon">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/eslint-plugin` from 8.62.0 to 8.62.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/eslint-plugin's releases</a>.</em></p> <blockquote> <h2>v8.62.1</h2> <h2>8.62.1 (2026-06-29)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] use suggestion instead of autofix for trailing binary operator (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-boolean-literal-compare] preserve boolean result in fixer for nullable true comparisons (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion] parenthesize object literal at left edge of expression statement (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>, <a href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>mdm317</li> <li>Patrick Aleite</li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md">@typescript-eslint/eslint-plugin's changelog</a>.</em></p> <blockquote> <h2>8.62.1 (2026-06-29)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion] parenthesize object literal at left edge of expression statement (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>, <a href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-boolean-literal-compare] preserve boolean result in fixer for nullable true comparisons (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] use suggestion instead of autofix for trailing binary operator (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>mdm317</li> <li>Patrick Aleite</li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/3ea32f4ba5e196c08c6da1095619d7f65ba4905e"><code>3ea32f4</code></a> chore(release): publish 8.62.1</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/4ecca6d3f9ee1ab6468c8e9d6810ccc1c2f6bcf9"><code>4ecca6d</code></a> fix(eslint-plugin): [no-unnecessary-type-assertion] parenthesize object liter...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/f3a7ec78bf07b42a7e03f2091c98513e05310891"><code>f3a7ec7</code></a> chore(eslint-plugin-internal): [no-dynamic-tests] restrict where noFormat can...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/301f350cd11fecce4940b5be8a2b1146a9c6d58b"><code>301f350</code></a> fix(eslint-plugin): [no-unnecessary-boolean-literal-compare] preserve boolean...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/ebce2d40f83194599bc3022032ef4fa857977105"><code>ebce2d4</code></a> fix(eslint-plugin): [prefer-optional-chain] use suggestion instead of autofix...</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/eslint-plugin">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/parser` from 8.62.0 to 8.62.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/parser's releases</a>.</em></p> <blockquote> <h2>v8.62.1</h2> <h2>8.62.1 (2026-06-29)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] use suggestion instead of autofix for trailing binary operator (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-boolean-literal-compare] preserve boolean result in fixer for nullable true comparisons (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion] parenthesize object literal at left edge of expression statement (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>, <a href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>mdm317</li> <li>Patrick Aleite</li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@typescript-eslint/parser's changelog</a>.</em></p> <blockquote> <h2>8.62.1 (2026-06-29)</h2> <p>This was a version bump only for parser to align it with other projects, there were no code changes.</p> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/3ea32f4ba5e196c08c6da1095619d7f65ba4905e"><code>3ea32f4</code></a> chore(release): publish 8.62.1</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/parser">compare view</a></li> </ul> </details> <br /> Updates `prettier` from 3.9.3 to 3.9.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/releases">prettier's releases</a>.</em></p> <blockquote> <h2>3.9.4</h2> <ul> <li>Angular: Format <code>@content(name)</code> -> <code>@content (name)</code> to align with other block syntax (<a href="https://redirect.github.com/prettier/prettier/pull/19499">#19499</a> by <a href="https://github.com/fisker"><code>@fisker</code></a>)</li> </ul> <p>🔗 <a href="https://github.com/prettier/prettier/blob/3.9.4/CHANGELOG.md#394">Changelog</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's changelog</a>.</em></p> <blockquote> <h1>3.9.4</h1> <p><a href="https://github.com/prettier/prettier/compare/3.9.3...3.9.4">diff</a></p> <h4>Angular: Format <code>@content(name)</code> -> <code>@content (name)</code> to align with other block syntax (<a href="https://redirect.github.com/prettier/prettier/pull/19499">#19499</a> by <a href="https://github.com/fisker"><code>@fisker</code></a>)</h4> <!-- raw HTML omitted --> <pre lang="html"><code><!-- Input --> <FancyButton [label]="title"> @content (icon) { <span>Icon!</span> } @content (description) { <span>Description text</span> } <span>Other children</span> </FancyButton> <p><!-- Prettier 3.9.3 --> <FancyButton [label]="title"> <a href="https://github.com/content"><code>@content</code></a>(icon) { <span>Icon!</span> } <a href="https://github.com/content"><code>@content</code></a>(description) { <span>Description text</span> } <span>Other children</span> </FancyButton></p> <p><!-- Prettier 3.9.4 --> <FancyButton [label]="title"> <a href="https://github.com/content"><code>@content</code></a> (icon) { <span>Icon!</span> } <a href="https://github.com/content"><code>@content</code></a> (description) { <span>Description text</span> } <span>Other children</span> </FancyButton> </code></pre></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/prettier/prettier/commit/b693cb22b412b759784bc2298fc86880e351cd3a"><code>b693cb2</code></a> Release 3.9.4</li> <li><a href="https://github.com/prettier/prettier/commit/2e92ac0ee29fb83b7ce32277cb914c2eee192955"><code>2e92ac0</code></a> Angular: Format <code>@content(name)</code> -> <code>@content (name)</code> to align with other blo...</li> <li><a href="https://github.com/prettier/prettier/commit/abed2c22db3cb61e922b7284c3b6c65424353ac2"><code>abed2c2</code></a> Bump Prettier dependency to 3.9.3</li> <li><a href="https://github.com/prettier/prettier/commit/6cfbc00921de451e918b18bb5ab6b80e80f5cd34"><code>6cfbc00</code></a> Clean changelog_unreleased</li> <li>See full diff in <a href="https://github.com/prettier/prettier/compare/3.9.3...3.9.4">compare view</a></li> </ul> </details> <br /> Updates `typescript-eslint` from 8.62.0 to 8.62.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">typescript-eslint's releases</a>.</em></p> <blockquote> <h2>v8.62.1</h2> <h2>8.62.1 (2026-06-29)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] use suggestion instead of autofix for trailing binary operator (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12328">#12328</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-boolean-literal-compare] preserve boolean result in fixer for nullable true comparisons (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12365">#12365</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion] parenthesize object literal at left edge of expression statement (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12443">#12443</a>, <a href="https://redirect.github.com/typescript-eslint/typescript-eslint/issues/12418">#12418</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> <li>mdm317</li> <li>Patrick Aleite</li> <li>송재욱</li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md">typescript-eslint's changelog</a>.</em></p> <blockquote> <h2>8.62.1 (2026-06-29)</h2> <p>This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.</p> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.1">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/3ea32f4ba5e196c08c6da1095619d7f65ba4905e"><code>3ea32f4</code></a> chore(release): publish 8.62.1</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/typescript-eslint">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
aa4be07f7a |
docs: add Grok Build CLI configuration section (#2294)
# Summary adds Grok Build CLI to the MCP client configuration list in README.md # Verification Verified visually + git diff |
||
|
|
3d2138945c |
feat: add experimentalGcfFormat flag for GCF-encoded tool responses (#2235)
## Summary Add `--experimentalGcfFormat` as a hidden experimental flag alongside the existing `--experimentalToonFormat`. When enabled, tool responses encode structured data using GCF (Graph Compact Format) instead of formatted JSON. No changes to existing behavior or default output. ## Why ### Benchmarked on Chrome DevTools data shapes Data shapes verified from source code and test snapshots (`ConsoleMessageConcise`, `NetworkRequestConcise`, `HeapSnapshotFormatter.toJSON()`, `SnapshotFormatter.toJSON()`): | Dataset | JSON | TOON | GCF | TOON vs JSON | GCF vs JSON | GCF vs TOON | |---------|------|------|-----|-------------|-------------|-------------| | Console (100) | 2,534 | 1,716 | 1,663 | 32.3% | 34.4% | +3.1% | | Console (500) | 12,879 | 8,761 | 8,475 | 32.0% | 34.2% | +3.3% | | Network (100) | 3,287 | 1,776 | 1,682 | 46.0% | 48.8% | +5.3% | | Network (500) | 16,547 | 8,936 | 8,442 | 46.0% | 49.0% | +5.5% | | Heap (100) | 2,210 | 797 | 753 | 63.9% | 65.9% | +5.5% | | DOM (3x3) | 282 | 295 | 244 | -4.6% | 13.5% | +17.3% | | DOM (4x3) | 396 | 464 | 407 | -17.2% | -2.8% | +12.3% | TOON increases token count on DOM snapshots (-4.6% to -17.2% vs JSON). GCF saves tokens on every data type. ### Console message corruption TOON's decoder crashes on console messages containing bracket-colon patterns, which are standard browser output: ``` [Error]: net::ERR_CONNECTION_REFUSED [React DevTools]: Component rendered 3 times [Violation]: Forced reflow while executing JavaScript took 42ms [Performance]: Long task detected (duration: 234ms) ``` 10 of 20 console messages fail TOON round-trip. GCF: zero failures. While Chrome DevTools MCP encodes only (no decode), the structurally ambiguous output can affect downstream consumers. ### LLM comprehension GCF scores 100% on general structured data and 90.7% on adversarial payloads across GPT-4o, GPT-5.5, Claude, and Gemini. JSON scores 53.6%. TOON scores 68.5%. (1,700+ evaluations.) Full eval data: [GCF benchmarks](https://gcformat.com/guide/benchmarks) ### Data integrity GCF verified lossless across 43 billion+ round-trips in 5 formats and 6 languages. Zero failures. Zero runtime dependencies. ## Implementation Mirrors the existing `experimentalToonFormat` pattern exactly: - Hidden boolean CLI flag, defaults to false - `useGcf` parameter threaded through `handle()` → `format()` - `compactEncode` helper selects GCF, TOON, or null (formatted JSON) - GCF takes precedence if both flags are set ## Changes | File | Change | |------|--------| | `src/bin/chrome-devtools-mcp-cli-options.ts` | Add `experimentalGcfFormat` flag | | `src/third_party/index.ts` | Export `gcfEncode` from `@blackwell-systems/gcf` | | `src/McpResponse.ts` | Add `useGcf` parameter, `compactEncode` helper | | `src/ToolHandler.ts` | Pass `experimentalGcfFormat` to `handle()` | | `package.json` | Add `@blackwell-systems/gcf` (pinned 2.1.2, zero deps) | ## Links - GCF spec: https://gcformat.com - TypeScript SDK: https://www.npmjs.com/package/@blackwell-systems/gcf - Benchmarks: https://gcformat.com/guide/benchmarks - Lossless verification: https://gcformat.com/guide/lossless-verification --------- Co-authored-by: Piotr Paulski <piotrpaulski@chromium.org> |
||
|
|
b06e39b164 |
fix: enforce .gz instead of json.gz in performance tools (#2305)
Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2303 |
||
|
|
b703f2ce20 |
fix(snapshot): resolve element ids on the correct snapshot (#2295)
closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/2243 This probably regressed with the addition of third party developer tools because the resolveCdpElementId was not moved from page to TextSnapshot. |
||
|
|
913308263b |
chore(main): release chrome-devtools-mcp 1.5.0 (#2252)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop* --- ## [1.5.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v1.4.0...chrome-devtools-mcp-v1.5.0) (2026-07-03) ### 🎉 Features * Add get_heapsnapshot_duplicate_strings MCP tool ([#2280](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/2280)) ([chrome-devtools-mcp-v1.5.0 |
||
|
|
67a56c0557 |
feat: Add get_heapsnapshot_duplicate_strings MCP tool (#2280)
This PR adds a new MCP tool to find duplicated strings in the heap snapshot. Co-authored-by: Dominik Inführ <dinfuehr@chromium.org> |
||
|
|
a9228141ae |
fix: validate extension-enforced output paths (#2269)
Fixes output path validation so tools cannot validate one path and then write to a different canonical target after extension enforcement. Changes: - Resolve dangling symlinks to their target path during canonicalization. - Validate the final extension-enforced output path before writing. - Apply the same final-path validation to heap snapshots and screencasts. - Add regression coverage for dangling symlinks that point outside configured roots. Validation: - npm run format - npm run check-format - npm run test tests/utils/files.test.ts - npm run test tests/roots.test.ts - npm run test tests/tools/memory.test.ts tests/tools/screencast.test.ts Note: I also ran the full npm test suite locally. The targeted tests above passed, but the full suite hit local WSL daemon/e2e startup timeouts while waiting for daemon.pid / server_start, which appear unrelated to this path-validation change. --------- Co-authored-by: huynhtrungcsc <huynhtrungcsc@users.noreply.github.com> |
||
|
|
cf00305170 |
fix(cli): improve error messages to guide AI agents and developers (#2161)
Co-authored-by: Nicholas Roscino <nroscino@google.com> Co-authored-by: Piotr Paulski <31672205+zyzyzyryxy@users.noreply.github.com> Co-authored-by: Piotr Paulski <piotrpaulski@chromium.org> |
||
|
|
a38ef5e7ea |
test: fix flaky dialog tests by awaiting evaluate promises (#2284)
Fixes flakiness in pages.test.ts where unawaited page.evaluate() promises triggering dialogs would resolve after the test ended, causing TargetCloseError when the next test closed the pages. TAG=agy CONV=dc6c530f-5d71-4a91-9440-6a7006d168e6 Co-authored-by: Piotr Paulski <piotrpaulski@chromium.org> |
||
|
|
3f4a49a89a |
refactor: Merge MCP tools for comparing heap snapshots (#2281)
Instead of two separate MCP tools, we can have one instead which takes classIndex as optional argument. Co-authored-by: Dominik Inführ <dinfuehr@chromium.org> |
||
|
|
8d8cf1299d |
docs: fix formatting and indentation of tool descriptions (#2275)
Follow-up on formatting changes introduced by dependency update in #2266 Co-authored-by: Piotr Paulski <piotrpaulski@chromium.org> |
||
|
|
ce5edbd6a3 |
chore(deps-dev): bump the dev-dependencies group across 1 directory with 7 updates (#2266)
Bumps the dev-dependencies group with 7 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@google/genai](https://github.com/googleapis/js-genai) | `2.9.0` | `2.10.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.0.0` | `26.0.1` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.61.1` | `8.62.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.61.1` | `8.62.0` | | [globals](https://github.com/sindresorhus/globals) | `17.6.0` | `17.7.0` | | [prettier](https://github.com/prettier/prettier) | `3.8.4` | `3.9.3` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.61.1` | `8.62.0` | Updates `@google/genai` from 2.9.0 to 2.10.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/googleapis/js-genai/releases">@google/genai's releases</a>.</em></p> <blockquote> <h2>v2.10.0</h2> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.9.0...v2.10.0">2.10.0</a> (2026-06-24)</h2> <h3>Features</h3> <ul> <li>[Interactions] Add ComputerUse.disabled_safety_policies (<a href="https://github.com/googleapis/js-genai/commit/a2ca95cb81230ac371864914d2ad655c3f83c7bb">a2ca95c</a>)</li> <li>[Models] Add ComputerUse.disabled_safety_policies (<a href="https://github.com/googleapis/js-genai/commit/3618023147fe8ba63a9ecfa00253ab489e74aba8">3618023</a>)</li> <li>add usage fields for steps (<a href="https://github.com/googleapis/js-genai/commit/048db9a660d6cb7107212baab64e694db8498dfc">048db9a</a>)</li> <li>add video generation and response format parameters. (<a href="https://github.com/googleapis/js-genai/commit/84e795cf4add4ca9dffe47828d6528e19d684d54">84e795c</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/googleapis/js-genai/blob/main/CHANGELOG.md">@google/genai's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/googleapis/js-genai/compare/v2.9.0...v2.10.0">2.10.0</a> (2026-06-24)</h2> <h3>Features</h3> <ul> <li>[Interactions] Add ComputerUse.disabled_safety_policies (<a href="https://github.com/googleapis/js-genai/commit/a2ca95cb81230ac371864914d2ad655c3f83c7bb">a2ca95c</a>)</li> <li>[Models] Add ComputerUse.disabled_safety_policies (<a href="https://github.com/googleapis/js-genai/commit/3618023147fe8ba63a9ecfa00253ab489e74aba8">3618023</a>)</li> <li>add usage fields for steps (<a href="https://github.com/googleapis/js-genai/commit/048db9a660d6cb7107212baab64e694db8498dfc">048db9a</a>)</li> <li>add video generation and response format parameters. (<a href="https://github.com/googleapis/js-genai/commit/84e795cf4add4ca9dffe47828d6528e19d684d54">84e795c</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/googleapis/js-genai/commit/31223a3e02a5d1c8146ad2673df5a1c7e4bababb"><code>31223a3</code></a> chore(main): release 2.10.0 (<a href="https://redirect.github.com/googleapis/js-genai/issues/1725">#1725</a>)</li> <li><a href="https://github.com/googleapis/js-genai/commit/628f3f2e83202fc040cbc502e98108689489be69"><code>628f3f2</code></a> chore: Disable ComputerUse.disabled_safety_policies in Gemini Enterprise API</li> <li><a href="https://github.com/googleapis/js-genai/commit/84e795cf4add4ca9dffe47828d6528e19d684d54"><code>84e795c</code></a> feat: add video generation and response format parameters.</li> <li><a href="https://github.com/googleapis/js-genai/commit/048db9a660d6cb7107212baab64e694db8498dfc"><code>048db9a</code></a> feat: add usage fields for steps</li> <li><a href="https://github.com/googleapis/js-genai/commit/a2ca95cb81230ac371864914d2ad655c3f83c7bb"><code>a2ca95c</code></a> feat: Add ComputerUse.disabled_safety_policies</li> <li><a href="https://github.com/googleapis/js-genai/commit/3618023147fe8ba63a9ecfa00253ab489e74aba8"><code>3618023</code></a> feat: Add ComputerUse.disabled_safety_policies</li> <li><a href="https://github.com/googleapis/js-genai/commit/eeee71122760ddba9df72611a013c1bd78fc0d7d"><code>eeee711</code></a> docs: fix typos across docstrings</li> <li><a href="https://github.com/googleapis/js-genai/commit/a12a590062760dd75899dc3c28564d3ae62bf67a"><code>a12a590</code></a> chore: Upgrade stalebot action to use v10 (due to Node20 deprecation)</li> <li>See full diff in <a href="https://github.com/googleapis/js-genai/compare/v2.9.0...v2.10.0">compare view</a></li> </ul> </details> <br /> Updates `@types/node` from 26.0.0 to 26.0.1 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/eslint-plugin` from 8.61.1 to 8.62.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/eslint-plugin's releases</a>.</em></p> <blockquote> <h2>v8.62.0</h2> <h2>8.62.0 (2026-06-22)</h2> <h3>🚀 Features</h3> <ul> <li>remove redundant package.json "files" (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>add "files" to rule-schema-to-typescript-types (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md">@typescript-eslint/eslint-plugin's changelog</a>.</em></p> <blockquote> <h2>8.62.0 (2026-06-22)</h2> <h3>🚀 Features</h3> <ul> <li>remove redundant package.json "files" (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/54e285728e5d8cb83fadb8041189f0c3b4ab436a"><code>54e2857</code></a> chore(release): publish 8.62.0</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/81e4c2654c3f4d923766a888691add2c45b5d64a"><code>81e4c26</code></a> feat: remove redundant package.json "files" (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12444">#12444</a>)</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/b784054b6f8fbb51eb742304852b37b0436a8a58"><code>b784054</code></a> chore: use <code>stableTypeOrdering</code> compiler option (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12427">#12427</a>)</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/eslint-plugin">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/parser` from 8.61.1 to 8.62.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/parser's releases</a>.</em></p> <blockquote> <h2>v8.62.0</h2> <h2>8.62.0 (2026-06-22)</h2> <h3>🚀 Features</h3> <ul> <li>remove redundant package.json "files" (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>add "files" to rule-schema-to-typescript-types (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@typescript-eslint/parser's changelog</a>.</em></p> <blockquote> <h2>8.62.0 (2026-06-22)</h2> <h3>🚀 Features</h3> <ul> <li>remove redundant package.json "files" (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/54e285728e5d8cb83fadb8041189f0c3b4ab436a"><code>54e2857</code></a> chore(release): publish 8.62.0</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/81e4c2654c3f4d923766a888691add2c45b5d64a"><code>81e4c26</code></a> feat: remove redundant package.json "files" (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser/issues/12444">#12444</a>)</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/parser">compare view</a></li> </ul> </details> <br /> Updates `globals` from 17.6.0 to 17.7.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/sindresorhus/globals/releases">globals's releases</a>.</em></p> <blockquote> <h2>v17.7.0</h2> <ul> <li>Update globals (2026-06-22) (<a href="https://redirect.github.com/sindresorhus/globals/issues/345">#345</a>) 33b75f9</li> </ul> <hr /> <p><a href="https://github.com/sindresorhus/globals/compare/v17.6.0...v17.7.0">https://github.com/sindresorhus/globals/compare/v17.6.0...v17.7.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/sindresorhus/globals/commit/a19670cc86c1218e915657c55ea02ba3e7623834"><code>a19670c</code></a> 17.7.0</li> <li><a href="https://github.com/sindresorhus/globals/commit/9611620bad0ea45531ae0261b986ce694374e42c"><code>9611620</code></a> Update actions (<a href="https://redirect.github.com/sindresorhus/globals/issues/346">#346</a>)</li> <li><a href="https://github.com/sindresorhus/globals/commit/33b75f9ddeb6f9ddd81251b043667eb8104a8d15"><code>33b75f9</code></a> Update globals (2026-06-22) (<a href="https://redirect.github.com/sindresorhus/globals/issues/345">#345</a>)</li> <li><a href="https://github.com/sindresorhus/globals/commit/887dd529bde24486b7f9e31d1b2c515df2b7cf5c"><code>887dd52</code></a> Fix build script (<a href="https://redirect.github.com/sindresorhus/globals/issues/344">#344</a>)</li> <li>See full diff in <a href="https://github.com/sindresorhus/globals/compare/v17.6.0...v17.7.0">compare view</a></li> </ul> </details> <br /> Updates `prettier` from 3.8.4 to 3.9.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/releases">prettier's releases</a>.</em></p> <blockquote> <h2>3.9.3</h2> <ul> <li>Markdown: Fix unexpected removal of characters in liquid syntax (<a href="https://redirect.github.com/prettier/prettier/pull/19489">prettier/prettier#19489</a> by <a href="https://github.com/seiyab"><code>@seiyab</code></a>)</li> <li>TypeScript: Allow decorators to be used with declare on class fields (<a href="https://redirect.github.com/prettier/prettier/pull/19492">prettier/prettier#19492</a> by <a href="https://github.com/evoactivity"><code>@evoactivity</code></a>)</li> </ul> <p>🔗 <a href="https://github.com/prettier/prettier/blob/3.9.3/CHANGELOG.md#393">Changelog</a></p> <h2>3.9.1</h2> <ul> <li>CLI: Fix ignored file has been cached incorrectly (<a href="https://redirect.github.com/prettier/prettier/pull/19483">#19483</a> by <a href="https://github.com/kovsu"><code>@kovsu</code></a>)</li> </ul> <p>🔗 <a href="https://github.com/prettier/prettier/blob/3.9.1/CHANGELOG.md#391">Changelog</a></p> <h2>3.9.0</h2> <p><a href="https://github.com/prettier/prettier/compare/3.8.5...3.9.0">diff</a></p> <p>🔗 <a href="https://prettier.io/blog/2026/06/27/3.9.0">Prettier 3.9: Major parser upgrades and Formatting improvements</a></p> <h2>3.8.5</h2> <ul> <li>Fix Flow variance annotation print (<a href="https://redirect.github.com/prettier/prettier/pull/19022">#19022</a> by <a href="https://github.com/marcoww6"><code>@marcoww6</code></a>)</li> </ul> <p>🔗 <a href="https://github.com/prettier/prettier/blob/3.8.5/CHANGELOG.md#385">Changelog</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's changelog</a>.</em></p> <blockquote> <h1>3.9.3</h1> <p><a href="https://github.com/prettier/prettier/compare/3.9.1...3.9.3">diff</a></p> <h4>Markdown: Fix unexpected removal of characters in liquid syntax (<a href="https://redirect.github.com/prettier/prettier/pull/19489">#19489</a> by <a href="https://github.com/seiyab"><code>@seiyab</code></a>)</h4> <!-- raw HTML omitted --> <pre lang="md"><code>// Input <!-- Input --> {{ page.title }} text <p><!-- Prettier 3.9.1 --><br /> {{ page.title<br /> text</p> <p><!-- Prettier 3.9.3 --><br /> {{ page.title<br /> }} text<br /> </code></pre></p> <h4>TypeScript: Allow decorators to be used with declare on class fields (<a href="https://redirect.github.com/prettier/prettier/pull/19492">#19492</a> by <a href="https://github.com/evoactivity"><code>@evoactivity</code></a>)</h4> <p>Extensively used within the Ember ecosystem, decorators with <code>declare</code> on class fields will ignore the babel parser error and allow Prettier to format the code without breaking it.</p> <!-- raw HTML omitted --> <pre lang="ts"><code>// Input export default class ProjectStatusComponent extends Component<ProjectStatusSig> { @service declare server: ServerService; } <p>// Prettier 3.9.1<br /> // SyntaxError: Decorators can't be used with a declare field. (2:3)<br /> // 1 | export default class ProjectStatusComponent extends Component<ProjectStatusSig> {<br /> //> 2 | <a href="https://github.com/service"><code>@service</code></a> declare server: ServerService;<br /> // | ^<br /> // 3 | }</p> <p>// Prettier 3.9.3<br /> export default class ProjectStatusComponent extends Component<ProjectStatusSig> {<br /> <a href="https://github.com/service"><code>@service</code></a> declare server: ServerService;<br /> }<br /> </code></pre></p> <h1>3.9.1</h1> <p><a href="https://github.com/prettier/prettier/compare/3.9.0...3.9.1">diff</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/prettier/prettier/commit/3732e1dee6a36bdb2e77a722d206a79ac7e67aa3"><code>3732e1d</code></a> Release 3.9.3</li> <li><a href="https://github.com/prettier/prettier/commit/a74a7b05dee7fbef39a6aeff378c3741e1a8ee15"><code>a74a7b0</code></a> Allow decorators to be used with <code>declare</code> on class fields (<a href="https://redirect.github.com/prettier/prettier/issues/19492">#19492</a>)</li> <li><a href="https://github.com/prettier/prettier/commit/bd9e11ab41e17a4f61f363a981c1ec24d2a4167a"><code>bd9e11a</code></a> Correct text identification in liquid syntax (<a href="https://redirect.github.com/prettier/prettier/issues/19489">#19489</a>)</li> <li><a href="https://github.com/prettier/prettier/commit/269eee3faa1f82b1de07bb7e4d15e1cee70f80d4"><code>269eee3</code></a> Bump Prettier dependency to 3.9.1</li> <li><a href="https://github.com/prettier/prettier/commit/ec7ccd1ea47c965bda3c958239899737e899603d"><code>ec7ccd1</code></a> Clean changelog_unreleased</li> <li><a href="https://github.com/prettier/prettier/commit/c47654c003fe525572e10d5cc1ea64d7b9c0ee55"><code>c47654c</code></a> Release 3.9.1</li> <li><a href="https://github.com/prettier/prettier/commit/06159aa254e662514d1c6f4de13fbac805984232"><code>06159aa</code></a> Fix bug in release script</li> <li><a href="https://github.com/prettier/prettier/commit/4bc5ab40582921f5283af4ff5d6511b58d25ec00"><code>4bc5ab4</code></a> Update file-entry-cache to 11.1.5 (<a href="https://redirect.github.com/prettier/prettier/issues/19483">#19483</a>)</li> <li><a href="https://github.com/prettier/prettier/commit/b7fd58bba027282038ad312af0522d4598e8b769"><code>b7fd58b</code></a> Release <code>@prettier/plugin-oxc@0.2.0</code> and <code>@prettier/plugin-hermes@0.2.0</code></li> <li><a href="https://github.com/prettier/prettier/commit/3006400fc2560e297b54d82c58cbc331ec87902c"><code>3006400</code></a> Revert changes in release script</li> <li>Additional commits viewable in <a href="https://github.com/prettier/prettier/compare/3.8.4...3.9.3">compare view</a></li> </ul> </details> <br /> Updates `typescript-eslint` from 8.61.1 to 8.62.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">typescript-eslint's releases</a>.</em></p> <blockquote> <h2>v8.62.0</h2> <h2>8.62.0 (2026-06-22)</h2> <h3>🚀 Features</h3> <ul> <li>remove redundant package.json "files" (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>add "files" to rule-schema-to-typescript-types (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12441">#12441</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md">typescript-eslint's changelog</a>.</em></p> <blockquote> <h2>8.62.0 (2026-06-22)</h2> <h3>🚀 Features</h3> <ul> <li>remove redundant package.json "files" (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12444">#12444</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Kirk Waiblinger <a href="https://github.com/kirkwaiblinger"><code>@kirkwaiblinger</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.62.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/54e285728e5d8cb83fadb8041189f0c3b4ab436a"><code>54e2857</code></a> chore(release): publish 8.62.0</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/81e4c2654c3f4d923766a888691add2c45b5d64a"><code>81e4c26</code></a> feat: remove redundant package.json "files" (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint/issues/12444">#12444</a>)</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.0/packages/typescript-eslint">compare view</a></li> </ul> </details> <br /> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nikolay Vitkov <nvitkov@chromium.org> |
||
|
|
7fa95d3c33 |
fix: create PID directory with secure permissions (0o700) (#2262)
## Summary
- Add `mode: 0o700` to `fs.mkdirSync` when creating the PID directory
- Ensures the directory is always created with owner-only access
regardless of system umask
## Problem
The daemon creates the PID directory with `fs.mkdirSync(pidDir,
{recursive: true})` without specifying a mode. On systems with `umask
002`, the directory lands at mode 0775, which the daemon's own security
check rejects as "insecure permissions" and exits.
The daemon's test (`tests/daemon/symlink.test.ts`) already expects 0700
permissions, but nothing enforced it at runtime.
Fixes #2258
## Test Plan
- [ ] `umask 0002 && npx chrome-devtools-mcp@latest` no longer crashes
- [ ] `umask 0077 && npx chrome-devtools-mcp@latest` still works
- [ ] Existing daemon tests pass
|
||
|
|
5d7b656050 |
feat: Add MCP tools for heap snapshot comparison (#2198)
This commit adds two MCP tools for comparing heap snapshots. `compare_heapsnapshot_summary` compares two memory snapshot and returns which classes have new/deleted objects. `compare_heapsnapshot_class_nodes` can then be used to list the object ids added and deleted for a specific class. Co-authored-by: Dominik Inführ <dinfuehr@chromium.org> |
||
|
|
604b38f319 |
docs: fix Antigravity config -y flag before npx positional args (#2272)
Moves the `-y` flag before the package name in the Antigravity JSON configuration example. According to official npm documentation, `npx` requires all flags to precede positional arguments. Placing `-y` at the end caused `npx` to treat it as an argument for the MCP server, triggering an interactive installation prompt that hangs indefinitely in headless CLI environments. |
||
|
|
dcb07983c1 |
chore(deps-dev): bump chrome-devtools-frontend from 1.0.1650035 to 1.0.1652307 in the bundled-devtools group (#2267)
Bumps the bundled-devtools group with 1 update: [chrome-devtools-frontend](https://github.com/ChromeDevTools/devtools-frontend). Updates `chrome-devtools-frontend` from 1.0.1650035 to 1.0.1652307 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/07482123637227aa4c1afef4b1b80abb66683063"><code>0748212</code></a> Update DevTools DEPS (trusted)</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/549a181bfb75e1eaf92031bf076d4ed86593806c"><code>549a181</code></a> AI: Rename AllToolsContext to AllToolsCapabilities</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/7b846d861f54d0d774f83a66ef0e5e1bf4b63b5a"><code>7b846d8</code></a> Update DevTools DEPS (trusted)</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/406537c2830052261736caa3ba52d46c3f564cba"><code>406537c</code></a> Roll browser-protocol and CfT</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/2ab3e3efad59c718110942f6bca06dd62b56f018"><code>2ab3e3e</code></a> [build] Add generated tsconfig to outputs of generate_css</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/054563a7e08ead180493561bcbea55b97bb58365"><code>054563a</code></a> Remove ObjectPropertiesSectionsTreeOutline from ScopeChainSidebarPain</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/ff41727b1952f90cf2f6f93e0eb6a200d137cee4"><code>ff41727</code></a> Fix missing dependency on services/tracing in legacy test_runner</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/49c3d61f9e548d9984eaf4d52d6c86f4c0c55a88"><code>49c3d61</code></a> Update DevTools DEPS (trusted)</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/9d61befc2ac91613d9e0a031cce9a0dcab37ba80"><code>9d61bef</code></a> Show CSS specificity breakdown in selector tooltip</li> <li><a href="https://github.com/ChromeDevTools/devtools-frontend/commit/9bf90e6bd32d553967294c6ba93408ede35bf065"><code>9bf90e6</code></a> Update generator script to support devtools_keywords</li> <li>Additional commits viewable in <a href="https://github.com/ChromeDevTools/devtools-frontend/compare/v1.0.1650035...v1.0.1652307">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
47b1963bc4 |
chore(deps-dev): bump puppeteer from 25.2.0 to 25.2.1 in the bundled group (#2268)
Bumps the bundled group with 1 update: [puppeteer](https://github.com/puppeteer/puppeteer). Updates `puppeteer` from 25.2.0 to 25.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/puppeteer/puppeteer/releases">puppeteer's releases</a>.</em></p> <blockquote> <h2>puppeteer-core: v25.2.1</h2> <h2><a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v25.2.0...puppeteer-core-v25.2.1">25.2.1</a> (2026-06-24)</h2> <h3>🛠️ Fixes</h3> <ul> <li>regression when using Puppeteer with untrusted sessions (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15150">#15150</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/801c2124cfbc4a4a19bb0a40bc3b8a25d7504691">801c212</a>)</li> <li>roll to Firefox 152.0.2 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15153">#15153</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/d2908b2cdf3e3fa721a063d40b50d532b39bbc72">d2908b2</a>)</li> </ul> <h2>puppeteer: v25.2.1</h2> <h2><a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.2.0...puppeteer-v25.2.1">25.2.1</a> (2026-06-24)</h2> <h3>♻️ Chores</h3> <ul> <li><strong>puppeteer:</strong> Synchronize puppeteer versions</li> </ul> <h3>Dependencies</h3> <ul> <li>The following workspace dependencies were updated <ul> <li>dependencies <ul> <li>puppeteer-core bumped from 25.2.0 to 25.2.1</li> </ul> </li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md">puppeteer's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.2.0...puppeteer-v25.2.1">25.2.1</a> (2026-06-24)</h2> <h3>♻️ Chores</h3> <ul> <li><strong>puppeteer:</strong> Synchronize puppeteer versions</li> </ul> <h3>Dependencies</h3> <ul> <li>The following workspace dependencies were updated <ul> <li>dependencies <ul> <li>puppeteer-core bumped from 25.2.0 to 25.2.1</li> </ul> </li> </ul> </li> </ul> <h3>🛠️ Fixes</h3> <ul> <li>regression when using Puppeteer with untrusted sessions (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15150">#15150</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/801c2124cfbc4a4a19bb0a40bc3b8a25d7504691">801c212</a>)</li> <li>roll to Firefox 152.0.2 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15153">#15153</a>) (<a href="https://github.com/puppeteer/puppeteer/commit/d2908b2cdf3e3fa721a063d40b50d532b39bbc72">d2908b2</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/puppeteer/puppeteer/commit/4a56c699e50f0cd5ff87dd10e43f7defaf3d95a0"><code>4a56c69</code></a> chore: release main (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15152">#15152</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/d2908b2cdf3e3fa721a063d40b50d532b39bbc72"><code>d2908b2</code></a> fix: roll to Firefox 152.0.2 (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15153">#15153</a>)</li> <li><a href="https://github.com/puppeteer/puppeteer/commit/801c2124cfbc4a4a19bb0a40bc3b8a25d7504691"><code>801c212</code></a> fix: regression when using Puppeteer with untrusted sessions (<a href="https://redirect.github.com/puppeteer/puppeteer/issues/15150">#15150</a>)</li> <li>See full diff in <a href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.2.0...puppeteer-v25.2.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |