react-native-mcp-kit 2.2.2 → 2.3.1

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.
Files changed (86) hide show
  1. package/README.md +62 -23
  2. package/dist/bin/ios-hid +0 -0
  3. package/dist/client/core/McpClient.d.ts +2 -0
  4. package/dist/client/core/McpClient.d.ts.map +1 -1
  5. package/dist/client/core/McpClient.js +33 -0
  6. package/dist/client/core/McpClient.js.map +1 -1
  7. package/dist/modules/console/console.d.ts.map +1 -1
  8. package/dist/modules/console/console.js +78 -49
  9. package/dist/modules/console/console.js.map +1 -1
  10. package/dist/modules/errors/errors.d.ts.map +1 -1
  11. package/dist/modules/errors/errors.js +58 -39
  12. package/dist/modules/errors/errors.js.map +1 -1
  13. package/dist/modules/fiberTree/fiberTree.d.ts.map +1 -1
  14. package/dist/modules/fiberTree/fiberTree.js +144 -61
  15. package/dist/modules/fiberTree/fiberTree.js.map +1 -1
  16. package/dist/modules/logBox/logBox.d.ts.map +1 -1
  17. package/dist/modules/logBox/logBox.js +8 -9
  18. package/dist/modules/logBox/logBox.js.map +1 -1
  19. package/dist/modules/navigation/navigation.d.ts.map +1 -1
  20. package/dist/modules/navigation/navigation.js +12 -9
  21. package/dist/modules/navigation/navigation.js.map +1 -1
  22. package/dist/modules/network/network.d.ts.map +1 -1
  23. package/dist/modules/network/network.js +76 -36
  24. package/dist/modules/network/network.js.map +1 -1
  25. package/dist/server/bridge.d.ts +2 -1
  26. package/dist/server/bridge.d.ts.map +1 -1
  27. package/dist/server/bridge.js +1 -0
  28. package/dist/server/bridge.js.map +1 -1
  29. package/dist/server/cli.js +2 -1
  30. package/dist/server/cli.js.map +1 -1
  31. package/dist/server/host/hostModule.d.ts.map +1 -1
  32. package/dist/server/host/hostModule.js +0 -2
  33. package/dist/server/host/hostModule.js.map +1 -1
  34. package/dist/server/host/tools/symbolicate.d.ts.map +1 -1
  35. package/dist/server/host/tools/symbolicate.js +13 -3
  36. package/dist/server/host/tools/symbolicate.js.map +1 -1
  37. package/dist/server/mcpServer.d.ts.map +1 -1
  38. package/dist/server/mcpServer.js +11 -10
  39. package/dist/server/mcpServer.js.map +1 -1
  40. package/dist/server/metro/eventCapture.d.ts +41 -0
  41. package/dist/server/metro/eventCapture.d.ts.map +1 -0
  42. package/dist/server/metro/eventCapture.js +138 -0
  43. package/dist/server/metro/eventCapture.js.map +1 -0
  44. package/dist/server/metro/index.d.ts +2 -0
  45. package/dist/server/metro/index.d.ts.map +1 -0
  46. package/dist/server/metro/index.js +6 -0
  47. package/dist/server/metro/index.js.map +1 -0
  48. package/dist/server/metro/metroModule.d.ts +3 -0
  49. package/dist/server/metro/metroModule.d.ts.map +1 -0
  50. package/dist/server/metro/metroModule.js +25 -0
  51. package/dist/server/metro/metroModule.js.map +1 -0
  52. package/dist/server/metro/resolveMetroUrl.d.ts +12 -0
  53. package/dist/server/metro/resolveMetroUrl.d.ts.map +1 -0
  54. package/dist/server/metro/resolveMetroUrl.js +23 -0
  55. package/dist/server/metro/resolveMetroUrl.js.map +1 -0
  56. package/dist/server/metro/tools/events.d.ts +3 -0
  57. package/dist/server/metro/tools/events.d.ts.map +1 -0
  58. package/dist/server/metro/tools/events.js +51 -0
  59. package/dist/server/metro/tools/events.js.map +1 -0
  60. package/dist/server/metro/tools/openInEditor.d.ts +3 -0
  61. package/dist/server/metro/tools/openInEditor.d.ts.map +1 -0
  62. package/dist/server/metro/tools/openInEditor.js +89 -0
  63. package/dist/server/metro/tools/openInEditor.js.map +1 -0
  64. package/dist/server/metro/tools/openUrl.d.ts +3 -0
  65. package/dist/server/metro/tools/openUrl.d.ts.map +1 -0
  66. package/dist/server/metro/tools/openUrl.js +71 -0
  67. package/dist/server/metro/tools/openUrl.js.map +1 -0
  68. package/dist/server/metro/tools/reload.d.ts +3 -0
  69. package/dist/server/metro/tools/reload.d.ts.map +1 -0
  70. package/dist/server/metro/tools/reload.js +53 -0
  71. package/dist/server/metro/tools/reload.js.map +1 -0
  72. package/dist/server/metro/tools/status.d.ts +3 -0
  73. package/dist/server/metro/tools/status.d.ts.map +1 -0
  74. package/dist/server/metro/tools/status.js +52 -0
  75. package/dist/server/metro/tools/status.js.map +1 -0
  76. package/dist/server/metro/tools/symbolicate.d.ts +3 -0
  77. package/dist/server/metro/tools/symbolicate.d.ts.map +1 -0
  78. package/dist/server/metro/tools/symbolicate.js +203 -0
  79. package/dist/server/metro/tools/symbolicate.js.map +1 -0
  80. package/dist/shared/protocol.d.ts +14 -0
  81. package/dist/shared/protocol.d.ts.map +1 -1
  82. package/dist/shared/slice.d.ts +16 -0
  83. package/dist/shared/slice.d.ts.map +1 -0
  84. package/dist/shared/slice.js +29 -0
  85. package/dist/shared/slice.js.map +1 -0
  86. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import { type HostToolHandler } from '../../../server/host/types';
2
+ export declare const openInEditorTool: () => HostToolHandler;
3
+ //# sourceMappingURL=openInEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openInEditor.d.ts","sourceRoot":"","sources":["../../../../src/server/metro/tools/openInEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,eAAO,MAAM,gBAAgB,QAAO,eAiFnC,CAAC"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openInEditorTool = void 0;
4
+ const resolveMetroUrl_1 = require("../../../server/metro/resolveMetroUrl");
5
+ const METRO_TIMEOUT_MS = 3_000;
6
+ const openInEditorTool = () => {
7
+ return {
8
+ description: `Jump to a source location in the dev machine's editor — POSTs to Metro's \`/open-stack-frame\` endpoint, which shells out via $REACT_EDITOR / $EDITOR.
9
+
10
+ Natural finisher for a symbolication flow: errors__get_errors → metro__symbolicate → metro__open_in_editor on the top user-frame. Unlike a plain \`open file:…\` shell call, this jumps to the exact line and column.
11
+
12
+ Returns { ok: true, file, lineNumber, metroUrl } on success.`,
13
+ handler: async (args, ctx) => {
14
+ const file = typeof args.file === 'string' ? args.file : undefined;
15
+ const lineNumber = typeof args.lineNumber === 'number' ? args.lineNumber : undefined;
16
+ const column = typeof args.column === 'number' ? args.column : undefined;
17
+ if (!file) {
18
+ return { error: '`file` is required.' };
19
+ }
20
+ if (typeof lineNumber !== 'number') {
21
+ return { error: '`lineNumber` is required (number).' };
22
+ }
23
+ const metroUrl = (0, resolveMetroUrl_1.resolveMetroUrl)(args, ctx);
24
+ const body = { file, lineNumber };
25
+ if (typeof column === 'number')
26
+ body.column = column;
27
+ try {
28
+ const controller = new AbortController();
29
+ const timer = setTimeout(() => {
30
+ controller.abort();
31
+ }, METRO_TIMEOUT_MS);
32
+ const res = await fetch(`${metroUrl}/open-stack-frame`, {
33
+ body: JSON.stringify(body),
34
+ headers: { 'Content-Type': 'application/json' },
35
+ method: 'POST',
36
+ signal: controller.signal,
37
+ });
38
+ clearTimeout(timer);
39
+ if (!res.ok) {
40
+ return {
41
+ error: `Metro responded ${res.status}`,
42
+ file,
43
+ lineNumber,
44
+ metroUrl,
45
+ ok: false,
46
+ skipped: true,
47
+ };
48
+ }
49
+ return { file, lineNumber, metroUrl, ok: true };
50
+ }
51
+ catch (err) {
52
+ return {
53
+ error: `Metro at ${metroUrl} unreachable: ${err.message}`,
54
+ file,
55
+ lineNumber,
56
+ metroUrl,
57
+ ok: false,
58
+ skipped: true,
59
+ };
60
+ }
61
+ },
62
+ inputSchema: {
63
+ clientId: {
64
+ description: 'Target client ID — used to pick up the Metro URL the app was loaded from (falls back to `metroUrl` or the hardcoded default).',
65
+ type: 'string',
66
+ },
67
+ column: {
68
+ description: 'Column number (1-based). Optional.',
69
+ type: 'number',
70
+ },
71
+ file: {
72
+ description: 'Absolute or repo-relative path to the source file. Paths from metro__symbolicate output plug in directly.',
73
+ examples: ['src/screens/HomeScreen/HomeScreen.tsx', '/Users/me/project/src/Foo.tsx'],
74
+ type: 'string',
75
+ },
76
+ lineNumber: {
77
+ description: 'Line number (1-based).',
78
+ type: 'number',
79
+ },
80
+ metroUrl: {
81
+ description: `Base URL of the Metro dev server. Overrides the URL reported by the connected client. Default "http://localhost:8081".`,
82
+ type: 'string',
83
+ },
84
+ },
85
+ timeout: METRO_TIMEOUT_MS + 1_000,
86
+ };
87
+ };
88
+ exports.openInEditorTool = openInEditorTool;
89
+ //# sourceMappingURL=openInEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openInEditor.js","sourceRoot":"","sources":["../../../../src/server/metro/tools/openInEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type HostToolHandler } from '../../../server/host/types';
2
+ export declare const openUrlTool: () => HostToolHandler;
3
+ //# sourceMappingURL=openUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openUrl.d.ts","sourceRoot":"","sources":["../../../../src/server/metro/tools/openUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,eAAO,MAAM,WAAW,QAAO,eAgE9B,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openUrlTool = void 0;
4
+ const resolveMetroUrl_1 = require("../../../server/metro/resolveMetroUrl");
5
+ const METRO_TIMEOUT_MS = 5_000;
6
+ const openUrlTool = () => {
7
+ return {
8
+ description: `Open a URL in the default browser on the machine running Metro — POSTs to Metro's \`/open-url\` endpoint.
9
+
10
+ Useful for handing off to a view the agent has discovered but can't usefully display itself: a CI job page, a Grafana dashboard, a PR diff, a deployed preview build. This runs \`open\` on macOS / \`xdg-open\` on Linux against the host, not on the mobile device. For deep-linking into the app use navigation module or iOS/Android URL schemes instead.
11
+
12
+ Returns { ok: true, url, metroUrl } on success.`,
13
+ handler: async (args, ctx) => {
14
+ const url = typeof args.url === 'string' ? args.url : undefined;
15
+ if (!url) {
16
+ return { error: '`url` is required.' };
17
+ }
18
+ const metroUrl = (0, resolveMetroUrl_1.resolveMetroUrl)(args, ctx);
19
+ try {
20
+ const controller = new AbortController();
21
+ const timer = setTimeout(() => {
22
+ controller.abort();
23
+ }, METRO_TIMEOUT_MS);
24
+ const res = await fetch(`${metroUrl}/open-url`, {
25
+ body: JSON.stringify({ url }),
26
+ headers: { 'Content-Type': 'application/json' },
27
+ method: 'POST',
28
+ signal: controller.signal,
29
+ });
30
+ clearTimeout(timer);
31
+ if (!res.ok) {
32
+ return {
33
+ error: `Metro responded ${res.status}`,
34
+ metroUrl,
35
+ ok: false,
36
+ skipped: true,
37
+ url,
38
+ };
39
+ }
40
+ return { metroUrl, ok: true, url };
41
+ }
42
+ catch (err) {
43
+ return {
44
+ error: `Metro at ${metroUrl} unreachable: ${err.message}`,
45
+ metroUrl,
46
+ ok: false,
47
+ skipped: true,
48
+ url,
49
+ };
50
+ }
51
+ },
52
+ inputSchema: {
53
+ clientId: {
54
+ description: 'Target client ID — used to pick up the Metro URL the app was loaded from (falls back to `metroUrl` or the hardcoded default).',
55
+ type: 'string',
56
+ },
57
+ metroUrl: {
58
+ description: `Base URL of the Metro dev server. Overrides the URL reported by the connected client. Default "http://localhost:8081".`,
59
+ type: 'string',
60
+ },
61
+ url: {
62
+ description: 'Absolute URL to open on the host (http/https). Deep-linking into the mobile app is a different concern — use navigation tools instead.',
63
+ examples: ['https://example.com/dashboard', 'https://github.com/org/repo/pull/42'],
64
+ type: 'string',
65
+ },
66
+ },
67
+ timeout: METRO_TIMEOUT_MS + 1_000,
68
+ };
69
+ };
70
+ exports.openUrlTool = openUrlTool;
71
+ //# sourceMappingURL=openUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openUrl.js","sourceRoot":"","sources":["../../../../src/server/metro/tools/openUrl.ts"],"names":[],"mappings":";;;AACA,oEAAiE;AAEjE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAExB,MAAM,WAAW,GAAG,GAAoB,EAAE;IAC/C,OAAO;QACL,WAAW,EAAE;;;;gDAI+B;QAC5C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;YACzC,CAAC;YACD,MAAM,QAAQ,GAAG,IAAA,iCAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,WAAW,EAAE;oBAC9C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;oBAC7B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBACH,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO;wBACL,KAAK,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE;wBACtC,QAAQ;wBACR,EAAE,EAAE,KAAK;wBACT,OAAO,EAAE,IAAI;wBACb,GAAG;qBACJ,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,KAAK,EAAE,YAAY,QAAQ,iBAAkB,GAAa,CAAC,OAAO,EAAE;oBACpE,QAAQ;oBACR,EAAE,EAAE,KAAK;oBACT,OAAO,EAAE,IAAI;oBACb,GAAG;iBACJ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,EAAE;YACX,QAAQ,EAAE;gBACR,WAAW,EACT,+HAA+H;gBACjI,IAAI,EAAE,QAAQ;aACf;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,wHAAwH;gBACrI,IAAI,EAAE,QAAQ;aACf;YACD,GAAG,EAAE;gBACH,WAAW,EACT,wIAAwI;gBAC1I,QAAQ,EAAE,CAAC,+BAA+B,EAAE,qCAAqC,CAAC;gBAClF,IAAI,EAAE,QAAQ;aACf;SACF;QACD,OAAO,EAAE,gBAAgB,GAAG,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AAhEW,QAAA,WAAW,eAgEtB"}
@@ -0,0 +1,3 @@
1
+ import { type HostToolHandler } from '../../../server/host/types';
2
+ export declare const reloadTool: () => HostToolHandler;
3
+ //# sourceMappingURL=reload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.d.ts","sourceRoot":"","sources":["../../../../src/server/metro/tools/reload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,eAAO,MAAM,UAAU,QAAO,eA6C7B,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reloadTool = void 0;
4
+ const resolveMetroUrl_1 = require("../../../server/metro/resolveMetroUrl");
5
+ const METRO_TIMEOUT_MS = 5_000;
6
+ const reloadTool = () => {
7
+ return {
8
+ description: `Trigger a full JS reload on every app attached to Metro — POSTs to Metro's \`/reload\` endpoint.
9
+
10
+ Equivalent to shaking the device and tapping "Reload". Use this when the agent needs a clean runtime (post-edit, after state corruption, or between test cases) without touching the simulator UI. All connected clients reload, not just the targeted one — Metro broadcasts.
11
+
12
+ Returns { ok: true, metroUrl } on success. On an unreachable Metro returns { ok: false, error, metroUrl, skipped: true }.`,
13
+ handler: async (args, ctx) => {
14
+ const metroUrl = (0, resolveMetroUrl_1.resolveMetroUrl)(args, ctx);
15
+ try {
16
+ const controller = new AbortController();
17
+ const timer = setTimeout(() => {
18
+ controller.abort();
19
+ }, METRO_TIMEOUT_MS);
20
+ const res = await fetch(`${metroUrl}/reload`, {
21
+ method: 'POST',
22
+ signal: controller.signal,
23
+ });
24
+ clearTimeout(timer);
25
+ if (!res.ok) {
26
+ return { error: `Metro responded ${res.status}`, metroUrl, ok: false, skipped: true };
27
+ }
28
+ return { metroUrl, ok: true };
29
+ }
30
+ catch (err) {
31
+ return {
32
+ error: `Metro at ${metroUrl} unreachable: ${err.message}`,
33
+ metroUrl,
34
+ ok: false,
35
+ skipped: true,
36
+ };
37
+ }
38
+ },
39
+ inputSchema: {
40
+ clientId: {
41
+ description: 'Target client ID — used to pick up the Metro URL the app was loaded from (falls back to `metroUrl` or the hardcoded default).',
42
+ type: 'string',
43
+ },
44
+ metroUrl: {
45
+ description: `Base URL of the Metro dev server. Overrides the URL reported by the connected client. Default "${'http://localhost:8081'}".`,
46
+ type: 'string',
47
+ },
48
+ },
49
+ timeout: METRO_TIMEOUT_MS + 1_000,
50
+ };
51
+ };
52
+ exports.reloadTool = reloadTool;
53
+ //# sourceMappingURL=reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.js","sourceRoot":"","sources":["../../../../src/server/metro/tools/reload.ts"],"names":[],"mappings":";;;AACA,oEAAiE;AAEjE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,GAAG,GAAoB,EAAE;IAC9C,OAAO;QACL,WAAW,EAAE;;;;0HAIyG;QACtH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,IAAA,iCAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;oBAC5C,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBACH,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO,EAAE,KAAK,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACxF,CAAC;gBACD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,KAAK,EAAE,YAAY,QAAQ,iBAAkB,GAAa,CAAC,OAAO,EAAE;oBACpE,QAAQ;oBACR,EAAE,EAAE,KAAK;oBACT,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,EAAE;YACX,QAAQ,EAAE;gBACR,WAAW,EACT,+HAA+H;gBACjI,IAAI,EAAE,QAAQ;aACf;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,kGAAkG,uBAAuB,IAAI;gBAC1I,IAAI,EAAE,QAAQ;aACf;SACF;QACD,OAAO,EAAE,gBAAgB,GAAG,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AA7CW,QAAA,UAAU,cA6CrB"}
@@ -0,0 +1,3 @@
1
+ import { type HostToolHandler } from '../../../server/host/types';
2
+ export declare const statusTool: () => HostToolHandler;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/server/metro/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAM3D,eAAO,MAAM,UAAU,QAAO,eA2C7B,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusTool = void 0;
4
+ const resolveMetroUrl_1 = require("../../../server/metro/resolveMetroUrl");
5
+ const METRO_TIMEOUT_MS = 3_000;
6
+ const PACKAGER_STATUS = 'packager-status:running';
7
+ const statusTool = () => {
8
+ return {
9
+ description: `Ping Metro's \`/status\` endpoint — returns { running: true, metroUrl } when Metro is up and reachable, { running: false, error, metroUrl } when it's not.
10
+
11
+ Cheap, side-effect-free sanity check. Useful before a chain of Metro-facing operations (symbolicate, reload) to fail fast with a clear reason instead of a cascade of timeouts.`,
12
+ handler: async (args, ctx) => {
13
+ const metroUrl = (0, resolveMetroUrl_1.resolveMetroUrl)(args, ctx);
14
+ try {
15
+ const controller = new AbortController();
16
+ const timer = setTimeout(() => {
17
+ controller.abort();
18
+ }, METRO_TIMEOUT_MS);
19
+ const res = await fetch(`${metroUrl}/status`, { signal: controller.signal });
20
+ clearTimeout(timer);
21
+ if (!res.ok) {
22
+ return { error: `Metro responded ${res.status}`, metroUrl, running: false };
23
+ }
24
+ const body = (await res.text()).trim();
25
+ const running = body === PACKAGER_STATUS;
26
+ return running
27
+ ? { metroUrl, running: true }
28
+ : { body, error: `unexpected body: "${body}"`, metroUrl, running: false };
29
+ }
30
+ catch (err) {
31
+ return {
32
+ error: `Metro at ${metroUrl} unreachable: ${err.message}`,
33
+ metroUrl,
34
+ running: false,
35
+ };
36
+ }
37
+ },
38
+ inputSchema: {
39
+ clientId: {
40
+ description: 'Target client ID — used to pick up the Metro URL the app was loaded from (falls back to `metroUrl` or the hardcoded default).',
41
+ type: 'string',
42
+ },
43
+ metroUrl: {
44
+ description: `Base URL of the Metro dev server. Overrides the URL reported by the connected client. Default "http://localhost:8081".`,
45
+ type: 'string',
46
+ },
47
+ },
48
+ timeout: METRO_TIMEOUT_MS + 1_000,
49
+ };
50
+ };
51
+ exports.statusTool = statusTool;
52
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/server/metro/tools/status.ts"],"names":[],"mappings":";;;AACA,oEAAiE;AAEjE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAE3C,MAAM,UAAU,GAAG,GAAoB,EAAE;IAC9C,OAAO;QACL,WAAW,EAAE;;gLAE+J;QAC5K,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,IAAA,iCAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7E,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO,EAAE,KAAK,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC9E,CAAC;gBACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,IAAI,KAAK,eAAe,CAAC;gBACzC,OAAO,OAAO;oBACZ,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;oBAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC9E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,KAAK,EAAE,YAAY,QAAQ,iBAAkB,GAAa,CAAC,OAAO,EAAE;oBACpE,QAAQ;oBACR,OAAO,EAAE,KAAK;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,EAAE;YACX,QAAQ,EAAE;gBACR,WAAW,EACT,+HAA+H;gBACjI,IAAI,EAAE,QAAQ;aACf;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,wHAAwH;gBACrI,IAAI,EAAE,QAAQ;aACf;SACF;QACD,OAAO,EAAE,gBAAgB,GAAG,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AA3CW,QAAA,UAAU,cA2CrB"}
@@ -0,0 +1,3 @@
1
+ import { type HostToolHandler } from '../../../server/host/types';
2
+ export declare const symbolicateTool: () => HostToolHandler;
3
+ //# sourceMappingURL=symbolicate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolicate.d.ts","sourceRoot":"","sources":["../../../../src/server/metro/tools/symbolicate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6F3D,eAAO,MAAM,eAAe,QAAO,eAoIlC,CAAC"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.symbolicateTool = void 0;
4
+ const resolveMetroUrl_1 = require("../../../server/metro/resolveMetroUrl");
5
+ const METRO_TIMEOUT_MS = 5_000;
6
+ const DEFAULT_MAX_FRAMES = 10;
7
+ const MAX_FRAMES_CEILING = 100;
8
+ /**
9
+ * Parses a raw Error.stack string into structured frames. Supports both the
10
+ * V8 ` at method (file:line:col)` format and the Hermes / JSC
11
+ * `method@file:line:col` form used by React Native. Returns an empty array if
12
+ * nothing matches so the caller can fall back gracefully.
13
+ */
14
+ const parseStackString = (stack) => {
15
+ const frames = [];
16
+ const v8Regex = /^\s*at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?\s*$/gm;
17
+ let match;
18
+ while ((match = v8Regex.exec(stack)) !== null) {
19
+ frames.push({
20
+ column: Number.parseInt(match[4], 10),
21
+ file: match[2],
22
+ lineNumber: Number.parseInt(match[3], 10),
23
+ methodName: match[1]?.trim() || undefined,
24
+ });
25
+ }
26
+ if (frames.length > 0)
27
+ return frames;
28
+ const hermesRegex = /^(.*?)@(.+?):(\d+):(\d+)$/gm;
29
+ while ((match = hermesRegex.exec(stack)) !== null) {
30
+ frames.push({
31
+ column: Number.parseInt(match[4], 10),
32
+ file: match[2],
33
+ lineNumber: Number.parseInt(match[3], 10),
34
+ methodName: match[1]?.trim() || undefined,
35
+ });
36
+ }
37
+ return frames;
38
+ };
39
+ /**
40
+ * Shorten an absolute filesystem path by stripping the current working
41
+ * directory prefix. Leaves URLs and unrelated absolute paths untouched.
42
+ */
43
+ const relativeToCwd = (file, cwd) => {
44
+ if (!file)
45
+ return file;
46
+ if (file.startsWith('http://') || file.startsWith('https://'))
47
+ return file;
48
+ if (file.startsWith(cwd + '/'))
49
+ return file.slice(cwd.length + 1);
50
+ if (file === cwd)
51
+ return '.';
52
+ return file;
53
+ };
54
+ /**
55
+ * Apply token-saving transforms to a resolved stack:
56
+ * 1. Drop framework frames (`collapse: true` from Metro = node_modules / RN
57
+ * internals) unless explicitly kept via includeFrameworkFrames.
58
+ * 2. Trim to `maxFrames` (from the top — where the actual cause lives).
59
+ * 3. Rewrite file paths relative to cwd unless fullPaths is set.
60
+ * 4. Drop `collapse` from output (already used for filtering).
61
+ */
62
+ const trimFrames = (frames, opts) => {
63
+ const filtered = opts.includeFramework
64
+ ? frames
65
+ : frames.filter((f) => {
66
+ return !f.collapse;
67
+ });
68
+ const limited = filtered.slice(0, opts.maxFrames);
69
+ const cwd = process.cwd();
70
+ return limited.map((f) => {
71
+ const out = {};
72
+ const file = opts.fullPaths ? f.file : relativeToCwd(f.file, cwd);
73
+ if (file)
74
+ out.file = file;
75
+ if (typeof f.lineNumber === 'number')
76
+ out.lineNumber = f.lineNumber;
77
+ if (typeof f.column === 'number' && f.column > 0)
78
+ out.column = f.column;
79
+ if (f.methodName)
80
+ out.methodName = f.methodName;
81
+ return out;
82
+ });
83
+ };
84
+ const symbolicateTool = () => {
85
+ return {
86
+ description: `Resolve a JS stack trace via Metro's /symbolicate endpoint — maps bundled paths like "http://localhost:8081/index.bundle:12345:67" back to original sources like "src/components/Foo.tsx:42:10".
87
+
88
+ Pass either a raw stack string (from errors__get_errors.stack) or a parsed array of frames (from log_box__get_logs[*].stack). No-ops gracefully when Metro is unreachable (returns { skipped: true, error }), so safe to call opportunistically.
89
+
90
+ TOKEN-SAVING DEFAULTS
91
+ - node_modules / RN-internal frames (collapse: true from Metro) are dropped.
92
+ - Only the top ${DEFAULT_MAX_FRAMES} frames returned.
93
+ - Absolute paths are shortened relative to the MCP server's cwd.
94
+ Opt-out via includeFrameworkFrames / maxFrames / fullPaths.`,
95
+ handler: async (args, ctx) => {
96
+ const stack = args.stack;
97
+ const frames = args.frames;
98
+ const metroUrl = (0, resolveMetroUrl_1.resolveMetroUrl)(args, ctx);
99
+ const includeFramework = args.includeFrameworkFrames === true;
100
+ const fullPaths = args.fullPaths === true;
101
+ const maxFrames = Math.max(1, Math.min(MAX_FRAMES_CEILING, typeof args.maxFrames === 'number' ? Math.floor(args.maxFrames) : DEFAULT_MAX_FRAMES));
102
+ const trimOpts = { fullPaths, includeFramework, maxFrames };
103
+ let rawFrames;
104
+ if (Array.isArray(frames) && frames.length > 0) {
105
+ rawFrames = frames;
106
+ }
107
+ else if (typeof stack === 'string' && stack.length > 0) {
108
+ rawFrames = parseStackString(stack);
109
+ }
110
+ else {
111
+ return { error: 'Pass either `stack` (string) or `frames` (array).' };
112
+ }
113
+ if (rawFrames.length === 0) {
114
+ return { error: 'No frames parsed from input.', frames: [], skipped: true };
115
+ }
116
+ try {
117
+ const controller = new AbortController();
118
+ const timer = setTimeout(() => {
119
+ controller.abort();
120
+ }, METRO_TIMEOUT_MS);
121
+ const res = await fetch(`${metroUrl}/symbolicate`, {
122
+ body: JSON.stringify({ stack: rawFrames }),
123
+ headers: { 'Content-Type': 'application/json' },
124
+ method: 'POST',
125
+ signal: controller.signal,
126
+ });
127
+ clearTimeout(timer);
128
+ if (!res.ok) {
129
+ return {
130
+ error: `Metro responded ${res.status}`,
131
+ frames: trimFrames(rawFrames, trimOpts),
132
+ skipped: true,
133
+ };
134
+ }
135
+ const json = (await res.json());
136
+ const resolved = json.stack ?? rawFrames;
137
+ const totalFrames = includeFramework
138
+ ? resolved.length
139
+ : resolved.filter((f) => {
140
+ return !f.collapse;
141
+ }).length;
142
+ const trimmed = trimFrames(resolved, trimOpts);
143
+ const result = { frames: trimmed, totalFrames };
144
+ if (!includeFramework) {
145
+ result.droppedFrameworkFrames = resolved.length - totalFrames;
146
+ }
147
+ if (totalFrames > trimmed.length)
148
+ result.truncated = true;
149
+ return result;
150
+ }
151
+ catch (err) {
152
+ return {
153
+ error: `Metro at ${metroUrl} unreachable: ${err.message}`,
154
+ frames: trimFrames(rawFrames, trimOpts),
155
+ skipped: true,
156
+ };
157
+ }
158
+ },
159
+ inputSchema: {
160
+ clientId: {
161
+ description: 'Target client ID — used to pick up the Metro URL the app was actually loaded from (falls back to `metroUrl` or the hardcoded default).',
162
+ type: 'string',
163
+ },
164
+ frames: {
165
+ description: 'Parsed stack frames: [{ file, lineNumber, column, methodName? }]. Takes precedence over `stack` when both are provided.',
166
+ examples: [
167
+ [
168
+ {
169
+ column: 42,
170
+ file: 'http://localhost:8081/index.bundle',
171
+ lineNumber: 1234,
172
+ methodName: 'render',
173
+ },
174
+ ],
175
+ ],
176
+ type: 'array',
177
+ },
178
+ fullPaths: {
179
+ description: 'Return absolute file paths instead of ones relative to the MCP server cwd. Default false.',
180
+ type: 'boolean',
181
+ },
182
+ includeFrameworkFrames: {
183
+ description: 'Keep node_modules / React Native internal frames (marked collapse: true by Metro). Default false — framework noise is dropped to save tokens.',
184
+ type: 'boolean',
185
+ },
186
+ maxFrames: {
187
+ description: `Max frames to return after filtering (top-down). Default ${DEFAULT_MAX_FRAMES}, max ${MAX_FRAMES_CEILING}.`,
188
+ type: 'number',
189
+ },
190
+ metroUrl: {
191
+ description: `Base URL of the Metro dev server. Overrides the URL reported by the connected client. Default "http://localhost:8081".`,
192
+ type: 'string',
193
+ },
194
+ stack: {
195
+ description: 'Raw stack trace string (e.g. from an Error.stack). Parsed into frames.',
196
+ type: 'string',
197
+ },
198
+ },
199
+ timeout: METRO_TIMEOUT_MS + 1_000,
200
+ };
201
+ };
202
+ exports.symbolicateTool = symbolicateTool;
203
+ //# sourceMappingURL=symbolicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolicate.js","sourceRoot":"","sources":["../../../../src/server/metro/tools/symbolicate.ts"],"names":[],"mappings":";;;AACA,oEAAiE;AAEjE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAa/B;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAgB,EAAE;IACvD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,oDAAoD,CAAC;IACrE,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YACtC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;YACf,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YAC1C,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAErC,MAAM,WAAW,GAAG,6BAA6B,CAAC;IAClD,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YACtC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;YACf,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YAC1C,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,IAAwB,EAAE,GAAW,EAAsB,EAAE;IAClF,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,CACjB,MAAuB,EACvB,IAA0E,EAC5D,EAAE;IAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB;QACpC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAClB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAC1B,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;YAAE,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;QACpE,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACxE,IAAI,CAAC,CAAC,UAAU;YAAE,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEK,MAAM,eAAe,GAAG,GAAoB,EAAE;IACnD,OAAO;QACL,WAAW,EAAE;;;;;;mBAME,kBAAkB;;8DAEyB;QAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2B,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAkC,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAA,iCAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAE5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,KAAK,IAAI,CAAC;YAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,CAAC,EACD,IAAI,CAAC,GAAG,CACN,kBAAkB,EAClB,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB,CACrF,CACF,CAAC;YACF,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;YAE5D,IAAI,SAAuB,CAAC;YAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,SAAS,GAAG,MAAM,CAAC;YACrB,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC;YACxE,CAAC;YAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC9E,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,cAAc,EAAE;oBACjD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBAC1C,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBACH,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,OAAO;wBACL,KAAK,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE;wBACtC,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC;wBACvC,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgC,CAAC;gBAC/D,MAAM,QAAQ,GAAoB,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;gBAC1D,MAAM,WAAW,GAAG,gBAAgB;oBAClC,CAAC,CAAC,QAAQ,CAAC,MAAM;oBACjB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;wBACpB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACrB,CAAC,CAAC,CAAC,MAAM,CAAC;gBACd,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAKR,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,CAAC,sBAAsB,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;gBAChE,CAAC;gBACD,IAAI,WAAW,GAAG,OAAO,CAAC,MAAM;oBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,KAAK,EAAE,YAAY,QAAQ,iBAAkB,GAAa,CAAC,OAAO,EAAE;oBACpE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC;oBACvC,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;QACD,WAAW,EAAE;YACX,QAAQ,EAAE;gBACR,WAAW,EACT,wIAAwI;gBAC1I,IAAI,EAAE,QAAQ;aACf;YACD,MAAM,EAAE;gBACN,WAAW,EACT,yHAAyH;gBAC3H,QAAQ,EAAE;oBACR;wBACE;4BACE,MAAM,EAAE,EAAE;4BACV,IAAI,EAAE,oCAAoC;4BAC1C,UAAU,EAAE,IAAI;4BAChB,UAAU,EAAE,QAAQ;yBACrB;qBACF;iBACF;gBACD,IAAI,EAAE,OAAO;aACd;YACD,SAAS,EAAE;gBACT,WAAW,EACT,2FAA2F;gBAC7F,IAAI,EAAE,SAAS;aAChB;YACD,sBAAsB,EAAE;gBACtB,WAAW,EACT,+IAA+I;gBACjJ,IAAI,EAAE,SAAS;aAChB;YACD,SAAS,EAAE;gBACT,WAAW,EAAE,4DAA4D,kBAAkB,SAAS,kBAAkB,GAAG;gBACzH,IAAI,EAAE,QAAQ;aACf;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,wHAAwH;gBACrI,IAAI,EAAE,QAAQ;aACf;YACD,KAAK,EAAE;gBACL,WAAW,EAAE,wEAAwE;gBACrF,IAAI,EAAE,QAAQ;aACf;SACF;QACD,OAAO,EAAE,gBAAgB,GAAG,KAAK;KAClC,CAAC;AACJ,CAAC,CAAC;AApIW,QAAA,eAAe,mBAoI1B"}
@@ -24,6 +24,19 @@ export interface ModuleDescriptor {
24
24
  tools: ModuleToolDescriptor[];
25
25
  description?: string;
26
26
  }
27
+ /**
28
+ * Metro dev-server origin the app was loaded from, detected in the client via
29
+ * `getDevServer()` (`react-native/Libraries/Core/Devtools/getDevServer`).
30
+ * Absent in production builds (where the bundle is loaded from disk) and when
31
+ * detection fails. Server-side `metro__*` tools (symbolicate, reload, etc.)
32
+ * use this instead of hardcoding `localhost:8081`.
33
+ */
34
+ export interface DevServerInfo {
35
+ bundleLoadedFromServer: boolean;
36
+ host: string;
37
+ port: number;
38
+ url: string;
39
+ }
27
40
  export interface RegistrationMessage {
28
41
  modules: ModuleDescriptor[];
29
42
  protocolVersion: number;
@@ -31,6 +44,7 @@ export interface RegistrationMessage {
31
44
  appName?: string;
32
45
  appVersion?: string;
33
46
  bundleId?: string;
47
+ devServer?: DevServerInfo;
34
48
  deviceId?: string;
35
49
  label?: string;
36
50
  platform?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,yDAAyD;AACzD,eAAO,MAAM,cAAc,gBAAkD,CAAC;AAE9E;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,2FAA2F;AAC3F,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAI/C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,kBAAkB,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;CACtB;AAID,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;CACtB;AAID,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAID,MAAM,MAAM,aAAa,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,YAAY,GACZ,qBAAqB,CAAC;AAE1B,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG,WAAW,GAAG,sBAAsB,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/shared/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared `slice` input shape for tools that expose a slice-style window into
3
+ * a time-ordered buffer. Two-tuple mirrors `Array.prototype.slice(start, end?)`:
4
+ * negative indices count from the end, so [-10] = last ten, [-20, -10] = the
5
+ * ten before those, [0, 50] = the oldest fifty.
6
+ */
7
+ export type SliceInput = [number] | [number, number];
8
+ /**
9
+ * Coerce a tool-argument value to a well-formed SliceInput, or undefined when
10
+ * the input is missing/malformed. Callers pick their own default behavior
11
+ * (typically either "return all" or "last N").
12
+ */
13
+ export declare const parseSliceArg: (raw: unknown) => SliceInput | undefined;
14
+ export declare const applySlice: <T>(arr: T[], slice: SliceInput | undefined) => T[];
15
+ export declare const sliceSchemaDescription: (defaultHint: string) => string;
16
+ //# sourceMappingURL=slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/shared/slice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAS,OAAO,KAAG,UAAU,GAAG,SAOzD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,OAAO,CAAC,EAAE,SAAS,UAAU,GAAG,SAAS,KAAG,CAAC,EAIxE,CAAC;AAEF,eAAO,MAAM,sBAAsB,gBAAiB,MAAM,KAAG,MAE5D,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sliceSchemaDescription = exports.applySlice = exports.parseSliceArg = void 0;
4
+ /**
5
+ * Coerce a tool-argument value to a well-formed SliceInput, or undefined when
6
+ * the input is missing/malformed. Callers pick their own default behavior
7
+ * (typically either "return all" or "last N").
8
+ */
9
+ const parseSliceArg = (raw) => {
10
+ if (!Array.isArray(raw) || raw.length === 0 || typeof raw[0] !== 'number') {
11
+ return undefined;
12
+ }
13
+ const start = raw[0];
14
+ const end = typeof raw[1] === 'number' ? raw[1] : undefined;
15
+ return end === undefined ? [start] : [start, end];
16
+ };
17
+ exports.parseSliceArg = parseSliceArg;
18
+ const applySlice = (arr, slice) => {
19
+ if (!slice)
20
+ return arr;
21
+ const [start, end] = slice;
22
+ return end === undefined ? arr.slice(start) : arr.slice(start, end);
23
+ };
24
+ exports.applySlice = applySlice;
25
+ const sliceSchemaDescription = (defaultHint) => {
26
+ return `[start, end?] window over the returned list (Array.prototype.slice semantics, negative indices count from the end). ${defaultHint} Examples: [-10] for the newest ten, [-20, -10] for the ten before those, [0, 50] for the oldest fifty.`;
27
+ };
28
+ exports.sliceSchemaDescription = sliceSchemaDescription;
29
+ //# sourceMappingURL=slice.js.map