react-native-mcp-kit 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -17
- package/dist/bin/ios-hid +0 -0
- package/dist/client/core/McpClient.d.ts +2 -0
- package/dist/client/core/McpClient.d.ts.map +1 -1
- package/dist/client/core/McpClient.js +33 -0
- package/dist/client/core/McpClient.js.map +1 -1
- package/dist/modules/console/console.d.ts.map +1 -1
- package/dist/modules/console/console.js +78 -49
- package/dist/modules/console/console.js.map +1 -1
- package/dist/modules/errors/errors.d.ts.map +1 -1
- package/dist/modules/errors/errors.js +58 -39
- package/dist/modules/errors/errors.js.map +1 -1
- package/dist/modules/fiberTree/fiberTree.d.ts.map +1 -1
- package/dist/modules/fiberTree/fiberTree.js +144 -61
- package/dist/modules/fiberTree/fiberTree.js.map +1 -1
- package/dist/modules/logBox/logBox.d.ts.map +1 -1
- package/dist/modules/logBox/logBox.js +8 -9
- package/dist/modules/logBox/logBox.js.map +1 -1
- package/dist/modules/navigation/navigation.d.ts.map +1 -1
- package/dist/modules/navigation/navigation.js +12 -9
- package/dist/modules/navigation/navigation.js.map +1 -1
- package/dist/modules/network/network.d.ts.map +1 -1
- package/dist/modules/network/network.js +76 -36
- package/dist/modules/network/network.js.map +1 -1
- package/dist/server/bridge.d.ts +2 -1
- package/dist/server/bridge.d.ts.map +1 -1
- package/dist/server/bridge.js +1 -0
- package/dist/server/bridge.js.map +1 -1
- package/dist/server/cli.js +2 -1
- package/dist/server/cli.js.map +1 -1
- package/dist/server/host/hostModule.d.ts.map +1 -1
- package/dist/server/host/hostModule.js +0 -2
- package/dist/server/host/hostModule.js.map +1 -1
- package/dist/server/host/tools/symbolicate.d.ts.map +1 -1
- package/dist/server/host/tools/symbolicate.js +13 -3
- package/dist/server/host/tools/symbolicate.js.map +1 -1
- package/dist/server/mcpServer.d.ts.map +1 -1
- package/dist/server/mcpServer.js +11 -10
- package/dist/server/mcpServer.js.map +1 -1
- package/dist/server/metro/eventCapture.d.ts +41 -0
- package/dist/server/metro/eventCapture.d.ts.map +1 -0
- package/dist/server/metro/eventCapture.js +138 -0
- package/dist/server/metro/eventCapture.js.map +1 -0
- package/dist/server/metro/index.d.ts +2 -0
- package/dist/server/metro/index.d.ts.map +1 -0
- package/dist/server/metro/index.js +6 -0
- package/dist/server/metro/index.js.map +1 -0
- package/dist/server/metro/metroModule.d.ts +3 -0
- package/dist/server/metro/metroModule.d.ts.map +1 -0
- package/dist/server/metro/metroModule.js +25 -0
- package/dist/server/metro/metroModule.js.map +1 -0
- package/dist/server/metro/resolveMetroUrl.d.ts +12 -0
- package/dist/server/metro/resolveMetroUrl.d.ts.map +1 -0
- package/dist/server/metro/resolveMetroUrl.js +23 -0
- package/dist/server/metro/resolveMetroUrl.js.map +1 -0
- package/dist/server/metro/tools/events.d.ts +3 -0
- package/dist/server/metro/tools/events.d.ts.map +1 -0
- package/dist/server/metro/tools/events.js +51 -0
- package/dist/server/metro/tools/events.js.map +1 -0
- package/dist/server/metro/tools/openInEditor.d.ts +3 -0
- package/dist/server/metro/tools/openInEditor.d.ts.map +1 -0
- package/dist/server/metro/tools/openInEditor.js +89 -0
- package/dist/server/metro/tools/openInEditor.js.map +1 -0
- package/dist/server/metro/tools/openUrl.d.ts +3 -0
- package/dist/server/metro/tools/openUrl.d.ts.map +1 -0
- package/dist/server/metro/tools/openUrl.js +71 -0
- package/dist/server/metro/tools/openUrl.js.map +1 -0
- package/dist/server/metro/tools/reload.d.ts +3 -0
- package/dist/server/metro/tools/reload.d.ts.map +1 -0
- package/dist/server/metro/tools/reload.js +53 -0
- package/dist/server/metro/tools/reload.js.map +1 -0
- package/dist/server/metro/tools/status.d.ts +3 -0
- package/dist/server/metro/tools/status.d.ts.map +1 -0
- package/dist/server/metro/tools/status.js +52 -0
- package/dist/server/metro/tools/status.js.map +1 -0
- package/dist/server/metro/tools/symbolicate.d.ts +3 -0
- package/dist/server/metro/tools/symbolicate.d.ts.map +1 -0
- package/dist/server/metro/tools/symbolicate.js +203 -0
- package/dist/server/metro/tools/symbolicate.js.map +1 -0
- package/dist/shared/protocol.d.ts +14 -0
- package/dist/shared/protocol.d.ts.map +1 -1
- package/dist/shared/slice.d.ts +16 -0
- package/dist/shared/slice.d.ts.map +1 -0
- package/dist/shared/slice.js +29 -0
- package/dist/shared/slice.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,15 +14,17 @@ AI Agent / Cursor / Claude Code --stdio/MCP--> Node server --WebSocket--> RN app
|
|
|
14
14
|
|
|
15
15
|
A few concrete scenarios this unlocks:
|
|
16
16
|
|
|
17
|
+
- **Drive multiple devices in parallel from one agent session.** iOS simulator, Android emulator, physical device — any mix attaches to the same server. The agent can walk the same flow across platforms side-by-side, catching visual or behavioural regressions that show up on one OS but not the other, without ever leaving the editor.
|
|
17
18
|
- **End-to-end automation without a separate test harness.** Describe a multi-step flow in natural language — "sign in, open settings, flip the notifications toggle, verify the confirmation toast" — and an agent walks it: locates components by name/testID, fires real taps through the OS gesture pipeline, asserts on the resulting state, and reports back.
|
|
18
19
|
- **Interactive inspection of a live app from your editor.** Ask "what screen am I on?", "what React Query keys are stale?", "what did the last POST return?", "which translation keys are missing in the current locale?" — no rebuild, no DevTools panel, no "add more logs and reload" loop.
|
|
19
|
-
- **Debug gesture-arbitration bugs that unit tests can't catch.**
|
|
20
|
-
- **
|
|
20
|
+
- **Debug gesture-arbitration bugs that unit tests can't catch.** Taps go through the real iOS/Android touch pipeline, so issues like "the close button inside a horizontally-scrolling list swallows taps" surface naturally — and when you need to sidestep the pipeline (call a prop directly on a virtualised item, fire a callback on an offscreen component) the bridge offers that too.
|
|
21
|
+
- **Expose your own inspection points from inside components.** A component can register a named state key or an ad-hoc tool from its own lifecycle. Agents then read feature-flag state, force a particular loading scenario, or trigger an internal-only action without you shipping a debug menu.
|
|
21
22
|
|
|
22
23
|
Everything the library adds to your bundle is stripped in production builds via the companion babel plugin — so you can wire it up once and leave it in, without shipping it to users.
|
|
23
24
|
|
|
24
25
|
## Example scenarios
|
|
25
26
|
|
|
27
|
+
- **Deep runtime-state analysis on demand.** Ask "why is this screen blank?" or "why did the last submission fail?" — the agent cross-references the live React component tree (which components are mounted, their props and layout bounds, wrapper cascades, visible vs virtualised), the current navigation state, active data-fetching mutations, in-flight and recent network requests (with bodies + durations), captured errors with source-mapped stack traces, and any app-specific state the app has opted into exposing — all from the running runtime, no extra logging or rebuild. The same analysis can be scoped to specific moments ("state right after I tap submit") through built-in polling primitives, rather than a stale snapshot.
|
|
26
28
|
- **Reproduce a bug from a ticket, fix it, verify the fix.** The agent reads the reproduction steps, drives the app into the failing state through real taps and swipes, confirms the bug, edits the relevant source, then replays the same sequence to verify the fix — all in one editor session, no rebuilds between steps.
|
|
27
29
|
- **End-to-end flow narrated in plain language.** "Sign in, add an item to the cart, go through checkout, verify the total matches the expected value, screenshot the final screen, and give me a network traffic summary." The agent drives real taps, checks state at each step, snapshots the key screens, and hands back captured request counts / durations / errors as evidence.
|
|
28
30
|
- **Cross-platform parity check.** One agent holds two connected clients, runs the same tap sequence on iOS and Android in parallel, captures screenshots, and points out the differences — catches platform-specific regressions after an RN upgrade, shared-component refactor, or native change.
|
|
@@ -152,11 +154,7 @@ Wrap your whole app in it — every optional prop opts a module in when supplied
|
|
|
152
154
|
|
|
153
155
|
## MCP server tools
|
|
154
156
|
|
|
155
|
-
The Node server exposes a small set of entry-point tools agents use directly — you don't register or configure them. `call` / `list_tools` / `describe_tool` / `connection_status` / `state_get` / `state_list` cover discovery and dispatch, plus two test-automation helpers: `wait_until` (poll
|
|
156
|
-
|
|
157
|
-
## Multi-client
|
|
158
|
-
|
|
159
|
-
One server can hold multiple RN clients at once — iOS simulator, Android emulator, physical device, any mix. Useful for driving iOS and Android builds of the same app in lockstep from a single agent session.
|
|
157
|
+
The Node server exposes a small set of entry-point tools agents use directly — you don't register or configure them. `call` / `list_tools` / `describe_tool` / `connection_status` / `state_get` / `state_list` cover discovery and dispatch, plus two test-automation helpers: `wait_until` (poll any tool until a predicate holds, replacing screenshot-in-a-loop + sleep) and `assert` (single-shot checkpoint with a standardized diff on failure). For UI-level waits (wait for a screen, a spinner to disappear, etc.), `fiber_tree__query` has a built-in `waitFor` option — see the [fiber_tree section](#fiber_tree).
|
|
160
158
|
|
|
161
159
|
## Host tools (device-level control)
|
|
162
160
|
|
|
@@ -169,18 +167,27 @@ What you get:
|
|
|
169
167
|
- **Screenshots** — WebP, auto-diffing (`unchanged: true` on identical frames). Pass `region` in physical pixels to crop to a specific element and keep vision-token cost low.
|
|
170
168
|
- **App lifecycle** — launch, terminate, restart.
|
|
171
169
|
- **Device enumeration** — list sims / emulators / devices, annotated with active MCP clients.
|
|
172
|
-
- **Symbolication** — `symbolicate` resolves raw JS stack traces to source paths via Metro.
|
|
173
170
|
|
|
174
171
|
iOS input goes through a bundled `ios-hid` Swift binary that injects HID events directly into iOS Simulator via private frameworks — no external daemons to install or keep running.
|
|
175
172
|
|
|
173
|
+
## Metro tools (dev-server control plane)
|
|
174
|
+
|
|
175
|
+
Separate module talking HTTP / WebSocket to the Metro instance the app was bundled from. The URL is auto-detected from each client's handshake (via RN's `getDevServer()`), so non-default ports and LAN-connected physical devices work without extra config.
|
|
176
|
+
|
|
177
|
+
- **`metro__symbolicate`** — maps a raw Hermes / V8 stack trace back to source paths via Metro's `/symbolicate`. Pairs naturally with `errors__get_errors` and `log_box__get_logs` (each entry has parsed `stackFrames` ready to feed in).
|
|
178
|
+
- **`metro__reload`** — triggers a full JS reload on every attached app (`POST /reload`).
|
|
179
|
+
- **`metro__status`** — cheap ping before a chain of Metro calls.
|
|
180
|
+
- **`metro__open_in_editor({ file, lineNumber, column? })`** — jumps `$REACT_EDITOR` to the exact line. Natural finisher after a symbolication flow.
|
|
181
|
+
- **`metro__get_events`** — reads a server-side ring buffer (200 events) fed by a lazy WebSocket to Metro's `/events` stream. Surfaces `bundle_build_failed`, `bundling_error`, `hmr_client_error`, `hmr_update`, `client_log`, etc. Key use: detecting silent HMR failures when the red box doesn't appear.
|
|
182
|
+
|
|
176
183
|
## Hooks
|
|
177
184
|
|
|
178
185
|
For when the thing you want to expose lives deeper than `McpProvider`:
|
|
179
186
|
|
|
180
187
|
```ts
|
|
181
|
-
useMcpState(key, factory, deps)
|
|
182
|
-
useMcpTool(name, factory, deps)
|
|
183
|
-
useMcpModule(factory, deps)
|
|
188
|
+
useMcpState(key, factory, deps); // expose reactive state to the agent
|
|
189
|
+
useMcpTool(name, factory, deps); // register an ad-hoc tool tied to the component lifecycle
|
|
190
|
+
useMcpModule(factory, deps); // register a whole module from inside a component
|
|
184
191
|
```
|
|
185
192
|
|
|
186
193
|
Each follows `useMemo` / `useEffect` semantics — the factory re-runs on dep changes, registration cleans up on unmount.
|
|
@@ -191,10 +198,17 @@ const UserProvider = ({ children }) => {
|
|
|
191
198
|
|
|
192
199
|
useMcpState('user', () => ({ id: user?.id, loggedIn: user !== null }), [user]);
|
|
193
200
|
|
|
194
|
-
useMcpTool(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
201
|
+
useMcpTool(
|
|
202
|
+
'logout',
|
|
203
|
+
() => ({
|
|
204
|
+
description: 'Log out the current user',
|
|
205
|
+
handler: async () => {
|
|
206
|
+
await logout();
|
|
207
|
+
return { success: true };
|
|
208
|
+
},
|
|
209
|
+
}),
|
|
210
|
+
[logout]
|
|
211
|
+
);
|
|
198
212
|
|
|
199
213
|
return <UserContext.Provider value={user}>{children}</UserContext.Provider>;
|
|
200
214
|
};
|
|
@@ -240,12 +254,14 @@ Read-only view of platform facts (OS, version, dimensions in DP and physical pix
|
|
|
240
254
|
|
|
241
255
|
### errors
|
|
242
256
|
|
|
243
|
-
Captures unhandled JS errors (via `ErrorUtils.setGlobalHandler`) and unhandled promise rejections. Each entry has parsed `stackFrames` designed to feed into `
|
|
257
|
+
Captures unhandled JS errors (via `ErrorUtils.setGlobalHandler`) and unhandled promise rejections. Each entry has parsed `stackFrames` designed to feed into `metro__symbolicate` — one call resolves bundle paths back to `src/components/Foo.tsx:42:10`.
|
|
244
258
|
|
|
245
259
|
### fiber_tree
|
|
246
260
|
|
|
247
261
|
The heart of UI inspection. Search the component tree via a chained `query`: each step narrows the result with criteria (name / testID / mcpId / text / props matcher / not / any) and a scope (descendants / ancestors / siblings / screen / nearest_host / …). Wrapper cascades (`PressableView → Pressable → View → RCTView`) collapse to the topmost by default. `bounds` come back in physical pixels and pair directly with `host__tap` — or use `host__tap_fiber` for the locate-and-tap shortcut.
|
|
248
262
|
|
|
263
|
+
Pass `waitFor: { until: 'appear' | 'disappear', timeout?, interval?, stable? }` to poll the same query until the target state is reached — e.g. `waitFor: { until: 'appear', stable: 300 }` waits for a screen to mount and hold stable for 300ms. Response carries `{ waited, attempts, elapsedMs, timedOut, stableFor? }` alongside the usual matches.
|
|
264
|
+
|
|
249
265
|
### i18n
|
|
250
266
|
|
|
251
267
|
Inspect and manipulate an `i18next` instance: list keys, dump a whole translation resource, run a substring search, translate with interpolation, switch language at runtime.
|
|
@@ -268,7 +284,7 @@ networkModule({
|
|
|
268
284
|
bodyMaxBytes: 10_000,
|
|
269
285
|
ignoreUrls: ['https://analytics.example.com', /\.png$/],
|
|
270
286
|
redactHeaders: ['authorization'], // or false to disable
|
|
271
|
-
redactBodyKeys: ['password'],
|
|
287
|
+
redactBodyKeys: ['password'], // or false to disable
|
|
272
288
|
});
|
|
273
289
|
```
|
|
274
290
|
|
package/dist/bin/ios-hid
CHANGED
|
Binary file
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type McpModule, type ToolHandler } from '../../client/models/types';
|
|
2
|
+
import { type DevServerInfo } from '../../shared/protocol';
|
|
2
3
|
export declare class McpClient {
|
|
3
4
|
private static instance;
|
|
4
5
|
private connection;
|
|
@@ -12,6 +13,7 @@ export declare class McpClient {
|
|
|
12
13
|
appVersion?: string;
|
|
13
14
|
bundleId?: string;
|
|
14
15
|
debug?: boolean;
|
|
16
|
+
devServer?: DevServerInfo;
|
|
15
17
|
deviceId?: string;
|
|
16
18
|
host?: string;
|
|
17
19
|
label?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpClient.d.ts","sourceRoot":"","sources":["../../../src/client/core/McpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"McpClient.d.ts","sourceRoot":"","sources":["../../../src/client/core/McpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,mBAAmB,CAAC;AAkJ3B,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IAEjD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO;IAuCP,OAAO,CAAC,iBAAiB;IAsBzB,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,EAAE,aAAa,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,SAAS;IA2Bb,MAAM,CAAC,WAAW,IAAI,SAAS;IAS/B,OAAO,IAAI,IAAI;IAMf,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAMvC,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI;IAa3C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IAcnD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ9B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAS3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAUlC,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,gBAAgB;CAuBzB"}
|
|
@@ -45,6 +45,33 @@ const originalConsoleLog = console.log.bind(console);
|
|
|
45
45
|
const isUsefulString = (value) => {
|
|
46
46
|
return typeof value === 'string' && value.length > 0 && value.toLowerCase() !== 'unknown';
|
|
47
47
|
};
|
|
48
|
+
// RN ships `getDevServer()` which reads NativeSourceCode.scriptURL — this is
|
|
49
|
+
// the actual Metro origin the bundle was loaded from. In production builds the
|
|
50
|
+
// script URL is a local file and `bundleLoadedFromServer` is false; we skip
|
|
51
|
+
// the field in that case so Metro-facing tools fail fast.
|
|
52
|
+
const detectDevServer = () => {
|
|
53
|
+
try {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
55
|
+
const mod = require('react-native/Libraries/Core/Devtools/getDevServer');
|
|
56
|
+
const getDevServer = (mod.default ?? mod);
|
|
57
|
+
const info = getDevServer();
|
|
58
|
+
if (!info.bundleLoadedFromServer || typeof info.url !== 'string') {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const url = info.url.replace(/\/$/, '');
|
|
62
|
+
const parsed = new URL(url);
|
|
63
|
+
const port = parsed.port ? Number(parsed.port) : parsed.protocol === 'https:' ? 443 : 80;
|
|
64
|
+
return {
|
|
65
|
+
bundleLoadedFromServer: true,
|
|
66
|
+
host: parsed.hostname,
|
|
67
|
+
port,
|
|
68
|
+
url,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
48
75
|
const autoDetectIdentity = () => {
|
|
49
76
|
const out = {};
|
|
50
77
|
try {
|
|
@@ -58,6 +85,10 @@ const autoDetectIdentity = () => {
|
|
|
58
85
|
catch {
|
|
59
86
|
// not running inside a React Native bundle — that's fine
|
|
60
87
|
}
|
|
88
|
+
const devServer = detectDevServer();
|
|
89
|
+
if (devServer) {
|
|
90
|
+
out.devServer = devServer;
|
|
91
|
+
}
|
|
61
92
|
try {
|
|
62
93
|
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
63
94
|
const di = require('react-native-device-info');
|
|
@@ -163,6 +194,7 @@ class McpClient {
|
|
|
163
194
|
appName: options?.appName ?? auto.appName,
|
|
164
195
|
appVersion: options?.appVersion ?? auto.appVersion,
|
|
165
196
|
bundleId: options?.bundleId ?? auto.bundleId,
|
|
197
|
+
devServer: options?.devServer ?? auto.devServer,
|
|
166
198
|
deviceId: options?.deviceId ?? auto.deviceId,
|
|
167
199
|
label: options?.label ?? auto.label,
|
|
168
200
|
platform: options?.platform ?? auto.platform,
|
|
@@ -260,6 +292,7 @@ class McpClient {
|
|
|
260
292
|
appName: this.identity.appName,
|
|
261
293
|
appVersion: this.identity.appVersion,
|
|
262
294
|
bundleId: this.identity.bundleId,
|
|
295
|
+
devServer: this.identity.devServer,
|
|
263
296
|
deviceId: this.identity.deviceId,
|
|
264
297
|
label: this.identity.label,
|
|
265
298
|
modules: descriptors,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpClient.js","sourceRoot":"","sources":["../../../src/client/core/McpClient.ts"],"names":[],"mappings":";;;AACA,0DAA0D;AAC1D,8DAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"McpClient.js","sourceRoot":"","sources":["../../../src/client/core/McpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,KAAK,oBAAoB,EAAgC,MAAM,SAAS,CAAC;AAkHlF,eAAO,MAAM,aAAa,aAAc,oBAAoB,KAAG,SA2G9D,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.consoleModule = void 0;
|
|
4
|
+
const slice_1 = require("../../shared/slice");
|
|
4
5
|
const ALL_LEVELS = ['debug', 'error', 'info', 'log', 'warn'];
|
|
5
6
|
const DEFAULT_MAX_ENTRIES = 100;
|
|
6
7
|
const DEFAULT_STACK_LEVELS = ['error', 'warn'];
|
|
@@ -55,57 +56,88 @@ const captureStack = () => {
|
|
|
55
56
|
// Remove Error, captureStack, addEntry, console[level] wrapper frames
|
|
56
57
|
return lines.slice(4).join('\n');
|
|
57
58
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (stackTraceLevels.includes(level)) {
|
|
79
|
-
entry.stack = captureStack();
|
|
80
|
-
}
|
|
81
|
-
buffer.push(entry);
|
|
82
|
-
if (buffer.length > maxEntries) {
|
|
83
|
-
buffer.splice(0, buffer.length - maxEntries);
|
|
84
|
-
}
|
|
59
|
+
// === Module-level capture state — auto-starts at import time. ===
|
|
60
|
+
//
|
|
61
|
+
// Rationale: when `McpProvider` mounts, its `useEffect` runs after React's
|
|
62
|
+
// first render — any console.log fired during bundle evaluation or the first
|
|
63
|
+
// render would be lost. Patching at module import time (before React boots)
|
|
64
|
+
// closes that gap. The factory below adopts the pre-existing buffer and
|
|
65
|
+
// applies caller-supplied options retroactively.
|
|
66
|
+
const buffer = [];
|
|
67
|
+
let maxEntries = DEFAULT_MAX_ENTRIES;
|
|
68
|
+
let capturedLevels = new Set(ALL_LEVELS);
|
|
69
|
+
let stackLevels = new Set(DEFAULT_STACK_LEVELS);
|
|
70
|
+
const addEntry = (level, args) => {
|
|
71
|
+
if (!capturedLevels.has(level))
|
|
72
|
+
return;
|
|
73
|
+
const entry = {
|
|
74
|
+
args: args.map((arg) => {
|
|
75
|
+
return serializeArg(arg);
|
|
76
|
+
}),
|
|
77
|
+
level,
|
|
78
|
+
timestamp: new Date().toISOString(),
|
|
85
79
|
};
|
|
86
|
-
|
|
80
|
+
if (stackLevels.has(level)) {
|
|
81
|
+
entry.stack = captureStack();
|
|
82
|
+
}
|
|
83
|
+
buffer.push(entry);
|
|
84
|
+
if (buffer.length > maxEntries) {
|
|
85
|
+
buffer.splice(0, buffer.length - maxEntries);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
let patchesInstalled = false;
|
|
89
|
+
const installPatches = () => {
|
|
90
|
+
if (patchesInstalled)
|
|
91
|
+
return;
|
|
92
|
+
patchesInstalled = true;
|
|
93
|
+
for (const level of ALL_LEVELS) {
|
|
87
94
|
const original = console[level];
|
|
88
|
-
originals.set(level, original);
|
|
89
95
|
console[level] = (...args) => {
|
|
90
96
|
addEntry(level, args);
|
|
91
97
|
original.apply(console, args);
|
|
92
98
|
};
|
|
93
99
|
}
|
|
94
|
-
|
|
100
|
+
};
|
|
101
|
+
installPatches();
|
|
102
|
+
const consoleModule = (options) => {
|
|
103
|
+
// Apply options retroactively to the already-running buffer.
|
|
104
|
+
if (typeof options?.maxEntries === 'number') {
|
|
105
|
+
maxEntries = options.maxEntries;
|
|
106
|
+
if (buffer.length > maxEntries) {
|
|
107
|
+
buffer.splice(0, buffer.length - maxEntries);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (options?.levels) {
|
|
111
|
+
capturedLevels = new Set(options.levels);
|
|
112
|
+
}
|
|
113
|
+
if (options?.stackTrace === true) {
|
|
114
|
+
stackLevels = new Set(ALL_LEVELS);
|
|
115
|
+
}
|
|
116
|
+
else if (options?.stackTrace === false) {
|
|
117
|
+
stackLevels = new Set();
|
|
118
|
+
}
|
|
119
|
+
else if (Array.isArray(options?.stackTrace)) {
|
|
120
|
+
stackLevels = new Set(options.stackTrace);
|
|
121
|
+
}
|
|
122
|
+
const filterByLevel = (level, slice) => {
|
|
95
123
|
const filtered = buffer.filter((entry) => {
|
|
96
124
|
return entry.level === level;
|
|
97
125
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
126
|
+
return (0, slice_1.applySlice)(filtered, (0, slice_1.parseSliceArg)(slice));
|
|
127
|
+
};
|
|
128
|
+
const sliceSchema = {
|
|
129
|
+
description: (0, slice_1.sliceSchemaDescription)('Default omitted → every matching entry is returned.'),
|
|
130
|
+
examples: [[-10], [-20, -10], [0, 50]],
|
|
131
|
+
type: 'array',
|
|
102
132
|
};
|
|
103
133
|
return {
|
|
104
134
|
description: `Ring buffer of console.log/warn/error/info/debug.
|
|
105
135
|
|
|
106
136
|
Complex values (Errors, Dates, class instances, cyclic refs, functions,
|
|
107
137
|
Symbols) are serialized safely. Stack traces can be captured per level.
|
|
108
|
-
|
|
138
|
+
Capture starts at module-import time (before React mounts) so cold-start
|
|
139
|
+
logs are not lost. Buffer size and captured levels are configurable via
|
|
140
|
+
consoleModule options.`,
|
|
109
141
|
name: 'console',
|
|
110
142
|
tools: {
|
|
111
143
|
clear_logs: {
|
|
@@ -118,32 +150,32 @@ Buffer size and captured levels are configurable via consoleModule options.`,
|
|
|
118
150
|
get_debug: {
|
|
119
151
|
description: 'Return console.debug entries.',
|
|
120
152
|
handler: (args) => {
|
|
121
|
-
return filterByLevel('debug', args.
|
|
153
|
+
return filterByLevel('debug', args.slice);
|
|
122
154
|
},
|
|
123
155
|
inputSchema: {
|
|
124
|
-
|
|
156
|
+
slice: sliceSchema,
|
|
125
157
|
},
|
|
126
158
|
},
|
|
127
159
|
get_errors: {
|
|
128
160
|
description: 'Return console.error entries.',
|
|
129
161
|
handler: (args) => {
|
|
130
|
-
return filterByLevel('error', args.
|
|
162
|
+
return filterByLevel('error', args.slice);
|
|
131
163
|
},
|
|
132
164
|
inputSchema: {
|
|
133
|
-
|
|
165
|
+
slice: sliceSchema,
|
|
134
166
|
},
|
|
135
167
|
},
|
|
136
168
|
get_info: {
|
|
137
169
|
description: 'Return console.info entries.',
|
|
138
170
|
handler: (args) => {
|
|
139
|
-
return filterByLevel('info', args.
|
|
171
|
+
return filterByLevel('info', args.slice);
|
|
140
172
|
},
|
|
141
173
|
inputSchema: {
|
|
142
|
-
|
|
174
|
+
slice: sliceSchema,
|
|
143
175
|
},
|
|
144
176
|
},
|
|
145
177
|
get_logs: {
|
|
146
|
-
description: 'Return all log entries, optionally filtered by level and
|
|
178
|
+
description: 'Return all log entries, optionally filtered by level and slice.',
|
|
147
179
|
handler: (args) => {
|
|
148
180
|
let result = [...buffer];
|
|
149
181
|
if (args.level) {
|
|
@@ -151,10 +183,7 @@ Buffer size and captured levels are configurable via consoleModule options.`,
|
|
|
151
183
|
return entry.level === args.level;
|
|
152
184
|
});
|
|
153
185
|
}
|
|
154
|
-
|
|
155
|
-
result = result.slice(-args.limit);
|
|
156
|
-
}
|
|
157
|
-
return result;
|
|
186
|
+
return (0, slice_1.applySlice)(result, (0, slice_1.parseSliceArg)(args.slice));
|
|
158
187
|
},
|
|
159
188
|
inputSchema: {
|
|
160
189
|
level: {
|
|
@@ -162,16 +191,16 @@ Buffer size and captured levels are configurable via consoleModule options.`,
|
|
|
162
191
|
examples: ['log', 'warn', 'error', 'info', 'debug'],
|
|
163
192
|
type: 'string',
|
|
164
193
|
},
|
|
165
|
-
|
|
194
|
+
slice: sliceSchema,
|
|
166
195
|
},
|
|
167
196
|
},
|
|
168
197
|
get_warnings: {
|
|
169
198
|
description: 'Return console.warn entries.',
|
|
170
199
|
handler: (args) => {
|
|
171
|
-
return filterByLevel('warn', args.
|
|
200
|
+
return filterByLevel('warn', args.slice);
|
|
172
201
|
},
|
|
173
202
|
inputSchema: {
|
|
174
|
-
|
|
203
|
+
slice: sliceSchema,
|
|
175
204
|
},
|
|
176
205
|
},
|
|
177
206
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/modules/console/console.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/modules/errors/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/modules/errors/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,SAAS,CAAC;AAiHjB,eAAO,MAAM,YAAY,aAAc,mBAAmB,KAAG,SAiI5D,CAAC"}
|