@eidra-umain/greenlight 0.1.0 → 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.
- package/README.md +66 -3
- package/dist/browser/browser.d.ts +14 -4
- package/dist/browser/browser.d.ts.map +1 -1
- package/dist/browser/browser.js +89 -8
- package/dist/browser/browser.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +161 -118
- package/dist/cli/run.js.map +1 -1
- package/dist/map/adapters/maplibre.d.ts +23 -0
- package/dist/map/adapters/maplibre.d.ts.map +1 -0
- package/dist/map/adapters/maplibre.js +367 -0
- package/dist/map/adapters/maplibre.js.map +1 -0
- package/dist/map/index.d.ts +36 -0
- package/dist/map/index.d.ts.map +1 -0
- package/dist/map/index.js +82 -0
- package/dist/map/index.js.map +1 -0
- package/dist/map/types.d.ts +96 -0
- package/dist/map/types.d.ts.map +1 -0
- package/dist/map/types.js +14 -0
- package/dist/map/types.js.map +1 -0
- package/dist/pilot/a11y-parser.d.ts.map +1 -1
- package/dist/pilot/a11y-parser.js +6 -3
- package/dist/pilot/a11y-parser.js.map +1 -1
- package/dist/pilot/assertions.d.ts +6 -6
- package/dist/pilot/assertions.d.ts.map +1 -1
- package/dist/pilot/assertions.js +267 -40
- package/dist/pilot/assertions.js.map +1 -1
- package/dist/pilot/executor.d.ts +6 -2
- package/dist/pilot/executor.d.ts.map +1 -1
- package/dist/pilot/executor.js +71 -36
- package/dist/pilot/executor.js.map +1 -1
- package/dist/pilot/llm.d.ts.map +1 -1
- package/dist/pilot/llm.js +1 -0
- package/dist/pilot/llm.js.map +1 -1
- package/dist/pilot/locator.d.ts +14 -2
- package/dist/pilot/locator.d.ts.map +1 -1
- package/dist/pilot/locator.js +95 -35
- package/dist/pilot/locator.js.map +1 -1
- package/dist/pilot/message-builder.d.ts.map +1 -1
- package/dist/pilot/message-builder.js +19 -0
- package/dist/pilot/message-builder.js.map +1 -1
- package/dist/pilot/pilot.d.ts +3 -1
- package/dist/pilot/pilot.d.ts.map +1 -1
- package/dist/pilot/pilot.js +106 -14
- package/dist/pilot/pilot.js.map +1 -1
- package/dist/pilot/prompts.d.ts +37 -3
- package/dist/pilot/prompts.d.ts.map +1 -1
- package/dist/pilot/prompts.js +167 -93
- package/dist/pilot/prompts.js.map +1 -1
- package/dist/pilot/providers/anthropic.d.ts +1 -1
- package/dist/pilot/providers/anthropic.d.ts.map +1 -1
- package/dist/pilot/providers/anthropic.js +2 -1
- package/dist/pilot/providers/anthropic.js.map +1 -1
- package/dist/pilot/providers/gemini.d.ts +1 -1
- package/dist/pilot/providers/gemini.d.ts.map +1 -1
- package/dist/pilot/providers/gemini.js +2 -1
- package/dist/pilot/providers/gemini.js.map +1 -1
- package/dist/pilot/providers/index.d.ts +1 -0
- package/dist/pilot/providers/index.d.ts.map +1 -1
- package/dist/pilot/providers/index.js +1 -0
- package/dist/pilot/providers/index.js.map +1 -1
- package/dist/pilot/providers/openai-compatible.d.ts +1 -1
- package/dist/pilot/providers/openai-compatible.d.ts.map +1 -1
- package/dist/pilot/providers/openai-compatible.js +2 -1
- package/dist/pilot/providers/openai-compatible.js.map +1 -1
- package/dist/pilot/providers/types.d.ts +9 -0
- package/dist/pilot/providers/types.d.ts.map +1 -1
- package/dist/pilot/providers/types.js +13 -1
- package/dist/pilot/providers/types.js.map +1 -1
- package/dist/pilot/response-parser.d.ts +13 -1
- package/dist/pilot/response-parser.d.ts.map +1 -1
- package/dist/pilot/response-parser.js +85 -2
- package/dist/pilot/response-parser.js.map +1 -1
- package/dist/pilot/state.d.ts +2 -0
- package/dist/pilot/state.d.ts.map +1 -1
- package/dist/pilot/state.js +12 -1
- package/dist/pilot/state.js.map +1 -1
- package/dist/planner/plan-runner.d.ts +2 -1
- package/dist/planner/plan-runner.d.ts.map +1 -1
- package/dist/planner/plan-runner.js +118 -18
- package/dist/planner/plan-runner.js.map +1 -1
- package/dist/planner/plan-types.d.ts +1 -0
- package/dist/planner/plan-types.d.ts.map +1 -1
- package/dist/reporter/types.d.ts +37 -2
- package/dist/reporter/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/parser/steps.d.ts +0 -13
- package/dist/parser/steps.d.ts.map +0 -1
- package/dist/parser/steps.js +0 -44
- package/dist/parser/steps.js.map +0 -1
package/dist/reporter/types.d.ts
CHANGED
|
@@ -11,6 +11,37 @@ export interface A11yNode {
|
|
|
11
11
|
children?: A11yNode[];
|
|
12
12
|
raw: string;
|
|
13
13
|
}
|
|
14
|
+
/** Snapshot of an interactive map's viewport state. */
|
|
15
|
+
export interface MapState {
|
|
16
|
+
/** Which adapter produced this state (e.g. "maplibre", "leaflet", "mapbox"). */
|
|
17
|
+
adapter: string;
|
|
18
|
+
/** Map center coordinate. */
|
|
19
|
+
center: {
|
|
20
|
+
lng: number;
|
|
21
|
+
lat: number;
|
|
22
|
+
};
|
|
23
|
+
/** Current zoom level. */
|
|
24
|
+
zoom: number;
|
|
25
|
+
/** Camera bearing in degrees (0 = north). */
|
|
26
|
+
bearing: number;
|
|
27
|
+
/** Camera pitch in degrees (0 = straight down). */
|
|
28
|
+
pitch: number;
|
|
29
|
+
/** Visible bounds of the viewport. */
|
|
30
|
+
bounds: {
|
|
31
|
+
sw: {
|
|
32
|
+
lng: number;
|
|
33
|
+
lat: number;
|
|
34
|
+
};
|
|
35
|
+
ne: {
|
|
36
|
+
lng: number;
|
|
37
|
+
lat: number;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/** IDs of all layers in the current style. */
|
|
41
|
+
layers: string[];
|
|
42
|
+
/** Whether the map style is fully loaded. */
|
|
43
|
+
styleLoaded: boolean;
|
|
44
|
+
}
|
|
14
45
|
/** Complete page state captured at a point in time. */
|
|
15
46
|
export interface PageState {
|
|
16
47
|
/** Accessibility tree snapshot with element refs assigned. */
|
|
@@ -27,6 +58,8 @@ export interface PageState {
|
|
|
27
58
|
title: string;
|
|
28
59
|
/** Console messages since last capture. */
|
|
29
60
|
consoleLogs: ConsoleEntry[];
|
|
61
|
+
/** Map viewport state, if a supported map library was detected. */
|
|
62
|
+
mapState?: MapState;
|
|
30
63
|
}
|
|
31
64
|
/** A single browser console message. */
|
|
32
65
|
export interface ConsoleEntry {
|
|
@@ -119,12 +152,14 @@ export interface Action {
|
|
|
119
152
|
};
|
|
120
153
|
/** For remember actions: the variable name to store the captured value. */
|
|
121
154
|
rememberAs?: string;
|
|
122
|
-
/** For compare assertions: reference to a remembered variable and operator. */
|
|
155
|
+
/** For compare assertions: reference to a remembered variable (or a literal value) and operator. */
|
|
123
156
|
compare?: {
|
|
124
|
-
/** The remembered variable name to compare against. */
|
|
157
|
+
/** The remembered variable name to compare against (ignored when `literal` is set). */
|
|
125
158
|
variable: string;
|
|
126
159
|
/** Comparison operator. */
|
|
127
160
|
operator: "less_than" | "greater_than" | "equal" | "not_equal" | "less_or_equal" | "greater_or_equal";
|
|
161
|
+
/** When set, compare the page value against this literal instead of a remembered variable. */
|
|
162
|
+
literal?: string;
|
|
128
163
|
};
|
|
129
164
|
}
|
|
130
165
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reporter/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;IACrB,GAAG,EAAE,MAAM,CAAA;CACX;AAED,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACzB,8DAA8D;IAC9D,QAAQ,EAAE,QAAQ,EAAE,CAAA;IACpB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,WAAW,EAAE,YAAY,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reporter/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eidra-umain/greenlight",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"license": "
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "E2E web testing tool — write tests as plain English, no selectors or glue code",
|
|
5
|
+
"license": "MIT",
|
|
6
6
|
"author": "umain.com",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "dist/cli/index.js",
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"commander": "^13.0.0",
|
|
49
49
|
"dotenv": "^17.3.1",
|
|
50
50
|
"playwright": "^1.58.2",
|
|
51
|
+
"playwright-zoom": "^1.1.0",
|
|
51
52
|
"yaml": "^2.8.2",
|
|
52
53
|
"zod": "^4.3.6"
|
|
53
54
|
},
|
package/dist/parser/steps.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Step preprocessor — expands compound steps into individual atomic steps.
|
|
3
|
-
*
|
|
4
|
-
* Runs at load time before execution, so there's no runtime cost.
|
|
5
|
-
* Each output step maps to exactly one browser action.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Expand compound steps in a step list.
|
|
9
|
-
* E.g. "Select Företag - Ventilation - Kylteknik in the leads form"
|
|
10
|
-
* becomes three steps: click "Företag", click "Ventilation", click "Kylteknik".
|
|
11
|
-
*/
|
|
12
|
-
export declare function expandSteps(steps: string[]): string[];
|
|
13
|
-
//# sourceMappingURL=steps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/parser/steps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAMrD"}
|
package/dist/parser/steps.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Step preprocessor — expands compound steps into individual atomic steps.
|
|
3
|
-
*
|
|
4
|
-
* Runs at load time before execution, so there's no runtime cost.
|
|
5
|
-
* Each output step maps to exactly one browser action.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Expand compound steps in a step list.
|
|
9
|
-
* E.g. "Select Företag - Ventilation - Kylteknik in the leads form"
|
|
10
|
-
* becomes three steps: click "Företag", click "Ventilation", click "Kylteknik".
|
|
11
|
-
*/
|
|
12
|
-
export function expandSteps(steps) {
|
|
13
|
-
const result = [];
|
|
14
|
-
for (const step of steps) {
|
|
15
|
-
result.push(...expandStep(step));
|
|
16
|
-
}
|
|
17
|
-
return result;
|
|
18
|
-
}
|
|
19
|
-
function expandStep(step) {
|
|
20
|
-
// "Select X - Y - Z in <context>" → click each item in context
|
|
21
|
-
const selectChain = /^select\s+(.+?)(?:\s+(?:in|from|on)\s+(.+))?$/i.exec(step);
|
|
22
|
-
if (selectChain) {
|
|
23
|
-
const items = selectChain[1];
|
|
24
|
-
const context = selectChain[2];
|
|
25
|
-
// Only split on " - " (spaced dashes) to avoid splitting hyphenated words
|
|
26
|
-
const parts = items.split(/\s+-\s+/);
|
|
27
|
-
if (parts.length > 1) {
|
|
28
|
-
return parts.map((part) => {
|
|
29
|
-
const trimmed = part.trim();
|
|
30
|
-
return context
|
|
31
|
-
? `click "${trimmed}" in ${context}`
|
|
32
|
-
: `click "${trimmed}"`;
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
// "Do X, then Y, then Z" → individual steps
|
|
37
|
-
const thenParts = step.split(/,?\s+then\s+/i);
|
|
38
|
-
if (thenParts.length > 1) {
|
|
39
|
-
return thenParts.map((part) => part.trim());
|
|
40
|
-
}
|
|
41
|
-
// No expansion needed
|
|
42
|
-
return [step];
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=steps.js.map
|
package/dist/parser/steps.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/parser/steps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAe;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC/B,+DAA+D;IAC/D,MAAM,WAAW,GAAG,gDAAgD,CAAC,IAAI,CACxE,IAAI,CACJ,CAAA;IACD,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAE9B,0EAA0E;QAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;gBAC3B,OAAO,OAAO;oBACb,CAAC,CAAC,UAAU,OAAO,QAAQ,OAAO,EAAE;oBACpC,CAAC,CAAC,UAAU,OAAO,GAAG,CAAA;YACxB,CAAC,CAAC,CAAA;QACH,CAAC;IACF,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC7C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|