refactor(devtool-mcp-server)!: use new connector#2284
refactor(devtool-mcp-server)!: use new connector#2284colinaaa merged 8 commits intolynx-family:mainfrom
Conversation
🦋 Changeset detectedLatest commit: 31c24d9 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
📝 WalkthroughWalkthroughAdds a new Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 14
🧹 Nitpick comments (6)
packages/mcp-servers/devtool-connector/src/transport/desktop.ts (1)
51-61: Improve abort signal handling for connection cancellation.The
signalis passed tonet.createConnectionbut Node.jsnet.createConnectiononly started supporting thesignaloption in Node.js 15+. Since this package targets Node.js >=18.19, this should work. However, consider adding an abort listener for consistent behavior with other transports (iOS, Android) that explicitly handle abort events.Additionally, the empty else branch at lines 59-61 could be removed or the logic simplified.
♻️ Simplified connection wait logic
try { if (socket.connecting) { await new Promise<void>((resolve, reject) => { socket.once('connect', resolve); socket.once('error', reject); }); - } else { - // already connected or failed immediately }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/desktop.ts` around lines 51 - 61, The current connection logic uses net.createConnection with a signal but lacks an explicit abort listener and has an empty else branch; update the connect wait in the function that creates the `socket` (using `net.createConnection`) to first check `if (signal?.aborted)` and throw an appropriate AbortError, then when awaiting the connect event attach an abort listener (e.g., `signal.addEventListener('abort', ...)`) that cleans up the socket (call `socket.destroy()` or `socket.end()`) and rejects the pending promise with the abort reason; also remove the empty else branch and simplify to await the connect promise only when `socket.connecting` is true, ensuring you remove the abort listener on success or error to avoid leaks.packages/mcp-servers/devtool-connector/src/types.ts (2)
63-67: Clarify the empty string type forSession.type.
type: ''as a literal type is unusual. If this represents an actual protocol value, consider adding a comment explaining it. If it's meant to be a placeholder, consider using a more descriptive type or string literal union.📝 Add documentation
export interface Session { session_id: number; + /** Currently unused, reserved for future session type differentiation */ type: ''; url: string; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/types.ts` around lines 63 - 67, The Session interface declares type: '' which is a string literal type and likely unintended; update the Session.type declaration in the Session interface to a meaningful type (e.g., a descriptive string literal union like 'http' | 'ws' | 'ssh' or simply string) or add a clarifying comment if the empty literal is intentional; modify the interface definition for Session (property name: type) accordingly and ensure any usages or tests that depend on Session.type are adjusted to match the new type.
80-84: Complex union type forGetGlobalSwitchResponse.message.The
messagefield can bestring | boolean | { global_value: string | boolean }, which suggests the protocol has inconsistent response formats. Consider documenting why this variability exists or normalizing the response handling.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/types.ts` around lines 80 - 84, GetGlobalSwitchResponse currently allows message to be string | boolean | { global_value: string | boolean }, which leads to inconsistent handling; update the type and code to normalize the shape (e.g., always expose a stable field) or add a documented union alias explaining each variant. Specifically, either modify GetGlobalSwitchResponse to use a normalized shape like { global_value: string | boolean } (and update consumers of GetGlobalSwitchResponse accordingly) or define a named union type (e.g., type GlobalSwitchMessage = string | boolean | { global_value: string | boolean }) with a clear comment describing when each variant is used, and refactor places that read message (search for GetGlobalSwitchResponse and usages) to handle the normalized shape or discriminate the union safely.packages/mcp-servers/devtool-connector/src/transport/android.ts (2)
21-25: Consider makingKNOWNS_APPSconfigurable or documenting the limitation.The hardcoded
KNOWNS_APPSlist limitslistAvailableAppsto only return apps that are both installed AND in this predefined list. This design choice should be documented, or consider allowing the list to be extended via constructor options.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/android.ts` around lines 21 - 25, KNOWNS_APPS is a hardcoded whitelist that restricts listAvailableApps to only those entries; make this configurable or document the limitation: add an optional constructor parameter (e.g., knownApps?: App[]) to the AndroidTransport class so the default falls back to the existing KNOWNS_APPS but callers can pass an extended list, update listAvailableApps to use this.instanceKnownApps (or similar) instead of the module-level KNOWNS_APPS constant, and add a short code comment or README note explaining the whitelist behavior if you choose to keep the default hardcoded list.
142-182: Potential redundant ADB connection inopenApp.
openAppcallslistAvailableApps(deviceId)which creates an ADB connection via#createAdb, then immediately creates another ADB connection. This results in two sequential ADB connections for a single operation.♻️ Optimize to reuse ADB connection
Consider restructuring to reuse the ADB connection:
async openApp( deviceId: string, packageName: string, { withDataCleared }: OpenAppOptions = {}, ): Promise<void> { - const apps = await this.listAvailableApps(deviceId); await using adb = await this.#createAdb(deviceId); + // Check if package is available + const output = await adb.subprocess.noneProtocol.spawnWaitText([ + 'pm', 'list', 'packages', '-3', + ]); + const packages = new Set( + output.split('\n').map((line) => line.replace('package:', '').trim()).filter(i => i !== ''), + ); + if (!packages.has(packageName)) { - if (!apps.some((app) => app.packageName === packageName)) { throw new Error(`package ${packageName} not found`); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/android.ts` around lines 142 - 182, openApp currently calls listAvailableApps(deviceId) which itself opens an ADB connection, then calls `#createAdb` again, causing two sequential ADB connections; fix by reusing a single ADB connection: change listAvailableApps to accept an optional adb instance (e.g., listAvailableApps(deviceId, adb?) or a private helper that takes an adb) and update all call sites, then in openApp call const adb = await this.#createAdb(deviceId) once and pass that adb into listAvailableApps so only one connection is created; ensure resource disposal semantics (using/close) remain correct when listAvailableApps is given an external adb.packages/mcp-servers/devtool-mcp-server/src/index.ts (1)
158-167: Address the TODO or track it.The TODO comment suggests these exports should be moved to a separate path (
@lynx-js/devtool-mcp-server/transport). Consider creating an issue to track this if it's not addressed in this PR.Do you want me to open an issue to track moving the transport exports to a dedicated subpath?
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-mcp-server/src/index.ts` around lines 158 - 167, Create a tracked issue to move the transport exports (AndroidTransport, DesktopTransport, iOSTransport and type Transport) to the dedicated subpath `@lynx-js/devtool-mcp-server/transport`, then update the TODO in the export block in index.ts to reference that issue (e.g. "TODO: track move to #<issue-number>") so the work is tracked; locate the export block that currently re-exports from '@lynx-js/devtool-connector/transport' and replace the bare TODO comment with the issue reference.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.changeset/petite-bats-smell.md:
- Line 7: Fix the subject-verb agreement in the release-note sentence "The new
connector avoid using keep-alive connections, which make the connection much
more reliable." by changing "avoid" to "avoids" and "make" to "makes" so the
sentence reads "The new connector avoids using keep-alive connections, which
makes the connection much more reliable."
In `@packages/mcp-servers/devtool-connector/rslib.config.ts`:
- Around line 12-15: The export mappings currently point to source files under
./src; update the package exports so the root "." and the "transport/index"
export entries reference built output under ./dist: for both "." and
"transport/index" set "types" to "./dist/index.d.ts", "import" to
"./dist/index.js", and "default" to "./dist/index.js" (replace any "./src/..."
references with "./dist/index.js" and "./dist/index.d.ts"); ensure the package
export names match the existing entry keys ("index" / "transport/index") so
built artifacts are consumed instead of source.
In `@packages/mcp-servers/devtool-connector/src/AGENTS.md`:
- Around line 36-60: The AGENTS.md file references outdated paths like
src/connector/index.ts, src/connector/transport.ts, src/connector/android.ts,
src/connector/ios.ts and src/connector/*; update those entries to the current
layout (replace references to src/connector/* with src/index.ts, src/transport/*
and src/streams/*) and similarly adjust any mentions of connector classes (e.g.,
Connector, AndroidTransport, iOSTransport, Transport, ClientId, Session) so they
point to their new modules; ensure all path references in the document
(including the block under "Code Structure" and the references around lines
75-77) are consistent with the current source tree.
In `@packages/mcp-servers/devtool-connector/src/index.ts`:
- Around line 65-66: ClientId.deserialize currently uses Number.parseInt which
accepts partial numeric strings and doesn't enforce port range; update the logic
in ClientId.deserialize to first extract the portStr (the substring after
lastColonIndex), validate it matches /^\d+$/ (only digits), convert with
Number(portStr) (or parseInt after regex), ensure Number.isInteger(port) and
port is within valid TCP port range (0 <= port && port <= 65535, or 1..65535 if
you want to disallow 0), and return null if any check fails; keep the existing
variables (lastColonIndex, port) and flow but replace the loose parse/isNaN
check with these stricter validations.
- Around line 137-162: The loop in openApp() can exit because signal.aborted and
currently returns success even if no matching client was found; after the while
loop (which polls via this.#listClientsForDevice using packageName and deviceId
and respects signal), detect whether a matching client was ever found and if not
throw a meaningful error (e.g. an AbortError or timeout Error) that includes
packageName and deviceId instead of returning void; also if options?.signal was
aborted rethrow or translate that into an appropriate abort-specific error so
callers can distinguish timeout/abort from success.
- Around line 416-420: The code uses ReadableStream.from([...]) which is only
available in Node ≥20.6; replace both usages (the call passed into this.#connect
in index.ts and the similar call in transport/ios.ts) with a Node-18-compatible
ReadableStream construction: create a new ReadableStream with an underlying
source that enqueues the single input item(s) and closes (or convert a Node
Readable to a web stream via stream.Readable.toWeb if you already have a Node
stream), then pass that stream into this.#connect (and the transport function)
instead of ReadableStream.from to restore compatibility with Node 18–19.
In `@packages/mcp-servers/devtool-connector/src/streams/peertalk.ts`:
- Around line 25-45: Validate and cap the parsed frame length from DataView
v.getUint32(16) before trusting it: define a MAX_FRAME_SIZE constant and
reject/emit c.error when len is zero, negative, exceeds MAX_FRAME_SIZE, or when
20 + len would overflow Number or be absurdly larger than current memory
expectations; keep the existing buffer.length >= 20 check but also ensure the
header (20 bytes) is present before creating DataView, and handle decoding
errors as now. Additionally, when the stream/reader closes and buffer is
non-empty (trailing bytes remain), surface an error via c.error (or close the
controller) instead of silently dropping them so truncated-frame corruption is
reported; reference the variables buffer, v.getUint32(16), len, decoder, and
c.enqueue/c.error when making these changes.
In `@packages/mcp-servers/devtool-connector/src/takeover.ts`:
- Around line 20-38: The current takeoverDebugRouterLock always removes
DEBUG_ROUTER_LOCK_DIR in the finally block (undoing a successful takeover) and
swallows errors in the catch; change the logic so a successful takeover leaves
DEBUG_ROUTER_LOCK_DIR in place and errors are propagated: remove the finally
block, move the cleanup (await fs.rm(DEBUG_ROUTER_LOCK_DIR, ...)) into the catch
so you only remove the lock when an error occurs during mkdir/writeFile, log the
error with debug('skipped due to filesystem error %O', err) and then rethrow the
error so callers can react; keep references to DEBUG_ROUTER_DIR,
DEBUG_ROUTER_LOCK_DIR, DEBUG_ROUTER_LATEST_FILE, takeoverDebugRouterLock, and
the fs.mkdir/fs.writeFile/fs.rm calls to locate the edits.
In `@packages/mcp-servers/devtool-connector/src/transport/android.ts`:
- Around line 86-88: The returned socket wrapper masks a real type mismatch by
casting both socket.readable and socket.writable to never; update the code to
preserve correct types: keep socket.readable as ReadableStream<Uint8Array> and
adapt socket.writable so it satisfies Connection’s WritableStream<Uint8Array>
contract (either by transforming AdbSocket’s
WritableStream<MaybeConsumable<Uint8Array>> into a WritableStream<Uint8Array>
adapter or by widening the Connection interface to accept
MaybeConsumable<Uint8Array>), referencing the symbols socket.readable,
socket.writable, AdbSocket and Connection to locate the change and remove the
unsafe as never casts.
In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts`:
- Around line 52-55: The iOS transport wraps the web-readable stream
unnecessarily; change the return in the function using Duplex.toWeb(conn) by
returning the readable stream directly instead of wrapping it with
ReadableStream.from(). Specifically, remove ReadableStream.from() around the
value from Duplex.toWeb(conn) and return readable as-is (keep writable as
WritableStream<Uint8Array>), matching DesktopTransport and AndroidTransport
behavior.
In `@packages/mcp-servers/devtool-mcp-server/src/tools/Debugger/ListScripts.ts`:
- Around line 24-31: The call uses the browser ReadableStream.from API
(ReadableStream.from) which is only in Node >=20.6; replace it with Node's
stream.Readable.from to maintain Node >=18.19 compatibility: change the argument
to connector.sendCDPStream to use stream.Readable.from([...]) instead of
ReadableStream.from([...]) and add/import the Node 'stream' Readable symbol (or
destructure Readable) at the top of the file where ListScripts.ts uses
connector.sendCDPStream so the code compiles and runs on Node 18.19–20.5; update
any imports/exports referencing ReadableStream accordingly.
- Around line 54-56: The current push uses an unsafe cast "as never" for
value.params when value.method === 'Debugger.scriptParsed'; replace that cast by
performing an explicit type-narrowing/type-guard on value.params (e.g., check
for the expected fields such as scriptId/url/startLine or implement an
isScriptParsedParam(obj): obj is DebuggerScriptParsedParam) and only push after
the guard succeeds, so scripts receives a correctly typed object; locate the
check in the ListScripts logic where value.method and value.params are inspected
and replace the cast with the guard + typed push to preserve strict type safety.
In `@packages/mcp-servers/devtool-mcp-server/src/tools/Device/OpenPage.ts`:
- Around line 22-38: The catch-all fallback can cause duplicate opens; modify
the catch block after connector.sendAppMessage (the App.openPage attempt) to
only execute the fallback connector.sendMessage when the caught error clearly
indicates the remote method is unsupported or explicitly failed (e.g. check
error.code or error.message for "not_supported", "method_not_found",
"Unsupported", etc.); otherwise rethrow the error so local/transport timeouts or
parse/stream interruptions don't trigger the fallback. Reference
connector.sendAppMessage, the 'App.openPage' call, and connector.sendMessage
(fallback) when implementing the conditional guard.
In `@packages/mcp-servers/devtool-mcp-server/src/tools/Page/TakeScreenshot.ts`:
- Around line 30-34: The use of ReadableStream.from in TakeScreenshot.ts is
incompatible with Node 18; change the construction passed to
connector.sendCDPStream so it uses a compatibility-safe ReadableStream (manual
constructor) or a Node Readable instead of ReadableStream.from. Locate the call
to connector.sendCDPStream in the TakeScreenshot flow (the array item with {
method: 'Lynx.getScreenshot', sessionId: params.sessionId }) and replace the
ReadableStream.from(...) invocation with a manually constructed ReadableStream
that enqueues that single message in start() (or use stream.Readable from
'stream' to push the same payload) so the code runs on Node.js 18.x.
---
Nitpick comments:
In `@packages/mcp-servers/devtool-connector/src/transport/android.ts`:
- Around line 21-25: KNOWNS_APPS is a hardcoded whitelist that restricts
listAvailableApps to only those entries; make this configurable or document the
limitation: add an optional constructor parameter (e.g., knownApps?: App[]) to
the AndroidTransport class so the default falls back to the existing KNOWNS_APPS
but callers can pass an extended list, update listAvailableApps to use
this.instanceKnownApps (or similar) instead of the module-level KNOWNS_APPS
constant, and add a short code comment or README note explaining the whitelist
behavior if you choose to keep the default hardcoded list.
- Around line 142-182: openApp currently calls listAvailableApps(deviceId) which
itself opens an ADB connection, then calls `#createAdb` again, causing two
sequential ADB connections; fix by reusing a single ADB connection: change
listAvailableApps to accept an optional adb instance (e.g.,
listAvailableApps(deviceId, adb?) or a private helper that takes an adb) and
update all call sites, then in openApp call const adb = await
this.#createAdb(deviceId) once and pass that adb into listAvailableApps so only
one connection is created; ensure resource disposal semantics (using/close)
remain correct when listAvailableApps is given an external adb.
In `@packages/mcp-servers/devtool-connector/src/transport/desktop.ts`:
- Around line 51-61: The current connection logic uses net.createConnection with
a signal but lacks an explicit abort listener and has an empty else branch;
update the connect wait in the function that creates the `socket` (using
`net.createConnection`) to first check `if (signal?.aborted)` and throw an
appropriate AbortError, then when awaiting the connect event attach an abort
listener (e.g., `signal.addEventListener('abort', ...)`) that cleans up the
socket (call `socket.destroy()` or `socket.end()`) and rejects the pending
promise with the abort reason; also remove the empty else branch and simplify to
await the connect promise only when `socket.connecting` is true, ensuring you
remove the abort listener on success or error to avoid leaks.
In `@packages/mcp-servers/devtool-connector/src/types.ts`:
- Around line 63-67: The Session interface declares type: '' which is a string
literal type and likely unintended; update the Session.type declaration in the
Session interface to a meaningful type (e.g., a descriptive string literal union
like 'http' | 'ws' | 'ssh' or simply string) or add a clarifying comment if the
empty literal is intentional; modify the interface definition for Session
(property name: type) accordingly and ensure any usages or tests that depend on
Session.type are adjusted to match the new type.
- Around line 80-84: GetGlobalSwitchResponse currently allows message to be
string | boolean | { global_value: string | boolean }, which leads to
inconsistent handling; update the type and code to normalize the shape (e.g.,
always expose a stable field) or add a documented union alias explaining each
variant. Specifically, either modify GetGlobalSwitchResponse to use a normalized
shape like { global_value: string | boolean } (and update consumers of
GetGlobalSwitchResponse accordingly) or define a named union type (e.g., type
GlobalSwitchMessage = string | boolean | { global_value: string | boolean })
with a clear comment describing when each variant is used, and refactor places
that read message (search for GetGlobalSwitchResponse and usages) to handle the
normalized shape or discriminate the union safely.
In `@packages/mcp-servers/devtool-mcp-server/src/index.ts`:
- Around line 158-167: Create a tracked issue to move the transport exports
(AndroidTransport, DesktopTransport, iOSTransport and type Transport) to the
dedicated subpath `@lynx-js/devtool-mcp-server/transport`, then update the TODO in
the export block in index.ts to reference that issue (e.g. "TODO: track move to
#<issue-number>") so the work is tracked; locate the export block that currently
re-exports from '@lynx-js/devtool-connector/transport' and replace the bare TODO
comment with the issue reference.
ℹ️ Review info
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (43)
.changeset/petite-bats-smell.md.changeset/three-geese-study.mdpackages/mcp-servers/devtool-connector/eslint.config.jspackages/mcp-servers/devtool-connector/package.jsonpackages/mcp-servers/devtool-connector/rslib.config.tspackages/mcp-servers/devtool-connector/src/AGENTS.mdpackages/mcp-servers/devtool-connector/src/index.tspackages/mcp-servers/devtool-connector/src/streams/cdp.tspackages/mcp-servers/devtool-connector/src/streams/customized.tspackages/mcp-servers/devtool-connector/src/streams/peertalk.tspackages/mcp-servers/devtool-connector/src/streams/utils.tspackages/mcp-servers/devtool-connector/src/takeover.tspackages/mcp-servers/devtool-connector/src/transport/android.tspackages/mcp-servers/devtool-connector/src/transport/desktop.tspackages/mcp-servers/devtool-connector/src/transport/index.tspackages/mcp-servers/devtool-connector/src/transport/ios.tspackages/mcp-servers/devtool-connector/src/transport/transport.tspackages/mcp-servers/devtool-connector/src/types.tspackages/mcp-servers/devtool-connector/tsconfig.jsonpackages/mcp-servers/devtool-mcp-server/debug-router-connector.d.tspackages/mcp-servers/devtool-mcp-server/debug-router-connector.jspackages/mcp-servers/devtool-mcp-server/package.jsonpackages/mcp-servers/devtool-mcp-server/src/McpContext.tspackages/mcp-servers/devtool-mcp-server/src/McpResponse.tspackages/mcp-servers/devtool-mcp-server/src/connector.tspackages/mcp-servers/devtool-mcp-server/src/index.tspackages/mcp-servers/devtool-mcp-server/src/main.tspackages/mcp-servers/devtool-mcp-server/src/schema/index.tspackages/mcp-servers/devtool-mcp-server/src/tools/DOM/GetBoxModel.tspackages/mcp-servers/devtool-mcp-server/src/tools/DOM/GetDocument.tspackages/mcp-servers/devtool-mcp-server/src/tools/Debugger/GetScriptSource.tspackages/mcp-servers/devtool-mcp-server/src/tools/Debugger/ListScripts.tspackages/mcp-servers/devtool-mcp-server/src/tools/Device/ClosePage.tspackages/mcp-servers/devtool-mcp-server/src/tools/Device/ListClients.tspackages/mcp-servers/devtool-mcp-server/src/tools/Device/ListDevices.tspackages/mcp-servers/devtool-mcp-server/src/tools/Device/ListSessions.tspackages/mcp-servers/devtool-mcp-server/src/tools/Device/OpenPage.tspackages/mcp-servers/devtool-mcp-server/src/tools/Device/Reconnect.tspackages/mcp-servers/devtool-mcp-server/src/tools/Page/TakeScreenshot.tspackages/mcp-servers/devtool-mcp-server/src/tools/Runtime/ListConsole.tspackages/mcp-servers/devtool-mcp-server/src/tools/defineTool.tspackages/mcp-servers/devtool-mcp-server/tsconfig.jsonpnpm-workspace.yaml
💤 Files with no reviewable changes (4)
- packages/mcp-servers/devtool-mcp-server/debug-router-connector.js
- packages/mcp-servers/devtool-mcp-server/src/tools/Device/Reconnect.ts
- packages/mcp-servers/devtool-mcp-server/src/connector.ts
- packages/mcp-servers/devtool-mcp-server/debug-router-connector.d.ts
packages/mcp-servers/devtool-mcp-server/src/tools/Debugger/ListScripts.ts
Show resolved
Hide resolved
packages/mcp-servers/devtool-mcp-server/src/tools/Debugger/ListScripts.ts
Show resolved
Hide resolved
packages/mcp-servers/devtool-mcp-server/src/tools/Page/TakeScreenshot.ts
Show resolved
Hide resolved
Web Explorer#7911 Bundle Size — 383.67KiB (0%).31c24d9(current) vs 06ff838 main#7900(baseline) Bundle metrics
Bundle size by type
|
| Current #7911 |
Baseline #7900 |
|
|---|---|---|
252.72KiB |
252.72KiB |
|
95.85KiB |
95.85KiB |
|
35.09KiB |
35.09KiB |
Bundle analysis report Branch colinaaa:colin/0302/devtool-conn... Project dashboard
Generated by RelativeCI Documentation Report issue
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (1)
packages/mcp-servers/devtool-connector/src/transport/android.ts (1)
84-86:⚠️ Potential issue | 🔴 CriticalRemove unsafe
as nevercasts on returned streams.Line 85 and Line 86 suppress real type checking and can hide invalid stream writes. Keep
readabletyped directly and adaptwritable(or widen theConnectioncontract) instead of forcingnever.🛠️ Suggested direction
- return { - readable: socket.readable as never, - writable: socket.writable as never, + // Keep `readable` as-is, and adapt `writable` to the `Connection` contract. + const writer = socket.writable.getWriter(); + const writable = new WritableStream<Uint8Array>({ + write: (chunk) => writer.write(chunk), + close: () => writer.close(), + abort: (reason) => writer.abort(reason), + }); + + return { + readable: socket.readable, + writable, async [Symbol.asyncDispose]() { + writer.releaseLock(); signal?.removeEventListener('abort', abortHandler); debug( `connect: close connection to deviceId: ${deviceId}, port: ${port}`,In `@yume-chan/adb`’s current TypeScript definitions, what is the exact type of AdbSocket.writable, and is WritableStream<MaybeConsumable<Uint8Array>> assignable to WritableStream<Uint8Array> in strict mode?As per coding guidelines,
**/*.{ts,tsx}: Use TypeScript with the strictest mode configuration as defined in tsconfig.json.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/android.ts` around lines 84 - 86, Remove the unsafe "as never" casts on the returned streams: return socket.readable and socket.writable with proper types instead of forcing never. Update the code that returns { readable, writable } (the readable and writable properties coming from AdbSocket) so readable is passed directly and writable is typed compatibly — either narrow/convert AdbSocket.writable to the exact WritableStream<Uint8Array> expected by the Connection contract or widen the Connection.writable type to accept WritableStream<MaybeConsumable<Uint8Array>> (or the union/generic that matches `@yume-chan/adb`’s AdbSocket.writable). Refer to the symbols readable, writable, AdbSocket.writable and the Connection type when making this change and remove both "as never" casts.
🧹 Nitpick comments (2)
.changeset/petite-bats-smell.md (1)
1-7: Consider adding explicit BREAKING CHANGE callout and migration guidance.While the changeset correctly documents the connector change and the PR title includes the
!breaking change indicator, the release notes would be more helpful to users if they explicitly called out the breaking nature and provided migration steps. Users reading the changelog should understand what code changes are required when upgrading.Consider adding a section that clarifies this is a breaking change and what users need to update in their code (e.g., import paths, API usage changes, configuration adjustments).
📝 Example enhanced changeset structure
--- "@lynx-js/devtool-mcp-server": minor --- +**BREAKING CHANGE**: Migrate from `@lynx-js/debug-router-connector` to `@lynx-js/devtool-connector`. + +Migration steps: +- Update imports from `@lynx-js/debug-router-connector` to `@lynx-js/devtool-connector` +- Replace `DebugRouterConnector` usage with the new `Connector` API +- [Add any other specific migration steps] + -Use `@lynx-js/devtool-connector` instead of `@lynx-js/debug-router-connector`. - The new connector avoids using keep-alive connections, which makes the connection much more reliable.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.changeset/petite-bats-smell.md around lines 1 - 7, Update the changeset to include an explicit "BREAKING CHANGE" callout and short migration guidance: state that "@lynx-js/devtool-mcp-server" now uses "@lynx-js/devtool-connector" (replacing "@lynx-js/debug-router-connector"), list the minimal code changes users must make (update import paths, replace any connector-specific API or config options tied to keep-alive behavior, and note known config keys that changed or were removed), and provide an example migration bullet (import swap + any config flag adjustments) so consumers know exactly what to change when upgrading; reference the package name "@lynx-js/devtool-mcp-server" and the connector names in the text so it's unambiguous.packages/mcp-servers/devtool-connector/src/transport/ios.ts (1)
83-89: Use explicit unsupported-operation errors.
Error('Not implemented')is too generic for debugging transport routing failures. Include platform + method names in the message.✏️ Suggested refinement
listAvailableApps(): Promise<App[]> { - throw new Error('Not implemented'); + throw new Error('iOSTransport.listAvailableApps is not supported yet'); } openApp(): Promise<void> { - throw new Error('Not implemented'); + throw new Error('iOSTransport.openApp is not supported yet'); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts` around lines 83 - 89, Replace the generic throws in listAvailableApps and openApp with explicit unsupported-operation errors that include the platform and method names (e.g., throw new Error("iOS: listAvailableApps is not supported") or use a shared UnsupportedOperationError and instantiate it as new UnsupportedOperationError("iOS", "openApp")). Update both listAvailableApps and openApp in ios.ts to throw these descriptive errors so transport routing failures clearly identify the platform and method.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/mcp-servers/devtool-connector/src/transport/android.ts`:
- Around line 140-170: openApp currently accepts OpenAppOptions but ignores
options.signal; propagate the AbortSignal through the call chain by: accept
const { withDataCleared, signal } = options in openApp, pass signal into
this.listAvailableApps(deviceId, { signal }) and into both
adb.subprocess.noneProtocol.spawnWaitText calls (pm clear and monkey) so the adb
subprocess calls are abortable, and ensure any AbortError from those calls is
allowed to surface (or translated) so the method cancels promptly when
signal.aborted; reference function openApp, method listAvailableApps, and the
two spawnWaitText invocations on adb.subprocess.noneProtocol.
In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts`:
- Around line 41-50: The connect() implementation currently checks
signal.aborted and calls signal.throwIfAborted() before registering the abort
listener, leaving a race where an abort could occur before the listener is
attached; fix it by registering the abortHandler (the listener that calls
conn.destroy()) on signal first, then immediately check signal.aborted and call
signal.throwIfAborted() (and if already aborted ensure conn.destroy() was
invoked and listener cleaned up), and apply the identical change in android.ts
so both platforms attach the abort listener before testing/throwing on the
signal.
- Around line 70-71: The code uses the new "await using" and Symbol.asyncDispose
(e.g., in the connect() / callback usage) which requires Node ≥20.13; either
update package.json to "node": ">=20.13" or refactor to remove "await using":
replace patterns like "await using conn = await this.connect(options); return
await callback(conn);" with an explicit try/finally that acquires the resource
via connect(), calls callback(conn) in the try block, and then calls the
resource's cleanup method (e.g., conn.dispose() or conn.close()) in finally;
also remove or guard uses of Symbol.asyncDispose throughout (or implement a
manual dispose method) so the code runs on Node 18.19–20.12.
---
Duplicate comments:
In `@packages/mcp-servers/devtool-connector/src/transport/android.ts`:
- Around line 84-86: Remove the unsafe "as never" casts on the returned streams:
return socket.readable and socket.writable with proper types instead of forcing
never. Update the code that returns { readable, writable } (the readable and
writable properties coming from AdbSocket) so readable is passed directly and
writable is typed compatibly — either narrow/convert AdbSocket.writable to the
exact WritableStream<Uint8Array> expected by the Connection contract or widen
the Connection.writable type to accept
WritableStream<MaybeConsumable<Uint8Array>> (or the union/generic that matches
`@yume-chan/adb`’s AdbSocket.writable). Refer to the symbols readable, writable,
AdbSocket.writable and the Connection type when making this change and remove
both "as never" casts.
---
Nitpick comments:
In @.changeset/petite-bats-smell.md:
- Around line 1-7: Update the changeset to include an explicit "BREAKING CHANGE"
callout and short migration guidance: state that "@lynx-js/devtool-mcp-server"
now uses "@lynx-js/devtool-connector" (replacing
"@lynx-js/debug-router-connector"), list the minimal code changes users must
make (update import paths, replace any connector-specific API or config options
tied to keep-alive behavior, and note known config keys that changed or were
removed), and provide an example migration bullet (import swap + any config flag
adjustments) so consumers know exactly what to change when upgrading; reference
the package name "@lynx-js/devtool-mcp-server" and the connector names in the
text so it's unambiguous.
In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts`:
- Around line 83-89: Replace the generic throws in listAvailableApps and openApp
with explicit unsupported-operation errors that include the platform and method
names (e.g., throw new Error("iOS: listAvailableApps is not supported") or use a
shared UnsupportedOperationError and instantiate it as new
UnsupportedOperationError("iOS", "openApp")). Update both listAvailableApps and
openApp in ios.ts to throw these descriptive errors so transport routing
failures clearly identify the platform and method.
ℹ️ Review info
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (4)
.changeset/petite-bats-smell.mdpackages/mcp-servers/devtool-connector/src/AGENTS.mdpackages/mcp-servers/devtool-connector/src/transport/android.tspackages/mcp-servers/devtool-connector/src/transport/ios.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- packages/mcp-servers/devtool-connector/src/AGENTS.md
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (3)
packages/mcp-servers/devtool-connector/src/transport/android.ts (2)
140-170:⚠️ Potential issue | 🟠 MajorHonor
OpenAppOptions.signalthroughoutopenApp.Line 143 accepts
OpenAppOptions, but cancellation is not used. This makesopenAppnon-interruptible during app listing/launch flow.Proposed fix
async openApp( deviceId: string, packageName: string, - { withDataCleared }: OpenAppOptions = {}, + { withDataCleared, signal }: OpenAppOptions = {}, ): Promise<void> { + signal?.throwIfAborted(); const apps = await this.listAvailableApps(deviceId); + signal?.throwIfAborted(); await using adb = await this.#createAdb(deviceId); if (!apps.some((app) => app.packageName === packageName)) { throw new Error(`package ${packageName} not found`); } if (withDataCleared) { + signal?.throwIfAborted(); const output = await adb.subprocess.noneProtocol.spawnWaitText([ // adb shell pm clear <package_name> 'pm', 'clear', packageName, ]); debug(`openApp clear data output ${output}`); } + signal?.throwIfAborted(); const output = await adb.subprocess.noneProtocol.spawnWaitText([🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/android.ts` around lines 140 - 170, openApp accepts OpenAppOptions but ignores the optional signal; make the method honor cancellation by checking options.signal (abort early if signal?.aborted) and passing the signal into any async operations: forward it to listAvailableApps(deviceId, { signal }), to `#createAdb`(deviceId, { signal }) (or cancel the returned adb setup if supported), and into both adb.subprocess.noneProtocol.spawnWaitText(...) calls so they become abortable; also ensure any awaited promises are wrapped to throw on abort so openApp stops promptly when the provided signal is triggered.
84-86:⚠️ Potential issue | 🟠 MajorRemove unsafe
as nevercasts inconnectreturn value.Line 85 and Line 86 currently suppress a real stream type incompatibility instead of modeling it safely. This weakens strict mode guarantees and can hide invalid write payloads.
Proposed fix
- return { - readable: socket.readable as never, - writable: socket.writable as never, + const writable = new WritableStream<Uint8Array>({ + async write(chunk) { + const writer = socket.writable.getWriter(); + try { + await writer.write(chunk); + } finally { + writer.releaseLock(); + } + }, + async close() { + await socket.close(); + }, + async abort() { + await socket.close(); + }, + }); + + return { + readable: socket.readable, + writable, async [Symbol.asyncDispose]() {As per coding guidelines "
**/*.{ts,tsx}: Use TypeScript with the strictest mode configuration as defined in tsconfig.json".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/android.ts` around lines 84 - 86, The return in connect uses unsafe "as never" casts for socket.readable and socket.writable which hides real type mismatches; remove those casts and either adjust the connect signature to accept the socket's actual stream types or adapt/wrap socket.readable and socket.writable into the expected types (e.g., convert to ReadableStream<Uint8Array>/WritableStream<Uint8Array> or a Duplex-like interface) before returning. Locate the connect function and the return object that references socket.readable and socket.writable, and: 1) change the function return type to match socket.readable/socket.writable types, or 2) create minimal safe adapters that transform socket.readable and socket.writable into the expected stream types (preserving chunk type and backpressure) and return those adapters instead of using "as never".packages/mcp-servers/devtool-connector/src/transport/ios.ts (1)
47-50:⚠️ Potential issue | 🟠 MajorClean up the abort listener before throwing on already-aborted signals.
At Line 47-50,
throwIfAborted()throws without removing the listener added at Line 45. If the signal was already aborted before registration, that listener won’t auto-fire and can retainconnvia closure.🔧 Proposed fix
if (signal?.aborted) { - conn.destroy(); - signal.throwIfAborted(); + abortHandler(); + signal.removeEventListener('abort', abortHandler); + signal.throwIfAborted(); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts` around lines 47 - 50, The abort handler currently can be retained when signal is already aborted because throwIfAborted() is called after registering a closure that captures conn; modify the logic around the signal listener in ios.ts so the abort listener is removed before throwing or avoid registering it at all if signal.aborted is true: capture the listener (e.g., onAbort) when calling signal.addEventListener('abort', onAbort), call signal.removeEventListener('abort', onAbort) prior to calling signal.throwIfAborted(), and ensure conn.destroy() is still invoked; alternatively, check signal?.aborted first and skip addEventListener entirely to prevent retaining conn.
🧹 Nitpick comments (1)
packages/mcp-servers/devtool-connector/src/transport/ios.ts (1)
20-20: Use a connector-scoped debug namespace for consistency.
devtool-mcp-server:connector:ioslooks copy-pasted from another package; using adevtool-connector:*prefix will make filtering and tracing cleaner.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts` at line 20, The debug namespace string passed to createDebug in ios.ts should use the connector-scoped prefix; update the createDebug call that assigns const debug (createDebug('devtool-mcp-server:connector:ios')) to use 'devtool-connector:ios' (or the agreed connector prefix) so the debug namespace is consistent across the connector package.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/mcp-servers/devtool-connector/package.json`:
- Around line 27-38: The listed runtime packages are currently in
devDependencies but are imported by the built code; move "@yume-chan/adb",
"@yume-chan/adb-server-node-tcp", "debug", and "usbmux-client" out of
"devDependencies" and add them under "dependencies" in package.json (keeping the
same version specifiers). Update the package.json so "dependencies" contains
those four entries and remove them from "devDependencies" to ensure downstream
consumers installing the published package get these runtime modules.
- Around line 20-22: The package.json currently lists runtime-used packages
under devDependencies, causing missing modules for consumers; move the runtime
imports (at least debug, `@yume-chan/adb`, `@yume-chan/adb-server-node-tcp`,
usbmux-client and any other modules imported by android.ts, ios.ts, index.ts)
into dependencies, leaving true dev-only items (e.g., `@types/node`, typescript,
rsbuild-plugin-publint, and any CLI-only commander usage if truly not imported
at runtime) in devDependencies; update package.json so dependencies contains
those runtime packages and ensure no runtime import remains listed only under
devDependencies.
In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts`:
- Around line 84-89: The method signatures in ios.ts do not match the Transport
interface: update listAvailableApps to accept (deviceId: string): Promise<App[]>
and update openApp to accept (deviceId: string, packageName: string, options?:
Record<string, any>): Promise<void> (or the exact option type used in the
Transport interface) while keeping the current throw new Error('Not
implemented') bodies; ensure the parameter names match those in the Transport
interface so type-checking passes for listAvailableApps and openApp.
---
Duplicate comments:
In `@packages/mcp-servers/devtool-connector/src/transport/android.ts`:
- Around line 140-170: openApp accepts OpenAppOptions but ignores the optional
signal; make the method honor cancellation by checking options.signal (abort
early if signal?.aborted) and passing the signal into any async operations:
forward it to listAvailableApps(deviceId, { signal }), to `#createAdb`(deviceId, {
signal }) (or cancel the returned adb setup if supported), and into both
adb.subprocess.noneProtocol.spawnWaitText(...) calls so they become abortable;
also ensure any awaited promises are wrapped to throw on abort so openApp stops
promptly when the provided signal is triggered.
- Around line 84-86: The return in connect uses unsafe "as never" casts for
socket.readable and socket.writable which hides real type mismatches; remove
those casts and either adjust the connect signature to accept the socket's
actual stream types or adapt/wrap socket.readable and socket.writable into the
expected types (e.g., convert to
ReadableStream<Uint8Array>/WritableStream<Uint8Array> or a Duplex-like
interface) before returning. Locate the connect function and the return object
that references socket.readable and socket.writable, and: 1) change the function
return type to match socket.readable/socket.writable types, or 2) create minimal
safe adapters that transform socket.readable and socket.writable into the
expected stream types (preserving chunk type and backpressure) and return those
adapters instead of using "as never".
In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts`:
- Around line 47-50: The abort handler currently can be retained when signal is
already aborted because throwIfAborted() is called after registering a closure
that captures conn; modify the logic around the signal listener in ios.ts so the
abort listener is removed before throwing or avoid registering it at all if
signal.aborted is true: capture the listener (e.g., onAbort) when calling
signal.addEventListener('abort', onAbort), call
signal.removeEventListener('abort', onAbort) prior to calling
signal.throwIfAborted(), and ensure conn.destroy() is still invoked;
alternatively, check signal?.aborted first and skip addEventListener entirely to
prevent retaining conn.
---
Nitpick comments:
In `@packages/mcp-servers/devtool-connector/src/transport/ios.ts`:
- Line 20: The debug namespace string passed to createDebug in ios.ts should use
the connector-scoped prefix; update the createDebug call that assigns const
debug (createDebug('devtool-mcp-server:connector:ios')) to use
'devtool-connector:ios' (or the agreed connector prefix) so the debug namespace
is consistent across the connector package.
ℹ️ Review info
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (3)
packages/mcp-servers/devtool-connector/package.jsonpackages/mcp-servers/devtool-connector/src/transport/android.tspackages/mcp-servers/devtool-connector/src/transport/ios.ts
Merging this PR will degrade performance by 5.75%
Performance Changes
Comparing Footnotes
|
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @lynx-js/devtool-mcp-server@0.5.0 ### Minor Changes - Use `@lynx-js/devtool-connector` instead of `@lynx-js/debug-router-connector`. ([#2284](#2284)) The new connector avoids using keep-alive connections, which makes the connection much more reliable. - **BREAKING CHANGE**: Remove the `./debug-router-connector` exports. ([#2284](#2284)) ## @lynx-js/web-elements@0.12.0 ### Minor Changes - feat: add `willchange` event to `x-viewpager-ng` ([#2305](#2305)) ### Patch Changes - fix: firefox `@supports(width:1rex)` ([#2288](#2288)) - fix: check computed overflow style in `getTheMostScrollableKid` to avoid treating `overflow: visible` elements as scroll containers ([#2309](#2309)) - fix: the inline-truncation should only work as a direct child of x-text ([#2287](#2287)) - fix: getVisibleCells cannot work in firefox due to contentvisibilityautostatechange not propagate list-item ([#2308](#2308)) - fix: foldview stuck issue ([#2304](#2304)) ## @lynx-js/gesture-runtime@2.1.3 ### Patch Changes - Optimize gesture callbacks and relationships to prevent unnecessary gesture registration and rerenders. ([#2277](#2277)) ## @lynx-js/react@0.116.5 ### Patch Changes - Improve React runtime hook profiling. ([#2235](#2235)) Enable Profiling recording first, then enter the target page so the trace includes full render/hydrate phases. - Record trace events for `useEffect` / `useLayoutEffect` hook entry, callback, and cleanup phases. - Log trace events for `useState` setter calls. - Wire `profileFlowId` support in debug profile utilities and attach flow IDs to related hook traces. - Instrument hydrate/background snapshot profiling around patch operations with richer args (e.g. snapshot id/type, dynamic part index, value type, and source when available). - Capture vnode source mapping in dev and use it in profiling args to improve trace attribution. - Expand debug test coverage for profile utilities, hook profiling behavior, vnode source mapping, and hydrate profiling branches. - refactor: call loadWorkletRuntime once in each module ([#2315](#2315)) ## @lynx-js/rspeedy@0.13.5 ### Patch Changes - feat: opt-in the web platform's new binary output format ([#2281](#2281)) Introduce a new flag to enable the new binary output format. Currently it's an internal-use-only flag that will be removed in the future; set the corresponding environment variable to 'true' to enable it. - Avoid generating `Rsbuild vundefined` in greeting message. ([#2275](#2275)) - Updated dependencies \[]: - @lynx-js/web-rsbuild-server-middleware@0.19.8 ## @lynx-js/lynx-bundle-rslib-config@0.2.2 ### Patch Changes - Support bundle and load css in external bundle ([#2143](#2143)) ## @lynx-js/external-bundle-rsbuild-plugin@0.0.3 ### Patch Changes - Updated dependencies \[[`c28b051`](c28b051), [`4cbf809`](4cbf809)]: - @lynx-js/externals-loading-webpack-plugin@0.0.4 ## @lynx-js/react-rsbuild-plugin@0.12.10 ### Patch Changes - Support bundle and load css in external bundle ([#2143](#2143)) - Updated dependencies \[[`59f2933`](59f2933), [`453e006`](453e006)]: - @lynx-js/template-webpack-plugin@0.10.5 - @lynx-js/css-extract-webpack-plugin@0.7.0 - @lynx-js/react-webpack-plugin@0.7.4 - @lynx-js/react-alias-rsbuild-plugin@0.12.10 - @lynx-js/use-sync-external-store@1.5.0 - @lynx-js/react-refresh-webpack-plugin@0.3.4 ## @lynx-js/web-core-wasm@0.0.5 ### Patch Changes - Updated dependencies \[[`4963907`](4963907), [`8fd936a`](8fd936a), [`0d41253`](0d41253), [`d32c4c6`](d32c4c6), [`7518b72`](7518b72), [`fca9d4a`](fca9d4a)]: - @lynx-js/web-elements@0.12.0 ## @lynx-js/externals-loading-webpack-plugin@0.0.4 ### Patch Changes - perf: optimize external bundle loading by merging multiple `fetchBundle` calls for the same URL into a single request. ([#2307](#2307)) - Support bundle and load css in external bundle ([#2143](#2143)) ## @lynx-js/template-webpack-plugin@0.10.5 ### Patch Changes - feat: allow `templateDebugUrl` to be customized via `output.publicPath` or the `beforeEncode` hook. ([#2274](#2274)) - feat: opt-in the web platform's new binary output format ([#2281](#2281)) Introduce a new flag to enable the new binary output format. Currently it's an internal-use-only flag that will be removed in the future; set the corresponding environment variable to 'true' to enable it. - Updated dependencies \[]: - @lynx-js/web-core-wasm@0.0.5 ## create-rspeedy@0.13.5 ## @lynx-js/react-alias-rsbuild-plugin@0.12.10 ## upgrade-rspeedy@0.13.5 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit
New Features
Improvements
Documentation
Breaking Changes
Checklist