devlens-mcp 0.3.0 → 0.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 (162) hide show
  1. package/README.md +10 -21
  2. package/docs/setup-guide.md +11 -31
  3. package/package.json +1 -1
  4. package/.claude/settings.json +0 -12
  5. package/.claude/settings.local.json +0 -17
  6. package/bin/cli.ts +0 -22
  7. package/bin/register.ts +0 -96
  8. package/dist/src/config/devlens-config.d.ts +0 -92
  9. package/dist/src/config/devlens-config.d.ts.map +0 -1
  10. package/dist/src/config/devlens-config.js +0 -70
  11. package/dist/src/config/devlens-config.js.map +0 -1
  12. package/dist/src/index.d.ts +0 -35
  13. package/dist/src/index.d.ts.map +0 -1
  14. package/dist/src/index.js +0 -8
  15. package/dist/src/index.js.map +0 -1
  16. package/dist/src/metro/cdp-client.d.ts +0 -48
  17. package/dist/src/metro/cdp-client.d.ts.map +0 -1
  18. package/dist/src/metro/cdp-client.js +0 -127
  19. package/dist/src/metro/cdp-client.js.map +0 -1
  20. package/dist/src/metro/log-collector.d.ts +0 -30
  21. package/dist/src/metro/log-collector.d.ts.map +0 -1
  22. package/dist/src/metro/log-collector.js +0 -114
  23. package/dist/src/metro/log-collector.js.map +0 -1
  24. package/dist/src/metro/metro-bridge.d.ts +0 -56
  25. package/dist/src/metro/metro-bridge.d.ts.map +0 -1
  26. package/dist/src/metro/metro-bridge.js +0 -255
  27. package/dist/src/metro/metro-bridge.js.map +0 -1
  28. package/dist/src/metro/network-inspector.d.ts +0 -34
  29. package/dist/src/metro/network-inspector.d.ts.map +0 -1
  30. package/dist/src/metro/network-inspector.js +0 -100
  31. package/dist/src/metro/network-inspector.js.map +0 -1
  32. package/dist/src/platform/android/adb.d.ts +0 -50
  33. package/dist/src/platform/android/adb.d.ts.map +0 -1
  34. package/dist/src/platform/android/adb.js +0 -137
  35. package/dist/src/platform/android/adb.js.map +0 -1
  36. package/dist/src/platform/android/android-device.d.ts +0 -21
  37. package/dist/src/platform/android/android-device.d.ts.map +0 -1
  38. package/dist/src/platform/android/android-device.js +0 -94
  39. package/dist/src/platform/android/android-device.js.map +0 -1
  40. package/dist/src/platform/android/ui-automator.d.ts +0 -17
  41. package/dist/src/platform/android/ui-automator.d.ts.map +0 -1
  42. package/dist/src/platform/android/ui-automator.js +0 -126
  43. package/dist/src/platform/android/ui-automator.js.map +0 -1
  44. package/dist/src/platform/device-manager.d.ts +0 -28
  45. package/dist/src/platform/device-manager.d.ts.map +0 -1
  46. package/dist/src/platform/device-manager.js +0 -185
  47. package/dist/src/platform/device-manager.js.map +0 -1
  48. package/dist/src/platform/device.d.ts +0 -86
  49. package/dist/src/platform/device.d.ts.map +0 -1
  50. package/dist/src/platform/device.js +0 -7
  51. package/dist/src/platform/device.js.map +0 -1
  52. package/dist/src/platform/ios/accessibility.d.ts +0 -17
  53. package/dist/src/platform/ios/accessibility.d.ts.map +0 -1
  54. package/dist/src/platform/ios/accessibility.js +0 -159
  55. package/dist/src/platform/ios/accessibility.js.map +0 -1
  56. package/dist/src/platform/ios/ios-device.d.ts +0 -22
  57. package/dist/src/platform/ios/ios-device.d.ts.map +0 -1
  58. package/dist/src/platform/ios/ios-device.js +0 -97
  59. package/dist/src/platform/ios/ios-device.js.map +0 -1
  60. package/dist/src/platform/ios/simctl.d.ts +0 -54
  61. package/dist/src/platform/ios/simctl.d.ts.map +0 -1
  62. package/dist/src/platform/ios/simctl.js +0 -192
  63. package/dist/src/platform/ios/simctl.js.map +0 -1
  64. package/dist/src/server.d.ts +0 -3
  65. package/dist/src/server.d.ts.map +0 -1
  66. package/dist/src/server.js +0 -176
  67. package/dist/src/server.js.map +0 -1
  68. package/dist/src/snapshot/formatter.d.ts +0 -18
  69. package/dist/src/snapshot/formatter.d.ts.map +0 -1
  70. package/dist/src/snapshot/formatter.js +0 -86
  71. package/dist/src/snapshot/formatter.js.map +0 -1
  72. package/dist/src/snapshot/ref-registry.d.ts +0 -67
  73. package/dist/src/snapshot/ref-registry.d.ts.map +0 -1
  74. package/dist/src/snapshot/ref-registry.js +0 -169
  75. package/dist/src/snapshot/ref-registry.js.map +0 -1
  76. package/dist/src/snapshot/snapshot-differ.d.ts +0 -57
  77. package/dist/src/snapshot/snapshot-differ.d.ts.map +0 -1
  78. package/dist/src/snapshot/snapshot-differ.js +0 -153
  79. package/dist/src/snapshot/snapshot-differ.js.map +0 -1
  80. package/dist/src/tools/app-tools.d.ts +0 -71
  81. package/dist/src/tools/app-tools.d.ts.map +0 -1
  82. package/dist/src/tools/app-tools.js +0 -97
  83. package/dist/src/tools/app-tools.js.map +0 -1
  84. package/dist/src/tools/device-tools.d.ts +0 -53
  85. package/dist/src/tools/device-tools.d.ts.map +0 -1
  86. package/dist/src/tools/device-tools.js +0 -86
  87. package/dist/src/tools/device-tools.js.map +0 -1
  88. package/dist/src/tools/ds-tools.d.ts +0 -65
  89. package/dist/src/tools/ds-tools.d.ts.map +0 -1
  90. package/dist/src/tools/ds-tools.js +0 -314
  91. package/dist/src/tools/ds-tools.js.map +0 -1
  92. package/dist/src/tools/interaction-tools.d.ts +0 -248
  93. package/dist/src/tools/interaction-tools.d.ts.map +0 -1
  94. package/dist/src/tools/interaction-tools.js +0 -391
  95. package/dist/src/tools/interaction-tools.js.map +0 -1
  96. package/dist/src/tools/metro-tools.d.ts +0 -115
  97. package/dist/src/tools/metro-tools.d.ts.map +0 -1
  98. package/dist/src/tools/metro-tools.js +0 -270
  99. package/dist/src/tools/metro-tools.js.map +0 -1
  100. package/dist/src/tools/navigation-tools.d.ts +0 -36
  101. package/dist/src/tools/navigation-tools.d.ts.map +0 -1
  102. package/dist/src/tools/navigation-tools.js +0 -60
  103. package/dist/src/tools/navigation-tools.js.map +0 -1
  104. package/dist/src/tools/screenshot-tools.d.ts +0 -298
  105. package/dist/src/tools/screenshot-tools.d.ts.map +0 -1
  106. package/dist/src/tools/screenshot-tools.js +0 -565
  107. package/dist/src/tools/screenshot-tools.js.map +0 -1
  108. package/dist/src/tools/snapshot-tools.d.ts +0 -161
  109. package/dist/src/tools/snapshot-tools.d.ts.map +0 -1
  110. package/dist/src/tools/snapshot-tools.js +0 -479
  111. package/dist/src/tools/snapshot-tools.js.map +0 -1
  112. package/dist/src/utils/image-preprocess.d.ts +0 -49
  113. package/dist/src/utils/image-preprocess.d.ts.map +0 -1
  114. package/dist/src/utils/image-preprocess.js +0 -322
  115. package/dist/src/utils/image-preprocess.js.map +0 -1
  116. package/dist/src/utils/retry.d.ts +0 -21
  117. package/dist/src/utils/retry.d.ts.map +0 -1
  118. package/dist/src/utils/retry.js +0 -33
  119. package/dist/src/utils/retry.js.map +0 -1
  120. package/dist/src/visual/comparator.d.ts +0 -51
  121. package/dist/src/visual/comparator.d.ts.map +0 -1
  122. package/dist/src/visual/comparator.js +0 -119
  123. package/dist/src/visual/comparator.js.map +0 -1
  124. package/dist/src/visual/layout-analyzer.d.ts +0 -64
  125. package/dist/src/visual/layout-analyzer.d.ts.map +0 -1
  126. package/dist/src/visual/layout-analyzer.js +0 -198
  127. package/dist/src/visual/layout-analyzer.js.map +0 -1
  128. package/dist/src/visual/screenshot.d.ts +0 -17
  129. package/dist/src/visual/screenshot.d.ts.map +0 -1
  130. package/dist/src/visual/screenshot.js +0 -39
  131. package/dist/src/visual/screenshot.js.map +0 -1
  132. package/src/config/devlens-config.ts +0 -76
  133. package/src/index.ts +0 -5
  134. package/src/metro/cdp-client.ts +0 -160
  135. package/src/metro/log-collector.ts +0 -137
  136. package/src/metro/metro-bridge.ts +0 -307
  137. package/src/metro/network-inspector.ts +0 -134
  138. package/src/platform/android/adb.ts +0 -200
  139. package/src/platform/android/android-device.ts +0 -116
  140. package/src/platform/android/ui-automator.ts +0 -141
  141. package/src/platform/device-manager.ts +0 -229
  142. package/src/platform/device.ts +0 -110
  143. package/src/platform/ios/accessibility.ts +0 -189
  144. package/src/platform/ios/ios-device.ts +0 -116
  145. package/src/platform/ios/simctl.ts +0 -244
  146. package/src/server.ts +0 -228
  147. package/src/snapshot/formatter.ts +0 -102
  148. package/src/snapshot/ref-registry.ts +0 -230
  149. package/src/snapshot/snapshot-differ.ts +0 -220
  150. package/src/tools/app-tools.ts +0 -111
  151. package/src/tools/device-tools.ts +0 -96
  152. package/src/tools/ds-tools.ts +0 -395
  153. package/src/tools/interaction-tools.ts +0 -467
  154. package/src/tools/metro-tools.ts +0 -320
  155. package/src/tools/navigation-tools.ts +0 -71
  156. package/src/tools/screenshot-tools.ts +0 -698
  157. package/src/tools/snapshot-tools.ts +0 -585
  158. package/src/utils/image-preprocess.ts +0 -430
  159. package/src/utils/retry.ts +0 -51
  160. package/src/visual/comparator.ts +0 -191
  161. package/src/visual/layout-analyzer.ts +0 -283
  162. package/src/visual/screenshot.ts +0 -49
@@ -1,169 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RefRegistry = void 0;
4
- class RefRegistry {
5
- refMap = new Map();
6
- counter = 0;
7
- /** Clear all refs and reset counter (call before each new snapshot) */
8
- reset() {
9
- this.refMap.clear();
10
- this.counter = 0;
11
- }
12
- /**
13
- * Walk the snapshot tree and assign refs to all interactive or content-bearing nodes.
14
- * Returns a new tree with refs attached (as annotations in the formatter output).
15
- */
16
- assignRefs(root) {
17
- this.reset();
18
- const nodeToRef = new Map();
19
- this.walkAndAssign(root, nodeToRef);
20
- return nodeToRef;
21
- }
22
- walkAndAssign(node, nodeToRef) {
23
- if (this.shouldAssignRef(node)) {
24
- const ref = `e${++this.counter}`;
25
- const centerX = node.bounds.x + node.bounds.width / 2;
26
- const centerY = node.bounds.y + node.bounds.height / 2;
27
- this.refMap.set(ref, {
28
- ref,
29
- node,
30
- centerX,
31
- centerY,
32
- bounds: node.bounds,
33
- });
34
- nodeToRef.set(node, ref);
35
- }
36
- for (const child of node.children) {
37
- this.walkAndAssign(child, nodeToRef);
38
- }
39
- }
40
- /** Determine if a node should get a ref */
41
- shouldAssignRef(node) {
42
- // Skip invisible/zero-size elements
43
- if (node.bounds.width === 0 || node.bounds.height === 0)
44
- return false;
45
- // Always assign refs to interactive elements
46
- if (node.interactive)
47
- return true;
48
- // Assign refs to elements with meaningful text content
49
- if (node.text && node.text.trim().length > 0)
50
- return true;
51
- // Assign refs to elements with accessibility labels
52
- if (node.label && node.label.trim().length > 0)
53
- return true;
54
- // Skip purely structural containers
55
- return false;
56
- }
57
- /** Resolve a ref string to its entry (coordinates + node info) */
58
- resolve(ref) {
59
- return this.refMap.get(ref);
60
- }
61
- /** Get all current ref entries */
62
- getAllRefs() {
63
- return Array.from(this.refMap.values());
64
- }
65
- /** Get the total number of assigned refs */
66
- get size() {
67
- return this.refMap.size;
68
- }
69
- /**
70
- * Validate the snapshot tree for visibility issues.
71
- * Flags zero-size elements that should be visible, explicitly invisible elements,
72
- * and empty containers that might indicate missing content.
73
- */
74
- validateTree(root) {
75
- const issues = [];
76
- let totalNodes = 0;
77
- let visibleNodes = 0;
78
- let interactiveNodes = 0;
79
- let zeroSizeNodes = 0;
80
- const walk = (node) => {
81
- totalNodes++;
82
- const isZeroSize = node.bounds.width === 0 || node.bounds.height === 0;
83
- if (isZeroSize) {
84
- zeroSizeNodes++;
85
- // Only flag if the node has content that SHOULD be visible
86
- if (node.text || node.label || node.interactive) {
87
- issues.push({
88
- type: "zero-size",
89
- nodeType: node.type,
90
- text: node.text,
91
- label: node.label,
92
- resourceId: node.resourceId,
93
- bounds: node.bounds,
94
- detail: `${node.type}${node.text ? ` "${node.text}"` : ""}${node.label ? ` label="${node.label}"` : ""}` +
95
- ` has zero size (${node.bounds.width}x${node.bounds.height}) — renders as invisible`,
96
- });
97
- }
98
- }
99
- else {
100
- visibleNodes++;
101
- }
102
- if (node.visible === false) {
103
- issues.push({
104
- type: "invisible",
105
- nodeType: node.type,
106
- text: node.text,
107
- label: node.label,
108
- resourceId: node.resourceId,
109
- bounds: node.bounds,
110
- detail: `${node.type}${node.text ? ` "${node.text}"` : ""} has visible=false`,
111
- });
112
- }
113
- if (node.interactive)
114
- interactiveNodes++;
115
- // Empty container with a resource ID — likely an intentional component
116
- // that should have content (e.g., missing icon, empty image)
117
- if (node.children.length === 0 &&
118
- node.resourceId &&
119
- !node.text &&
120
- !node.label &&
121
- !isZeroSize) {
122
- issues.push({
123
- type: "empty-container",
124
- nodeType: node.type,
125
- resourceId: node.resourceId,
126
- bounds: node.bounds,
127
- detail: `${node.type} id="${node.resourceId}" is an empty container (no children, no text) — may be a missing icon or placeholder`,
128
- });
129
- }
130
- for (const child of node.children) {
131
- walk(child);
132
- }
133
- };
134
- walk(root);
135
- return { issues, totalNodes, visibleNodes, zeroSizeNodes, interactiveNodes };
136
- }
137
- /**
138
- * Search the full snapshot tree (including zero-size nodes) for text/label matches.
139
- * Used by find_element to detect invisible elements that the refMap skips.
140
- */
141
- findInTree(root, query) {
142
- const matches = [];
143
- const walk = (node) => {
144
- const isZeroSize = node.bounds.width === 0 || node.bounds.height === 0;
145
- if (isZeroSize) {
146
- let matched = false;
147
- if (query.text && node.text) {
148
- matched = node.text
149
- .toLowerCase()
150
- .includes(query.text.toLowerCase());
151
- }
152
- if (query.label && node.label) {
153
- matched =
154
- matched ||
155
- node.label.toLowerCase().includes(query.label.toLowerCase());
156
- }
157
- if (matched)
158
- matches.push(node);
159
- }
160
- for (const child of node.children) {
161
- walk(child);
162
- }
163
- };
164
- walk(root);
165
- return matches;
166
- }
167
- }
168
- exports.RefRegistry = RefRegistry;
169
- //# sourceMappingURL=ref-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ref-registry.js","sourceRoot":"","sources":["../../../src/snapshot/ref-registry.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- import type { SnapshotNode } from "../platform/device.js";
2
- /**
3
- * Incremental snapshot differ — compares two snapshot trees and returns
4
- * only the changed portions. Saves 60-80% tokens in iterative workflows.
5
- */
6
- export interface SnapshotDiff {
7
- /** Nodes that were added since the last snapshot */
8
- added: SnapshotNode[];
9
- /** Nodes that were removed since the last snapshot */
10
- removed: SnapshotNode[];
11
- /** Nodes whose properties changed (text, value, focus, etc.) */
12
- changed: Array<{
13
- node: SnapshotNode;
14
- changes: string[];
15
- }>;
16
- /** Elements that are the same content but moved to a different position */
17
- moved: Array<{
18
- node: SnapshotNode;
19
- from: {
20
- x: number;
21
- y: number;
22
- };
23
- to: {
24
- x: number;
25
- y: number;
26
- };
27
- deltaX: number;
28
- deltaY: number;
29
- }>;
30
- /** Elements that kept position but changed size */
31
- resized: Array<{
32
- node: SnapshotNode;
33
- from: {
34
- width: number;
35
- height: number;
36
- };
37
- to: {
38
- width: number;
39
- height: number;
40
- };
41
- }>;
42
- /** Whether the tree structure changed significantly */
43
- structuralChange: boolean;
44
- }
45
- /**
46
- * Compute a diff between two snapshot trees.
47
- *
48
- * Identity matching: uses content signature (type + resourceId + text + label).
49
- * Elements with matching content but different position are reported as "moved".
50
- * Elements with matching content+position but different size are reported as "resized".
51
- * Elements present in current but not previous are "added".
52
- * Elements present in previous but not current are "removed".
53
- */
54
- export declare function diffSnapshots(previous: SnapshotNode, current: SnapshotNode): SnapshotDiff;
55
- /** Format a diff for LLM consumption */
56
- export declare function formatDiff(diff: SnapshotDiff): string;
57
- //# sourceMappingURL=snapshot-differ.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshot-differ.d.ts","sourceRoot":"","sources":["../../../src/snapshot/snapshot-differ.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,sDAAsD;IACtD,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,YAAY,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,2EAA2E;IAC3E,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,YAAY,CAAC;QACnB,IAAI,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/B,EAAE,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,mDAAmD;IACnD,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,YAAY,CAAC;QACnB,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACxC,EAAE,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACvC,CAAC,CAAC;IACH,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAWD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,YAAY,GACpB,YAAY,CAyEd;AAkCD,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAuDrD"}
@@ -1,153 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.diffSnapshots = diffSnapshots;
4
- exports.formatDiff = formatDiff;
5
- /**
6
- * Content-based signature — used for element identity.
7
- * Intentionally excludes position/size so moved elements are matched
8
- * to their previous version rather than treated as add+remove.
9
- */
10
- function contentSignature(node) {
11
- return [node.type, node.resourceId || "", node.text || "", node.label || ""].join("|");
12
- }
13
- /**
14
- * Compute a diff between two snapshot trees.
15
- *
16
- * Identity matching: uses content signature (type + resourceId + text + label).
17
- * Elements with matching content but different position are reported as "moved".
18
- * Elements with matching content+position but different size are reported as "resized".
19
- * Elements present in current but not previous are "added".
20
- * Elements present in previous but not current are "removed".
21
- */
22
- function diffSnapshots(previous, current) {
23
- const prevNodes = flattenTree(previous);
24
- const currNodes = flattenTree(current);
25
- const prevByContent = new Map();
26
- for (const node of prevNodes) {
27
- prevByContent.set(contentSignature(node), node);
28
- }
29
- const currByContent = new Map();
30
- for (const node of currNodes) {
31
- currByContent.set(contentSignature(node), node);
32
- }
33
- const added = [];
34
- const removed = [];
35
- const changed = [];
36
- const moved = [];
37
- const resized = [];
38
- // Pass 1: find added, moved, resized, changed nodes
39
- for (const [sig, currNode] of currByContent) {
40
- const prevNode = prevByContent.get(sig);
41
- if (!prevNode) {
42
- added.push(currNode);
43
- continue;
44
- }
45
- const posChanged = prevNode.bounds.x !== currNode.bounds.x ||
46
- prevNode.bounds.y !== currNode.bounds.y;
47
- const sizeChanged = prevNode.bounds.width !== currNode.bounds.width ||
48
- prevNode.bounds.height !== currNode.bounds.height;
49
- if (posChanged) {
50
- moved.push({
51
- node: currNode,
52
- from: { x: prevNode.bounds.x, y: prevNode.bounds.y },
53
- to: { x: currNode.bounds.x, y: currNode.bounds.y },
54
- deltaX: currNode.bounds.x - prevNode.bounds.x,
55
- deltaY: currNode.bounds.y - prevNode.bounds.y,
56
- });
57
- }
58
- if (sizeChanged) {
59
- resized.push({
60
- node: currNode,
61
- from: { width: prevNode.bounds.width, height: prevNode.bounds.height },
62
- to: { width: currNode.bounds.width, height: currNode.bounds.height },
63
- });
64
- }
65
- const changes = detectChanges(prevNode, currNode);
66
- if (changes.length > 0) {
67
- changed.push({ node: currNode, changes });
68
- }
69
- }
70
- // Pass 2: find removed nodes
71
- for (const [sig, node] of prevByContent) {
72
- if (!currByContent.has(sig)) {
73
- removed.push(node);
74
- }
75
- }
76
- const structuralChange = added.length > prevNodes.length * 0.3 ||
77
- removed.length > prevNodes.length * 0.3;
78
- return { added, removed, changed, moved, resized, structuralChange };
79
- }
80
- /** Detect property-level changes between two nodes with the same identity */
81
- function detectChanges(prev, curr) {
82
- const changes = [];
83
- if (prev.text !== curr.text) {
84
- changes.push(`text: "${prev.text}" → "${curr.text}"`);
85
- }
86
- if (prev.value !== curr.value) {
87
- changes.push(`value: "${prev.value}" → "${curr.value}"`);
88
- }
89
- if (prev.focused !== curr.focused) {
90
- changes.push(`focused: ${prev.focused} → ${curr.focused}`);
91
- }
92
- if (prev.enabled !== curr.enabled) {
93
- changes.push(`enabled: ${prev.enabled} → ${curr.enabled}`);
94
- }
95
- if (prev.label !== curr.label) {
96
- changes.push(`label: "${prev.label}" → "${curr.label}"`);
97
- }
98
- return changes;
99
- }
100
- /** Flatten a tree into a list of all nodes */
101
- function flattenTree(node) {
102
- const result = [node];
103
- for (const child of node.children) {
104
- result.push(...flattenTree(child));
105
- }
106
- return result;
107
- }
108
- /** Format a diff for LLM consumption */
109
- function formatDiff(diff) {
110
- if (diff.structuralChange) {
111
- return "[Major structural change — use full snapshot]";
112
- }
113
- const lines = [];
114
- if (diff.added.length > 0) {
115
- lines.push("ADDED:");
116
- for (const node of diff.added) {
117
- lines.push(` + ${node.type} ${node.text ? `"${node.text}"` : ""}`);
118
- }
119
- }
120
- if (diff.removed.length > 0) {
121
- lines.push("REMOVED:");
122
- for (const node of diff.removed) {
123
- lines.push(` - ${node.type} ${node.text ? `"${node.text}"` : ""}`);
124
- }
125
- }
126
- if (diff.moved.length > 0) {
127
- lines.push("MOVED:");
128
- for (const m of diff.moved) {
129
- const label = m.node.text ? `"${m.node.text}"` : m.node.type;
130
- const dx = m.deltaX > 0 ? `+${m.deltaX}` : `${m.deltaX}`;
131
- const dy = m.deltaY > 0 ? `+${m.deltaY}` : `${m.deltaY}`;
132
- lines.push(` -> ${label} moved by (${dx}, ${dy})px`);
133
- }
134
- }
135
- if (diff.resized.length > 0) {
136
- lines.push("RESIZED:");
137
- for (const r of diff.resized) {
138
- const label = r.node.text ? `"${r.node.text}"` : r.node.type;
139
- lines.push(` <> ${label}: ${r.from.width}x${r.from.height} → ${r.to.width}x${r.to.height}`);
140
- }
141
- }
142
- if (diff.changed.length > 0) {
143
- lines.push("CHANGED:");
144
- for (const { node, changes } of diff.changed) {
145
- lines.push(` ~ ${node.type} ${node.text ? `"${node.text}"` : ""}: ${changes.join(", ")}`);
146
- }
147
- }
148
- if (lines.length === 0) {
149
- return "[No changes detected]";
150
- }
151
- return lines.join("\n");
152
- }
153
- //# sourceMappingURL=snapshot-differ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshot-differ.js","sourceRoot":"","sources":["../../../src/snapshot/snapshot-differ.ts"],"names":[],"mappings":";;AAqDA,sCA4EC;AAmCD,gCAuDC;AAxLD;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,IAAkB;IAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAC3B,QAAsB,EACtB,OAAqB;IAErB,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEvC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAqD,EAAE,CAAC;IACrE,MAAM,KAAK,GAA0B,EAAE,CAAC;IACxC,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,oDAAoD;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GACd,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAE1C,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,MAAM,CAAC,KAAK;YAC/C,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QAEpD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;gBACpD,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;gBAClD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;gBACtE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;aACrE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GACpB,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG;QACrC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC;IAE1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACvE,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa,CAAC,IAAkB,EAAE,IAAkB;IAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8CAA8C;AAC9C,SAAS,WAAW,CAAC,IAAkB;IACrC,MAAM,MAAM,GAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wCAAwC;AACxC,SAAgB,UAAU,CAAC,IAAkB;IAC3C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,+CAA+C,CAAC;IACzD,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACzD,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,KAAK,CAAC,IAAI,CACR,QAAQ,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CACjF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,71 +0,0 @@
1
- import { z } from "zod";
2
- import type { DeviceManager } from "../platform/device-manager.js";
3
- export declare const appToolSchemas: {
4
- devlens_launch_app: {
5
- description: string;
6
- parameters: z.ZodObject<{
7
- appId: z.ZodString;
8
- }, "strip", z.ZodTypeAny, {
9
- appId: string;
10
- }, {
11
- appId: string;
12
- }>;
13
- };
14
- devlens_terminate_app: {
15
- description: string;
16
- parameters: z.ZodObject<{
17
- appId: z.ZodString;
18
- }, "strip", z.ZodTypeAny, {
19
- appId: string;
20
- }, {
21
- appId: string;
22
- }>;
23
- };
24
- devlens_install_app: {
25
- description: string;
26
- parameters: z.ZodObject<{
27
- path: z.ZodString;
28
- }, "strip", z.ZodTypeAny, {
29
- path: string;
30
- }, {
31
- path: string;
32
- }>;
33
- };
34
- devlens_list_apps: {
35
- description: string;
36
- parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
37
- };
38
- };
39
- export declare function createAppToolHandlers(deviceManager: DeviceManager): {
40
- devlens_launch_app: (params: {
41
- appId: string;
42
- }) => Promise<{
43
- content: {
44
- type: "text";
45
- text: string;
46
- }[];
47
- }>;
48
- devlens_terminate_app: (params: {
49
- appId: string;
50
- }) => Promise<{
51
- content: {
52
- type: "text";
53
- text: string;
54
- }[];
55
- }>;
56
- devlens_install_app: (params: {
57
- path: string;
58
- }) => Promise<{
59
- content: {
60
- type: "text";
61
- text: string;
62
- }[];
63
- }>;
64
- devlens_list_apps: () => Promise<{
65
- content: {
66
- type: "text";
67
- text: string;
68
- }[];
69
- }>;
70
- };
71
- //# sourceMappingURL=app-tools.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/app-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC1B,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa;iCAE3B;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;oCAcd;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;kCAcnB;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;EA2CvD"}
@@ -1,97 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.appToolSchemas = void 0;
4
- exports.createAppToolHandlers = createAppToolHandlers;
5
- const zod_1 = require("zod");
6
- exports.appToolSchemas = {
7
- devlens_launch_app: {
8
- description: "Launch an app on the device by its bundle ID (iOS) or package name (Android). The app must already be installed.",
9
- parameters: zod_1.z.object({
10
- appId: zod_1.z
11
- .string()
12
- .describe("Bundle ID (iOS, e.g., com.example.app) or package name (Android, e.g., com.example.app)"),
13
- }),
14
- },
15
- devlens_terminate_app: {
16
- description: "Force stop a running app on the device.",
17
- parameters: zod_1.z.object({
18
- appId: zod_1.z.string().describe("Bundle ID or package name of the app to stop"),
19
- }),
20
- },
21
- devlens_install_app: {
22
- description: "Install an app from a local file path. Supports .apk (Android), .app/.ipa (iOS).",
23
- parameters: zod_1.z.object({
24
- path: zod_1.z
25
- .string()
26
- .describe("Local file path to the app binary (.apk, .app, or .ipa)"),
27
- }),
28
- },
29
- devlens_list_apps: {
30
- description: "List all third-party apps installed on the device. Returns app IDs and names.",
31
- parameters: zod_1.z.object({}),
32
- },
33
- };
34
- function createAppToolHandlers(deviceManager) {
35
- return {
36
- devlens_launch_app: async (params) => {
37
- const device = await deviceManager.getDevice();
38
- await device.launchApp(params.appId);
39
- return {
40
- content: [
41
- {
42
- type: "text",
43
- text: `Launched app: ${params.appId}`,
44
- },
45
- ],
46
- };
47
- },
48
- devlens_terminate_app: async (params) => {
49
- const device = await deviceManager.getDevice();
50
- await device.terminateApp(params.appId);
51
- return {
52
- content: [
53
- {
54
- type: "text",
55
- text: `Terminated app: ${params.appId}`,
56
- },
57
- ],
58
- };
59
- },
60
- devlens_install_app: async (params) => {
61
- const device = await deviceManager.getDevice();
62
- await device.installApp(params.path);
63
- return {
64
- content: [
65
- {
66
- type: "text",
67
- text: `Installed app from: ${params.path}`,
68
- },
69
- ],
70
- };
71
- },
72
- devlens_list_apps: async () => {
73
- const device = await deviceManager.getDevice();
74
- const apps = await device.listApps();
75
- if (apps.length === 0) {
76
- return {
77
- content: [
78
- {
79
- type: "text",
80
- text: "No third-party apps found on the device.",
81
- },
82
- ],
83
- };
84
- }
85
- const lines = apps.map((app) => `${app.name} — ${app.appId}${app.isRunning ? " (running)" : ""}`);
86
- return {
87
- content: [
88
- {
89
- type: "text",
90
- text: `Installed apps (${apps.length}):\n\n${lines.join("\n")}`,
91
- },
92
- ],
93
- };
94
- },
95
- };
96
- }
97
- //# sourceMappingURL=app-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-tools.js","sourceRoot":"","sources":["../../../src/tools/app-tools.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- import { z } from "zod";
2
- import type { DeviceManager } from "../platform/device-manager.js";
3
- export declare const deviceToolSchemas: {
4
- devlens_list_devices: {
5
- description: string;
6
- parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
7
- };
8
- devlens_device_info: {
9
- description: string;
10
- parameters: z.ZodObject<{
11
- deviceId: z.ZodOptional<z.ZodString>;
12
- }, "strip", z.ZodTypeAny, {
13
- deviceId?: string | undefined;
14
- }, {
15
- deviceId?: string | undefined;
16
- }>;
17
- };
18
- devlens_set_orientation: {
19
- description: string;
20
- parameters: z.ZodObject<{
21
- orientation: z.ZodEnum<["portrait", "landscape"]>;
22
- }, "strip", z.ZodTypeAny, {
23
- orientation: "portrait" | "landscape";
24
- }, {
25
- orientation: "portrait" | "landscape";
26
- }>;
27
- };
28
- };
29
- export declare function createDeviceToolHandlers(deviceManager: DeviceManager): {
30
- devlens_list_devices: () => Promise<{
31
- content: {
32
- type: "text";
33
- text: string;
34
- }[];
35
- }>;
36
- devlens_device_info: (params: {
37
- deviceId?: string;
38
- }) => Promise<{
39
- content: {
40
- type: "text";
41
- text: string;
42
- }[];
43
- }>;
44
- devlens_set_orientation: (params: {
45
- orientation: "portrait" | "landscape";
46
- }) => Promise<{
47
- content: {
48
- type: "text";
49
- text: string;
50
- }[];
51
- }>;
52
- };
53
- //# sourceMappingURL=device-tools.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/device-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CAwB7B,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,aAAa;;;;;;;kCA8B7B;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;sCAqBjB;QACtC,WAAW,EAAE,UAAU,GAAG,WAAW,CAAC;KACvC;;;;;;EAaJ"}