devlens-mcp 0.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.
Files changed (175) hide show
  1. package/.claude/settings.json +12 -0
  2. package/.claude/settings.local.json +17 -0
  3. package/INSTALLATION_GUIDE.md +354 -0
  4. package/QUICK_START.md +153 -0
  5. package/README.md +354 -0
  6. package/bin/cli.ts +22 -0
  7. package/bin/register.ts +96 -0
  8. package/dist/bin/cli.d.ts +3 -0
  9. package/dist/bin/cli.d.ts.map +1 -0
  10. package/dist/bin/cli.js +20 -0
  11. package/dist/bin/cli.js.map +1 -0
  12. package/dist/bin/register.d.ts +10 -0
  13. package/dist/bin/register.d.ts.map +1 -0
  14. package/dist/bin/register.js +92 -0
  15. package/dist/bin/register.js.map +1 -0
  16. package/dist/src/config/devlens-config.d.ts +92 -0
  17. package/dist/src/config/devlens-config.d.ts.map +1 -0
  18. package/dist/src/config/devlens-config.js +70 -0
  19. package/dist/src/config/devlens-config.js.map +1 -0
  20. package/dist/src/index.d.ts +35 -0
  21. package/dist/src/index.d.ts.map +1 -0
  22. package/dist/src/index.js +8 -0
  23. package/dist/src/index.js.map +1 -0
  24. package/dist/src/metro/cdp-client.d.ts +48 -0
  25. package/dist/src/metro/cdp-client.d.ts.map +1 -0
  26. package/dist/src/metro/cdp-client.js +127 -0
  27. package/dist/src/metro/cdp-client.js.map +1 -0
  28. package/dist/src/metro/log-collector.d.ts +30 -0
  29. package/dist/src/metro/log-collector.d.ts.map +1 -0
  30. package/dist/src/metro/log-collector.js +114 -0
  31. package/dist/src/metro/log-collector.js.map +1 -0
  32. package/dist/src/metro/metro-bridge.d.ts +56 -0
  33. package/dist/src/metro/metro-bridge.d.ts.map +1 -0
  34. package/dist/src/metro/metro-bridge.js +255 -0
  35. package/dist/src/metro/metro-bridge.js.map +1 -0
  36. package/dist/src/metro/network-inspector.d.ts +34 -0
  37. package/dist/src/metro/network-inspector.d.ts.map +1 -0
  38. package/dist/src/metro/network-inspector.js +100 -0
  39. package/dist/src/metro/network-inspector.js.map +1 -0
  40. package/dist/src/platform/android/adb.d.ts +50 -0
  41. package/dist/src/platform/android/adb.d.ts.map +1 -0
  42. package/dist/src/platform/android/adb.js +137 -0
  43. package/dist/src/platform/android/adb.js.map +1 -0
  44. package/dist/src/platform/android/android-device.d.ts +21 -0
  45. package/dist/src/platform/android/android-device.d.ts.map +1 -0
  46. package/dist/src/platform/android/android-device.js +94 -0
  47. package/dist/src/platform/android/android-device.js.map +1 -0
  48. package/dist/src/platform/android/ui-automator.d.ts +17 -0
  49. package/dist/src/platform/android/ui-automator.d.ts.map +1 -0
  50. package/dist/src/platform/android/ui-automator.js +126 -0
  51. package/dist/src/platform/android/ui-automator.js.map +1 -0
  52. package/dist/src/platform/device-manager.d.ts +28 -0
  53. package/dist/src/platform/device-manager.d.ts.map +1 -0
  54. package/dist/src/platform/device-manager.js +185 -0
  55. package/dist/src/platform/device-manager.js.map +1 -0
  56. package/dist/src/platform/device.d.ts +86 -0
  57. package/dist/src/platform/device.d.ts.map +1 -0
  58. package/dist/src/platform/device.js +7 -0
  59. package/dist/src/platform/device.js.map +1 -0
  60. package/dist/src/platform/ios/accessibility.d.ts +17 -0
  61. package/dist/src/platform/ios/accessibility.d.ts.map +1 -0
  62. package/dist/src/platform/ios/accessibility.js +159 -0
  63. package/dist/src/platform/ios/accessibility.js.map +1 -0
  64. package/dist/src/platform/ios/ios-device.d.ts +22 -0
  65. package/dist/src/platform/ios/ios-device.d.ts.map +1 -0
  66. package/dist/src/platform/ios/ios-device.js +97 -0
  67. package/dist/src/platform/ios/ios-device.js.map +1 -0
  68. package/dist/src/platform/ios/simctl.d.ts +54 -0
  69. package/dist/src/platform/ios/simctl.d.ts.map +1 -0
  70. package/dist/src/platform/ios/simctl.js +192 -0
  71. package/dist/src/platform/ios/simctl.js.map +1 -0
  72. package/dist/src/server.d.ts +3 -0
  73. package/dist/src/server.d.ts.map +1 -0
  74. package/dist/src/server.js +176 -0
  75. package/dist/src/server.js.map +1 -0
  76. package/dist/src/snapshot/formatter.d.ts +18 -0
  77. package/dist/src/snapshot/formatter.d.ts.map +1 -0
  78. package/dist/src/snapshot/formatter.js +86 -0
  79. package/dist/src/snapshot/formatter.js.map +1 -0
  80. package/dist/src/snapshot/ref-registry.d.ts +67 -0
  81. package/dist/src/snapshot/ref-registry.d.ts.map +1 -0
  82. package/dist/src/snapshot/ref-registry.js +169 -0
  83. package/dist/src/snapshot/ref-registry.js.map +1 -0
  84. package/dist/src/snapshot/snapshot-differ.d.ts +57 -0
  85. package/dist/src/snapshot/snapshot-differ.d.ts.map +1 -0
  86. package/dist/src/snapshot/snapshot-differ.js +153 -0
  87. package/dist/src/snapshot/snapshot-differ.js.map +1 -0
  88. package/dist/src/tools/app-tools.d.ts +71 -0
  89. package/dist/src/tools/app-tools.d.ts.map +1 -0
  90. package/dist/src/tools/app-tools.js +97 -0
  91. package/dist/src/tools/app-tools.js.map +1 -0
  92. package/dist/src/tools/device-tools.d.ts +53 -0
  93. package/dist/src/tools/device-tools.d.ts.map +1 -0
  94. package/dist/src/tools/device-tools.js +86 -0
  95. package/dist/src/tools/device-tools.js.map +1 -0
  96. package/dist/src/tools/ds-tools.d.ts +65 -0
  97. package/dist/src/tools/ds-tools.d.ts.map +1 -0
  98. package/dist/src/tools/ds-tools.js +314 -0
  99. package/dist/src/tools/ds-tools.js.map +1 -0
  100. package/dist/src/tools/interaction-tools.d.ts +248 -0
  101. package/dist/src/tools/interaction-tools.d.ts.map +1 -0
  102. package/dist/src/tools/interaction-tools.js +391 -0
  103. package/dist/src/tools/interaction-tools.js.map +1 -0
  104. package/dist/src/tools/metro-tools.d.ts +115 -0
  105. package/dist/src/tools/metro-tools.d.ts.map +1 -0
  106. package/dist/src/tools/metro-tools.js +270 -0
  107. package/dist/src/tools/metro-tools.js.map +1 -0
  108. package/dist/src/tools/navigation-tools.d.ts +36 -0
  109. package/dist/src/tools/navigation-tools.d.ts.map +1 -0
  110. package/dist/src/tools/navigation-tools.js +60 -0
  111. package/dist/src/tools/navigation-tools.js.map +1 -0
  112. package/dist/src/tools/screenshot-tools.d.ts +298 -0
  113. package/dist/src/tools/screenshot-tools.d.ts.map +1 -0
  114. package/dist/src/tools/screenshot-tools.js +565 -0
  115. package/dist/src/tools/screenshot-tools.js.map +1 -0
  116. package/dist/src/tools/snapshot-tools.d.ts +161 -0
  117. package/dist/src/tools/snapshot-tools.d.ts.map +1 -0
  118. package/dist/src/tools/snapshot-tools.js +479 -0
  119. package/dist/src/tools/snapshot-tools.js.map +1 -0
  120. package/dist/src/utils/image-preprocess.d.ts +49 -0
  121. package/dist/src/utils/image-preprocess.d.ts.map +1 -0
  122. package/dist/src/utils/image-preprocess.js +322 -0
  123. package/dist/src/utils/image-preprocess.js.map +1 -0
  124. package/dist/src/utils/retry.d.ts +21 -0
  125. package/dist/src/utils/retry.d.ts.map +1 -0
  126. package/dist/src/utils/retry.js +33 -0
  127. package/dist/src/utils/retry.js.map +1 -0
  128. package/dist/src/visual/comparator.d.ts +51 -0
  129. package/dist/src/visual/comparator.d.ts.map +1 -0
  130. package/dist/src/visual/comparator.js +119 -0
  131. package/dist/src/visual/comparator.js.map +1 -0
  132. package/dist/src/visual/layout-analyzer.d.ts +64 -0
  133. package/dist/src/visual/layout-analyzer.d.ts.map +1 -0
  134. package/dist/src/visual/layout-analyzer.js +198 -0
  135. package/dist/src/visual/layout-analyzer.js.map +1 -0
  136. package/dist/src/visual/screenshot.d.ts +17 -0
  137. package/dist/src/visual/screenshot.d.ts.map +1 -0
  138. package/dist/src/visual/screenshot.js +39 -0
  139. package/dist/src/visual/screenshot.js.map +1 -0
  140. package/docs/figma-workflow.md +289 -0
  141. package/docs/setup-guide.md +360 -0
  142. package/docs/tool-reference.md +622 -0
  143. package/package.json +57 -0
  144. package/src/config/devlens-config.ts +76 -0
  145. package/src/index.ts +5 -0
  146. package/src/metro/cdp-client.ts +160 -0
  147. package/src/metro/log-collector.ts +137 -0
  148. package/src/metro/metro-bridge.ts +307 -0
  149. package/src/metro/network-inspector.ts +134 -0
  150. package/src/platform/android/adb.ts +200 -0
  151. package/src/platform/android/android-device.ts +116 -0
  152. package/src/platform/android/ui-automator.ts +141 -0
  153. package/src/platform/device-manager.ts +229 -0
  154. package/src/platform/device.ts +110 -0
  155. package/src/platform/ios/accessibility.ts +189 -0
  156. package/src/platform/ios/ios-device.ts +116 -0
  157. package/src/platform/ios/simctl.ts +244 -0
  158. package/src/server.ts +228 -0
  159. package/src/snapshot/formatter.ts +102 -0
  160. package/src/snapshot/ref-registry.ts +230 -0
  161. package/src/snapshot/snapshot-differ.ts +220 -0
  162. package/src/tools/app-tools.ts +111 -0
  163. package/src/tools/device-tools.ts +96 -0
  164. package/src/tools/ds-tools.ts +395 -0
  165. package/src/tools/interaction-tools.ts +467 -0
  166. package/src/tools/metro-tools.ts +320 -0
  167. package/src/tools/navigation-tools.ts +71 -0
  168. package/src/tools/screenshot-tools.ts +698 -0
  169. package/src/tools/snapshot-tools.ts +585 -0
  170. package/src/utils/image-preprocess.ts +430 -0
  171. package/src/utils/retry.ts +51 -0
  172. package/src/visual/comparator.ts +191 -0
  173. package/src/visual/layout-analyzer.ts +283 -0
  174. package/src/visual/screenshot.ts +49 -0
  175. package/tsconfig.json +20 -0
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.metroToolSchemas = void 0;
4
+ exports.createMetroToolHandlers = createMetroToolHandlers;
5
+ const zod_1 = require("zod");
6
+ const metro_bridge_js_1 = require("../metro/metro-bridge.js");
7
+ const retry_js_1 = require("../utils/retry.js");
8
+ exports.metroToolSchemas = {
9
+ devlens_metro_status: {
10
+ description: "Check if the Metro bundler is running and healthy. Reports connection state, port, and packager status. Use this proactively before Metro-dependent operations, or when the app seems stuck or unresponsive.",
11
+ parameters: zod_1.z.object({}),
12
+ },
13
+ devlens_metro_logs: {
14
+ description: "Get console log output from the React Native app via Metro bundler. Shows console.log, console.warn, console.error messages from your app code. Requires Metro bundler to be running.",
15
+ parameters: zod_1.z.object({
16
+ level: zod_1.z
17
+ .enum(["error", "warn", "info", "debug"])
18
+ .optional()
19
+ .describe("Minimum log level to include. 'error' shows only errors, 'warn' includes warnings, 'info' includes info+log, 'debug' includes everything."),
20
+ since: zod_1.z
21
+ .string()
22
+ .optional()
23
+ .describe("Only show logs after this ISO timestamp (e.g., from a previous call). Omit to get all buffered logs."),
24
+ }),
25
+ },
26
+ devlens_component_tree: {
27
+ description: "Get the React component hierarchy of the running app. Shows component names (like <HomeScreen>, <ProductCard>), their props, and nesting structure. Requires React DevTools hook to be available (__DEV__ mode).",
28
+ parameters: zod_1.z.object({
29
+ depth: zod_1.z
30
+ .number()
31
+ .default(10)
32
+ .describe("Maximum depth of the component tree to return (default: 10)"),
33
+ }),
34
+ },
35
+ devlens_hot_reload: {
36
+ description: "Trigger a hot reload / fast refresh of the React Native app. Call this after modifying source code to see changes on the device without a full rebuild.",
37
+ parameters: zod_1.z.object({}),
38
+ },
39
+ devlens_network_requests: {
40
+ description: "List network requests (fetch/XHR) made by the React Native app. Shows URLs, methods, status codes, and timing. Useful for debugging API calls.",
41
+ parameters: zod_1.z.object({
42
+ urlPattern: zod_1.z
43
+ .string()
44
+ .optional()
45
+ .describe("Filter requests by URL substring (e.g., '/api/' or 'graphql')"),
46
+ }),
47
+ },
48
+ devlens_dismiss_overlays: {
49
+ description: "Dismiss React Native debug overlays (LogBox warnings, dev menu banners) that interfere with screenshots and visual comparisons. Suppresses LogBox via CDP and optionally presses Back to close modal overlays.",
50
+ parameters: zod_1.z.object({
51
+ suppressLogBox: zod_1.z
52
+ .boolean()
53
+ .default(true)
54
+ .describe("Suppress LogBox warnings/errors via JavaScript injection (default: true)"),
55
+ pressBack: zod_1.z
56
+ .boolean()
57
+ .default(false)
58
+ .describe("Press the device Back button to dismiss modal overlays like the dev menu (default: false)"),
59
+ }),
60
+ },
61
+ };
62
+ function createMetroToolHandlers(metroPort, deviceManager) {
63
+ let bridge = null;
64
+ async function ensureConnected() {
65
+ if (bridge && bridge.connected)
66
+ return bridge;
67
+ bridge = new metro_bridge_js_1.MetroBridge(metroPort);
68
+ // Check if Metro is even running before attempting CDP connection
69
+ const status = await bridge.getStatus();
70
+ if (!status.running) {
71
+ throw new Error(`Metro bundler is not running on port ${metroPort}. ` +
72
+ `${status.error || ""}\n` +
73
+ `Start it with: npx react-native start\n` +
74
+ `Check status with: devlens_metro_status`);
75
+ }
76
+ try {
77
+ await (0, retry_js_1.retry)(() => bridge.connect(), {
78
+ maxAttempts: 2,
79
+ delayMs: 1000,
80
+ backoff: true,
81
+ });
82
+ }
83
+ catch (error) {
84
+ throw new Error(`Metro is running but CDP connection failed on port ${metroPort}. ` +
85
+ `This can happen if another debugger is already connected. Error: ${error.message}`);
86
+ }
87
+ return bridge;
88
+ }
89
+ return {
90
+ devlens_metro_status: async () => {
91
+ const probe = new metro_bridge_js_1.MetroBridge(metroPort);
92
+ const status = await probe.getStatus();
93
+ const lines = [
94
+ `Metro Port: ${status.port}`,
95
+ `Packager Running: ${status.running ? "YES" : "NO"}`,
96
+ `Packager Status: ${status.packagerStatus || "(no response)"}`,
97
+ `CDP Connected: ${bridge?.connected ? "YES" : "NO"}`,
98
+ ];
99
+ if (status.error) {
100
+ lines.push("", `Error: ${status.error}`);
101
+ lines.push("", "Suggestion: Run 'npx react-native start' to start Metro.");
102
+ }
103
+ else if (status.running) {
104
+ lines.push("", "Metro is healthy and ready.");
105
+ }
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: lines.join("\n"),
111
+ },
112
+ ],
113
+ ...(status.running ? {} : { isError: true }),
114
+ };
115
+ },
116
+ devlens_metro_logs: async (params) => {
117
+ const b = await ensureConnected();
118
+ const logs = b.logCollector.getLogs({
119
+ level: params.level,
120
+ since: params.since ? new Date(params.since).getTime() : undefined,
121
+ limit: 100,
122
+ });
123
+ if (logs.length === 0) {
124
+ return {
125
+ content: [
126
+ {
127
+ type: "text",
128
+ text: "No console logs captured. Logs appear as the app runs and calls console.log/warn/error.",
129
+ },
130
+ ],
131
+ };
132
+ }
133
+ const lines = logs.map((log) => {
134
+ const time = new Date(log.timestamp).toISOString().slice(11, 23);
135
+ const prefix = log.level === "error"
136
+ ? "ERROR"
137
+ : log.level === "warn"
138
+ ? "WARN "
139
+ : log.level === "debug"
140
+ ? "DEBUG"
141
+ : "LOG ";
142
+ return `[${time}] ${prefix} ${log.message}`;
143
+ });
144
+ return {
145
+ content: [
146
+ {
147
+ type: "text",
148
+ text: `Metro logs (${logs.length} entries):\n\n${lines.join("\n")}`,
149
+ },
150
+ ],
151
+ };
152
+ },
153
+ devlens_component_tree: async (params) => {
154
+ const b = await ensureConnected();
155
+ try {
156
+ const tree = await b.getComponentTree(params.depth);
157
+ return {
158
+ content: [
159
+ {
160
+ type: "text",
161
+ text: `React Component Tree:\n\n${tree}`,
162
+ },
163
+ ],
164
+ };
165
+ }
166
+ catch (error) {
167
+ return {
168
+ content: [
169
+ {
170
+ type: "text",
171
+ text: `Could not retrieve component tree: ${error.message}\n\nEnsure the app is running in __DEV__ mode and React DevTools hook is available.`,
172
+ },
173
+ ],
174
+ isError: true,
175
+ };
176
+ }
177
+ },
178
+ devlens_hot_reload: async () => {
179
+ const b = await ensureConnected();
180
+ await b.hotReload();
181
+ // Wait a moment for the reload to take effect
182
+ await new Promise((resolve) => setTimeout(resolve, 1500));
183
+ return {
184
+ content: [
185
+ {
186
+ type: "text",
187
+ text: "Hot reload triggered. The app should reflect your latest code changes.",
188
+ },
189
+ ],
190
+ };
191
+ },
192
+ devlens_network_requests: async (params) => {
193
+ const b = await ensureConnected();
194
+ const requests = b.networkInspector.getRequests(params.urlPattern);
195
+ if (requests.length === 0) {
196
+ return {
197
+ content: [
198
+ {
199
+ type: "text",
200
+ text: params.urlPattern
201
+ ? `No network requests matching "${params.urlPattern}" found.`
202
+ : "No network requests captured yet. Requests appear as the app makes fetch/XHR calls.",
203
+ },
204
+ ],
205
+ };
206
+ }
207
+ const lines = requests.slice(0, 50).map((req) => {
208
+ const status = req.error
209
+ ? `FAIL (${req.error})`
210
+ : req.status
211
+ ? `${req.status}`
212
+ : "pending";
213
+ const duration = req.duration ? `${req.duration}ms` : "...";
214
+ const size = req.size ? `${(req.size / 1024).toFixed(1)}KB` : "";
215
+ return `${req.method} ${status} ${duration} ${size} ${req.url}`;
216
+ });
217
+ return {
218
+ content: [
219
+ {
220
+ type: "text",
221
+ text: `Network requests (${requests.length} total, showing up to 50):\n\n${lines.join("\n")}`,
222
+ },
223
+ ],
224
+ };
225
+ },
226
+ devlens_dismiss_overlays: async (params) => {
227
+ const results = [];
228
+ if (params.suppressLogBox) {
229
+ try {
230
+ const b = await ensureConnected();
231
+ const jsCode = `(function() {
232
+ var r = [];
233
+ try { require('react-native').LogBox.ignoreAllLogs(true); r.push('LogBox suppressed'); } catch(e) {}
234
+ try { require('react-native/Libraries/LogBox/LogBox').uninstall(); r.push('LogBox uninstalled'); } catch(e) {}
235
+ try {
236
+ var DevSettings = require('react-native').DevSettings || require('react-native/Libraries/Utilities/DevSettings');
237
+ if (DevSettings && DevSettings.setHotLoadingEnabled) { DevSettings.setHotLoadingEnabled(false); }
238
+ r.push('DevSettings accessed');
239
+ } catch(e) {}
240
+ return r.join('; ') || 'No LogBox APIs found';
241
+ })()`;
242
+ const evalResult = await b.evaluate(jsCode);
243
+ results.push(typeof evalResult === "string" ? evalResult : "LogBox suppression attempted");
244
+ }
245
+ catch (error) {
246
+ results.push(`LogBox suppression failed: ${error.message}`);
247
+ }
248
+ }
249
+ if (params.pressBack) {
250
+ try {
251
+ const device = await deviceManager.getDevice();
252
+ await device.pressButton("back");
253
+ results.push("Back button pressed (dismiss modal overlay)");
254
+ }
255
+ catch (error) {
256
+ results.push(`Back button failed: ${error.message}`);
257
+ }
258
+ }
259
+ return {
260
+ content: [
261
+ {
262
+ type: "text",
263
+ text: `Overlay dismissal:\n${results.map((r) => ` - ${r}`).join("\n")}`,
264
+ },
265
+ ],
266
+ };
267
+ },
268
+ };
269
+ }
270
+ //# sourceMappingURL=metro-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metro-tools.js","sourceRoot":"","sources":["../../../src/tools/metro-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import type { DeviceManager } from "../platform/device-manager.js";
3
+ import type { RefRegistry } from "../snapshot/ref-registry.js";
4
+ export declare const navigationToolSchemas: {
5
+ devlens_open_url: {
6
+ description: string;
7
+ parameters: z.ZodObject<{
8
+ url: z.ZodString;
9
+ }, "strip", z.ZodTypeAny, {
10
+ url: string;
11
+ }, {
12
+ url: string;
13
+ }>;
14
+ };
15
+ devlens_go_back: {
16
+ description: string;
17
+ parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
18
+ };
19
+ };
20
+ export declare function createNavigationToolHandlers(deviceManager: DeviceManager, refRegistry: RefRegistry, onNavigate?: () => void): {
21
+ devlens_open_url: (params: {
22
+ url: string;
23
+ }) => Promise<{
24
+ content: {
25
+ type: "text";
26
+ text: string;
27
+ }[];
28
+ }>;
29
+ devlens_go_back: () => Promise<{
30
+ content: {
31
+ type: "text";
32
+ text: string;
33
+ }[];
34
+ }>;
35
+ };
36
+ //# sourceMappingURL=navigation-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/navigation-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;CAiBjC,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,MAAM,IAAI;+BAWY;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;EAgCnD"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.navigationToolSchemas = void 0;
4
+ exports.createNavigationToolHandlers = createNavigationToolHandlers;
5
+ const zod_1 = require("zod");
6
+ const formatter_js_1 = require("../snapshot/formatter.js");
7
+ exports.navigationToolSchemas = {
8
+ devlens_open_url: {
9
+ description: "Open a URL on the device. Supports deep links (e.g., myapp://screen/home), web URLs, and universal links.",
10
+ parameters: zod_1.z.object({
11
+ url: zod_1.z
12
+ .string()
13
+ .describe("URL to open (e.g., 'https://example.com' or 'myapp://screen/profile')"),
14
+ }),
15
+ },
16
+ devlens_go_back: {
17
+ description: "Navigate back on the device. On Android, presses the system back button. On iOS, performs a back swipe gesture.",
18
+ parameters: zod_1.z.object({}),
19
+ },
20
+ };
21
+ function createNavigationToolHandlers(deviceManager, refRegistry, onNavigate) {
22
+ async function getUpdatedSnapshot() {
23
+ const device = await deviceManager.getDevice();
24
+ await new Promise((resolve) => setTimeout(resolve, 500));
25
+ const snapshot = await device.getSnapshot();
26
+ const nodeToRef = refRegistry.assignRefs(snapshot);
27
+ return (0, formatter_js_1.formatSnapshot)(snapshot, nodeToRef);
28
+ }
29
+ return {
30
+ devlens_open_url: async (params) => {
31
+ const device = await deviceManager.getDevice();
32
+ await device.openUrl(params.url);
33
+ onNavigate?.();
34
+ const snapshot = await getUpdatedSnapshot();
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Opened URL: ${params.url}\n\n${snapshot}`,
40
+ },
41
+ ],
42
+ };
43
+ },
44
+ devlens_go_back: async () => {
45
+ const device = await deviceManager.getDevice();
46
+ await device.pressButton("back");
47
+ onNavigate?.();
48
+ const snapshot = await getUpdatedSnapshot();
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: `Navigated back\n\n${snapshot}`,
54
+ },
55
+ ],
56
+ };
57
+ },
58
+ };
59
+ }
60
+ //# sourceMappingURL=navigation-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-tools.js","sourceRoot":"","sources":["../../../src/tools/navigation-tools.ts"],"names":[],"mappings":";;;AAwBA,oEA8CC;AAtED,6BAAwB;AAGxB,2DAA0D;AAE7C,QAAA,qBAAqB,GAAG;IACnC,gBAAgB,EAAE;QAChB,WAAW,EACT,2GAA2G;QAC7G,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,GAAG,EAAE,OAAC;iBACH,MAAM,EAAE;iBACR,QAAQ,CACP,uEAAuE,CACxE;SACJ,CAAC;KACH;IACD,eAAe,EAAE;QACf,WAAW,EACT,iHAAiH;QACnH,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB;CACF,CAAC;AAEF,SAAgB,4BAA4B,CAC1C,aAA4B,EAC5B,WAAwB,EACxB,UAAuB;IAEvB,KAAK,UAAU,kBAAkB;QAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAA,6BAAc,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,KAAK,EAAE,MAAuB,EAAE,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjC,UAAU,EAAE,EAAE,CAAC;YAEf,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,eAAe,MAAM,CAAC,GAAG,OAAO,QAAQ,EAAE;qBACjD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,eAAe,EAAE,KAAK,IAAI,EAAE;YAC1B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,UAAU,EAAE,EAAE,CAAC;YAEf,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,qBAAqB,QAAQ,EAAE;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}