@geometra/mcp 1.18.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.
@@ -0,0 +1,247 @@
1
+ import WebSocket from 'ws';
2
+ /**
3
+ * Parsed accessibility node from the UI tree + computed layout.
4
+ * Mirrors the shape of @geometra/core's AccessibilityNode without importing it
5
+ * (this package is standalone — no dependency on geometra packages).
6
+ */
7
+ export interface A11yNode {
8
+ role: string;
9
+ name?: string;
10
+ state?: {
11
+ disabled?: boolean;
12
+ expanded?: boolean;
13
+ selected?: boolean;
14
+ };
15
+ bounds: {
16
+ x: number;
17
+ y: number;
18
+ width: number;
19
+ height: number;
20
+ };
21
+ path: number[];
22
+ children: A11yNode[];
23
+ focusable: boolean;
24
+ }
25
+ /** Flat, viewport-filtered index for token-efficient agent context (see `buildCompactUiIndex`). */
26
+ export interface CompactUiNode {
27
+ role: string;
28
+ name?: string;
29
+ state?: A11yNode['state'];
30
+ bounds: {
31
+ x: number;
32
+ y: number;
33
+ width: number;
34
+ height: number;
35
+ };
36
+ path: number[];
37
+ focusable: boolean;
38
+ }
39
+ /** Higher-level webpage structures extracted from the a11y tree. */
40
+ export interface PageLandmark {
41
+ role: string;
42
+ name?: string;
43
+ bounds: {
44
+ x: number;
45
+ y: number;
46
+ width: number;
47
+ height: number;
48
+ };
49
+ path: number[];
50
+ }
51
+ export interface PageFieldModel {
52
+ role: string;
53
+ name?: string;
54
+ state?: A11yNode['state'];
55
+ bounds: {
56
+ x: number;
57
+ y: number;
58
+ width: number;
59
+ height: number;
60
+ };
61
+ path: number[];
62
+ }
63
+ export interface PageActionModel {
64
+ role: string;
65
+ name?: string;
66
+ state?: A11yNode['state'];
67
+ bounds: {
68
+ x: number;
69
+ y: number;
70
+ width: number;
71
+ height: number;
72
+ };
73
+ path: number[];
74
+ }
75
+ export interface PageFormModel {
76
+ name?: string;
77
+ bounds: {
78
+ x: number;
79
+ y: number;
80
+ width: number;
81
+ height: number;
82
+ };
83
+ path: number[];
84
+ fieldCount: number;
85
+ actionCount: number;
86
+ fields: PageFieldModel[];
87
+ actions: PageActionModel[];
88
+ }
89
+ export interface PageDialogModel {
90
+ name?: string;
91
+ bounds: {
92
+ x: number;
93
+ y: number;
94
+ width: number;
95
+ height: number;
96
+ };
97
+ path: number[];
98
+ actionCount: number;
99
+ actions: PageActionModel[];
100
+ }
101
+ export interface PageListModel {
102
+ name?: string;
103
+ bounds: {
104
+ x: number;
105
+ y: number;
106
+ width: number;
107
+ height: number;
108
+ };
109
+ path: number[];
110
+ itemCount: number;
111
+ itemsPreview: string[];
112
+ }
113
+ export interface PageModel {
114
+ viewport: {
115
+ width: number;
116
+ height: number;
117
+ };
118
+ landmarks: PageLandmark[];
119
+ forms: PageFormModel[];
120
+ dialogs: PageDialogModel[];
121
+ lists: PageListModel[];
122
+ }
123
+ export interface UiNodeUpdate {
124
+ before: CompactUiNode;
125
+ after: CompactUiNode;
126
+ changes: string[];
127
+ }
128
+ export interface UiListCountChange {
129
+ name?: string;
130
+ path: number[];
131
+ beforeCount: number;
132
+ afterCount: number;
133
+ }
134
+ /** Semantic delta between two compact viewport models. */
135
+ export interface UiDelta {
136
+ added: CompactUiNode[];
137
+ removed: CompactUiNode[];
138
+ updated: UiNodeUpdate[];
139
+ dialogsOpened: PageDialogModel[];
140
+ dialogsClosed: PageDialogModel[];
141
+ formsAppeared: PageFormModel[];
142
+ formsRemoved: PageFormModel[];
143
+ listCountsChanged: UiListCountChange[];
144
+ }
145
+ export interface Session {
146
+ ws: WebSocket;
147
+ layout: Record<string, unknown> | null;
148
+ tree: Record<string, unknown> | null;
149
+ url: string;
150
+ }
151
+ /**
152
+ * Connect to a running Geometra server. Waits for the first frame so that
153
+ * layout/tree state is available immediately after connection.
154
+ */
155
+ export declare function connect(url: string): Promise<Session>;
156
+ export declare function getSession(): Session | null;
157
+ export declare function disconnect(): void;
158
+ /**
159
+ * Send a click event at (x, y) and wait for the next frame/patch response.
160
+ */
161
+ export declare function sendClick(session: Session, x: number, y: number): Promise<void>;
162
+ /**
163
+ * Send a sequence of key events to type text into the focused element.
164
+ */
165
+ export declare function sendType(session: Session, text: string): Promise<void>;
166
+ /**
167
+ * Send a special key (Enter, Tab, Escape, etc.)
168
+ */
169
+ export declare function sendKey(session: Session, key: string, modifiers?: {
170
+ shift?: boolean;
171
+ ctrl?: boolean;
172
+ meta?: boolean;
173
+ alt?: boolean;
174
+ }): Promise<void>;
175
+ /**
176
+ * Attach local file(s). Paths must exist on the machine running `@geometra/proxy` (not the MCP host).
177
+ * Optional `x`,`y` click opens a file chooser; omit to use the first `input[type=file]` in any frame.
178
+ */
179
+ export declare function sendFileUpload(session: Session, paths: string[], opts?: {
180
+ click?: {
181
+ x: number;
182
+ y: number;
183
+ };
184
+ strategy?: 'auto' | 'chooser' | 'hidden' | 'drop';
185
+ drop?: {
186
+ x: number;
187
+ y: number;
188
+ };
189
+ }): Promise<void>;
190
+ /** ARIA `role=option` listbox (e.g. React Select). Optional click opens the list. */
191
+ export declare function sendListboxPick(session: Session, label: string, opts?: {
192
+ exact?: boolean;
193
+ open?: {
194
+ x: number;
195
+ y: number;
196
+ };
197
+ }): Promise<void>;
198
+ /** Native `<select>` only: click the control center, then pick by value, label text, or zero-based index. */
199
+ export declare function sendSelectOption(session: Session, x: number, y: number, option: {
200
+ value?: string;
201
+ label?: string;
202
+ index?: number;
203
+ }): Promise<void>;
204
+ /** Mouse wheel / scroll. Optional `x`,`y` move pointer before scrolling. */
205
+ export declare function sendWheel(session: Session, deltaY: number, opts?: {
206
+ deltaX?: number;
207
+ x?: number;
208
+ y?: number;
209
+ }): Promise<void>;
210
+ /**
211
+ * Build a flat accessibility tree from the raw UI tree + layout.
212
+ * This is a standalone reimplementation that works with raw JSON —
213
+ * no dependency on @geometra/core.
214
+ */
215
+ export declare function buildA11yTree(tree: Record<string, unknown>, layout: Record<string, unknown>): A11yNode;
216
+ /**
217
+ * Flat list of actionable / semantic nodes in the viewport, sorted with focusable first
218
+ * then top-to-bottom reading order. Intended to minimize LLM tokens vs a full nested tree.
219
+ */
220
+ export declare function buildCompactUiIndex(root: A11yNode, options?: {
221
+ viewportWidth?: number;
222
+ viewportHeight?: number;
223
+ maxNodes?: number;
224
+ }): {
225
+ nodes: CompactUiNode[];
226
+ truncated: boolean;
227
+ };
228
+ export declare function summarizeCompactIndex(nodes: CompactUiNode[], maxLines?: number): string;
229
+ /**
230
+ * Build a compact, webpage-shaped model from the accessibility tree:
231
+ * landmarks, dialogs, forms, and lists with short previews.
232
+ */
233
+ export declare function buildPageModel(root: A11yNode, options?: {
234
+ maxFieldsPerForm?: number;
235
+ maxActionsPerContainer?: number;
236
+ maxItemsPerList?: number;
237
+ }): PageModel;
238
+ export declare function summarizePageModel(model: PageModel, maxLines?: number): string;
239
+ /**
240
+ * Compare two accessibility trees at the compact viewport layer plus a few
241
+ * higher-level structures (dialogs, forms, lists).
242
+ */
243
+ export declare function buildUiDelta(before: A11yNode, after: A11yNode, options?: {
244
+ maxNodes?: number;
245
+ }): UiDelta;
246
+ export declare function hasUiDelta(delta: UiDelta): boolean;
247
+ export declare function summarizeUiDelta(delta: UiDelta, maxLines?: number): string;