@desplega.ai/qa-use 2.0.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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1003 -0
  3. package/bin/qa-use.js +7 -0
  4. package/dist/lib/api/index.d.ts +296 -0
  5. package/dist/lib/api/index.d.ts.map +1 -0
  6. package/dist/lib/api/index.js +564 -0
  7. package/dist/lib/api/index.js.map +1 -0
  8. package/dist/lib/api/sse.d.ts +33 -0
  9. package/dist/lib/api/sse.d.ts.map +1 -0
  10. package/dist/lib/api/sse.js +97 -0
  11. package/dist/lib/api/sse.js.map +1 -0
  12. package/dist/lib/browser/index.d.ts +28 -0
  13. package/dist/lib/browser/index.d.ts.map +1 -0
  14. package/dist/lib/browser/index.js +145 -0
  15. package/dist/lib/browser/index.js.map +1 -0
  16. package/dist/lib/env/index.d.ts +41 -0
  17. package/dist/lib/env/index.d.ts.map +1 -0
  18. package/dist/lib/env/index.js +125 -0
  19. package/dist/lib/env/index.js.map +1 -0
  20. package/dist/lib/tunnel/index.d.ts +38 -0
  21. package/dist/lib/tunnel/index.d.ts.map +1 -0
  22. package/dist/lib/tunnel/index.js +154 -0
  23. package/dist/lib/tunnel/index.js.map +1 -0
  24. package/dist/package.json +100 -0
  25. package/dist/src/cli/commands/info.d.ts +6 -0
  26. package/dist/src/cli/commands/info.d.ts.map +1 -0
  27. package/dist/src/cli/commands/info.js +32 -0
  28. package/dist/src/cli/commands/info.js.map +1 -0
  29. package/dist/src/cli/commands/mcp.d.ts +6 -0
  30. package/dist/src/cli/commands/mcp.d.ts.map +1 -0
  31. package/dist/src/cli/commands/mcp.js +45 -0
  32. package/dist/src/cli/commands/mcp.js.map +1 -0
  33. package/dist/src/cli/commands/setup.d.ts +6 -0
  34. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  35. package/dist/src/cli/commands/setup.js +59 -0
  36. package/dist/src/cli/commands/setup.js.map +1 -0
  37. package/dist/src/cli/commands/test/index.d.ts +6 -0
  38. package/dist/src/cli/commands/test/index.d.ts.map +1 -0
  39. package/dist/src/cli/commands/test/index.js +15 -0
  40. package/dist/src/cli/commands/test/index.js.map +1 -0
  41. package/dist/src/cli/commands/test/init.d.ts +6 -0
  42. package/dist/src/cli/commands/test/init.d.ts.map +1 -0
  43. package/dist/src/cli/commands/test/init.js +64 -0
  44. package/dist/src/cli/commands/test/init.js.map +1 -0
  45. package/dist/src/cli/commands/test/list.d.ts +6 -0
  46. package/dist/src/cli/commands/test/list.d.ts.map +1 -0
  47. package/dist/src/cli/commands/test/list.js +70 -0
  48. package/dist/src/cli/commands/test/list.js.map +1 -0
  49. package/dist/src/cli/commands/test/run.d.ts +6 -0
  50. package/dist/src/cli/commands/test/run.d.ts.map +1 -0
  51. package/dist/src/cli/commands/test/run.js +95 -0
  52. package/dist/src/cli/commands/test/run.js.map +1 -0
  53. package/dist/src/cli/commands/test/validate.d.ts +6 -0
  54. package/dist/src/cli/commands/test/validate.d.ts.map +1 -0
  55. package/dist/src/cli/commands/test/validate.js +70 -0
  56. package/dist/src/cli/commands/test/validate.js.map +1 -0
  57. package/dist/src/cli/index.d.ts +6 -0
  58. package/dist/src/cli/index.d.ts.map +1 -0
  59. package/dist/src/cli/index.js +21 -0
  60. package/dist/src/cli/index.js.map +1 -0
  61. package/dist/src/cli/lib/config.d.ts +36 -0
  62. package/dist/src/cli/lib/config.d.ts.map +1 -0
  63. package/dist/src/cli/lib/config.js +89 -0
  64. package/dist/src/cli/lib/config.js.map +1 -0
  65. package/dist/src/cli/lib/loader.d.ts +49 -0
  66. package/dist/src/cli/lib/loader.d.ts.map +1 -0
  67. package/dist/src/cli/lib/loader.js +122 -0
  68. package/dist/src/cli/lib/loader.js.map +1 -0
  69. package/dist/src/cli/lib/output.d.ts +53 -0
  70. package/dist/src/cli/lib/output.d.ts.map +1 -0
  71. package/dist/src/cli/lib/output.js +133 -0
  72. package/dist/src/cli/lib/output.js.map +1 -0
  73. package/dist/src/cli/lib/runner.d.ts +23 -0
  74. package/dist/src/cli/lib/runner.d.ts.map +1 -0
  75. package/dist/src/cli/lib/runner.js +40 -0
  76. package/dist/src/cli/lib/runner.js.map +1 -0
  77. package/dist/src/http-server.d.ts +14 -0
  78. package/dist/src/http-server.d.ts.map +1 -0
  79. package/dist/src/http-server.js +145 -0
  80. package/dist/src/http-server.js.map +1 -0
  81. package/dist/src/index.d.ts +9 -0
  82. package/dist/src/index.d.ts.map +1 -0
  83. package/dist/src/index.js +21 -0
  84. package/dist/src/index.js.map +1 -0
  85. package/dist/src/server.d.ts +58 -0
  86. package/dist/src/server.d.ts.map +1 -0
  87. package/dist/src/server.js +2376 -0
  88. package/dist/src/server.js.map +1 -0
  89. package/dist/src/tunnel-mode.d.ts +13 -0
  90. package/dist/src/tunnel-mode.d.ts.map +1 -0
  91. package/dist/src/tunnel-mode.js +159 -0
  92. package/dist/src/tunnel-mode.js.map +1 -0
  93. package/dist/src/types/test-definition.d.ts +320 -0
  94. package/dist/src/types/test-definition.d.ts.map +1 -0
  95. package/dist/src/types/test-definition.js +11 -0
  96. package/dist/src/types/test-definition.js.map +1 -0
  97. package/dist/src/types.d.ts +209 -0
  98. package/dist/src/types.d.ts.map +1 -0
  99. package/dist/src/types.js +34 -0
  100. package/dist/src/types.js.map +1 -0
  101. package/dist/src/utils/package.d.ts +12 -0
  102. package/dist/src/utils/package.d.ts.map +1 -0
  103. package/dist/src/utils/package.js +36 -0
  104. package/dist/src/utils/package.js.map +1 -0
  105. package/dist/src/utils/summary.d.ts +45 -0
  106. package/dist/src/utils/summary.d.ts.map +1 -0
  107. package/dist/src/utils/summary.js +198 -0
  108. package/dist/src/utils/summary.js.map +1 -0
  109. package/lib/api/index.ts +977 -0
  110. package/lib/api/sse.ts +112 -0
  111. package/lib/browser/index.ts +181 -0
  112. package/lib/env/index.ts +156 -0
  113. package/lib/tunnel/index.test.ts +344 -0
  114. package/lib/tunnel/index.ts +197 -0
  115. package/lib/tunnel/integration.test.ts +98 -0
  116. package/package.json +100 -0
  117. package/server.json +16 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Auto-generated TypeScript types for Test CLI definitions
3
+ *
4
+ * DO NOT EDIT MANUALLY - Generated from API schema
5
+ * Run 'bun generate:types' to regenerate
6
+ *
7
+ * Source: https://api.desplega.ai/vibe-qa/cli/schema
8
+ * Generated: 2026-01-21T14:07:51.069Z
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=test-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-definition.js","sourceRoot":"","sources":["../../../src/types/test-definition.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,209 @@
1
+ export declare enum DBStatus {
2
+ ACTIVE = "active",
3
+ DELETED = "deleted"
4
+ }
5
+ export interface AuditBase {
6
+ organization_id?: string;
7
+ created_at: string;
8
+ created_by: string;
9
+ updated_at?: string;
10
+ updated_by?: string;
11
+ deleted_at?: string;
12
+ deleted_by?: string;
13
+ status: DBStatus;
14
+ }
15
+ export interface Block {
16
+ id: number;
17
+ name: string;
18
+ description?: string;
19
+ end_goal?: string;
20
+ group?: string;
21
+ is_group_check?: boolean;
22
+ should_skip?: boolean;
23
+ should_fail?: boolean;
24
+ set_variable_name?: string;
25
+ use_variable_name?: string;
26
+ is_async: boolean;
27
+ code: string;
28
+ locator: unknown;
29
+ action?: unknown;
30
+ fixed: boolean;
31
+ skipped: boolean;
32
+ is_flaky: boolean;
33
+ should_fix_with_ai: boolean;
34
+ should_try_deterministic: boolean;
35
+ logs?: string[];
36
+ last_error?: string;
37
+ reasoning?: string;
38
+ confidence?: ConfidenceLevel;
39
+ confidence_reasoning?: string;
40
+ original_task?: string;
41
+ aaa_phase?: 'arrange' | 'act' | 'assert';
42
+ compute_semantic_diff?: boolean;
43
+ pre_screenshot_path?: string;
44
+ post_screenshot_path?: string;
45
+ }
46
+ export type Prio = 'low' | 'medium' | 'high' | 'urgent';
47
+ export type ConfidenceLevel = 'low' | 'medium' | 'high';
48
+ export type Ref = string;
49
+ export type AnyDict = Record<string, any>;
50
+ export interface BaseIntent {
51
+ reasoning: string;
52
+ tasks_pending: boolean;
53
+ confidence: ConfidenceLevel;
54
+ }
55
+ export interface DoneIntent extends BaseIntent {
56
+ status: 'success' | 'failure';
57
+ message: string;
58
+ }
59
+ export type IssueType = 'bug' | 'usability' | 'performance' | 'security' | 'security_vulnerability' | 'observation' | 'other';
60
+ export type Severity = 'low' | 'medium' | 'high' | 'critical' | 'minor' | 'major' | 'blocker';
61
+ export interface IssueReport {
62
+ title: string;
63
+ description: string;
64
+ issue_type?: IssueType;
65
+ severity?: Severity;
66
+ url?: string | null;
67
+ help?: string | null;
68
+ recommendations?: string[] | null;
69
+ tags?: string[];
70
+ }
71
+ export interface TestCreatorDoneIntent extends DoneIntent {
72
+ explanation: string;
73
+ issues: IssueReport[];
74
+ success_criteria: string;
75
+ is_positive: boolean;
76
+ }
77
+ export interface NextTaskIntent extends BaseIntent {
78
+ next_task: string;
79
+ }
80
+ export interface UserInputIntent extends BaseIntent {
81
+ question: string;
82
+ priority: Prio;
83
+ }
84
+ export interface UserInputResponse {
85
+ response: string;
86
+ }
87
+ export interface ClarificationIntent extends BaseIntent {
88
+ refs: Ref[];
89
+ highlighted_refs: Ref[];
90
+ type: 'screenshot' | 'expand_text';
91
+ }
92
+ export interface ActionIntent extends BaseIntent {
93
+ refs: Ref[];
94
+ type: 'click' | 'click_download' | 'type' | 'fill' | 'wait' | 'press' | 'goto' | 'scroll' | 'hover' | 'select' | 'check' | 'uncheck';
95
+ args?: number | string | AnyDict | null;
96
+ }
97
+ export type GeneralStatus = 'pending' | 'in_progress' | 'completed' | 'failed';
98
+ export interface General {
99
+ started_at?: string;
100
+ start_url?: string;
101
+ ended_at?: string;
102
+ end_url?: string;
103
+ elapsed_ms?: number;
104
+ status: GeneralStatus;
105
+ error?: string;
106
+ }
107
+ export interface Intent<TDone extends DoneIntent = DoneIntent> extends General {
108
+ intent: ActionIntent | ClarificationIntent | NextTaskIntent | UserInputIntent | TDone;
109
+ }
110
+ export declare const isDoneIntent: <TDone extends DoneIntent = DoneIntent>(intent: Intent<TDone>["intent"]) => intent is TDone;
111
+ export declare const isTestCreatorDoneIntent: (intent: DoneIntent) => intent is TestCreatorDoneIntent;
112
+ export declare const isUserInputIntent: <TDone extends DoneIntent = DoneIntent>(intent: Intent<TDone>["intent"]) => intent is UserInputIntent;
113
+ export declare const isNextTaskIntent: <TDone extends DoneIntent = DoneIntent>(intent: Intent<TDone>["intent"]) => intent is NextTaskIntent;
114
+ export declare const isClarificationIntent: <TDone extends DoneIntent = DoneIntent>(intent: Intent<TDone>["intent"]) => intent is ClarificationIntent;
115
+ export declare const isActionIntent: <TDone extends DoneIntent = DoneIntent>(intent: Intent<TDone>["intent"]) => intent is ActionIntent;
116
+ export interface ExpandedRef {
117
+ ref: string;
118
+ description?: string;
119
+ text: string;
120
+ }
121
+ export interface HistoryItem<TDone extends DoneIntent = DoneIntent> extends General {
122
+ id: string;
123
+ task: string;
124
+ task_added_at?: string;
125
+ intents: Intent<TDone>[];
126
+ block_ids: number[];
127
+ expanded_refs: ExpandedRef[];
128
+ }
129
+ export interface CustomDoneIntent extends DoneIntent {
130
+ issues: string[];
131
+ human_question?: string;
132
+ explanation: string;
133
+ }
134
+ export type TestAgentV2IncomingEventType = 'next_task' | 'response' | 'close' | 'pause' | 'run' | 'set_model_name' | 'set_persona_id' | 'set_app_config_id' | 'set_test_dependency' | 'toggle_autopilot' | 'change_name' | 'save_test';
135
+ export interface TestAgentV2IncomingEvent {
136
+ type: TestAgentV2IncomingEventType;
137
+ message?: string;
138
+ id?: string;
139
+ }
140
+ export type TestAgentV2Status = 'pending' | 'idle' | 'running' | 'paused' | 'pending' | 'need_user_input' | 'closed';
141
+ export interface TestAgentV2HistoryEvent<TDone extends DoneIntent = DoneIntent> {
142
+ history: HistoryItem<TDone>;
143
+ }
144
+ export interface TestAgentV2BlockEvent {
145
+ block: Block;
146
+ }
147
+ export interface TestAgentV2StatusEvent {
148
+ status: TestAgentV2Status;
149
+ }
150
+ export interface TestAgentV2FullHistoryEvent<TDone extends DoneIntent = DoneIntent> {
151
+ history: HistoryItem<TDone>[];
152
+ }
153
+ export interface TestAgentV2ConfigEvent {
154
+ name: string;
155
+ agent_id: string;
156
+ model_name: string;
157
+ liveview_url: string;
158
+ page_url?: string | null;
159
+ autopilot: boolean;
160
+ app_config_id?: string | null;
161
+ persona_id?: string | null;
162
+ organization_id?: string | null;
163
+ group_key?: string | null;
164
+ test_dependency_ids: string[];
165
+ }
166
+ export interface TestAgentV2UserInputEvent {
167
+ question: string;
168
+ priority: Prio;
169
+ }
170
+ export interface TestAgentV2TestEvent {
171
+ test: unknown;
172
+ ctxs: unknown[];
173
+ }
174
+ export interface TestAgentV2NotifyEvent {
175
+ message: string;
176
+ level: 'info' | 'warning' | 'error';
177
+ }
178
+ export type TestAgentV2EventType = 'config' | 'history' | 'block' | 'status' | 'full_history' | 'user_input' | 'test' | 'notify';
179
+ export type TestAgentV2EventData<TDone extends DoneIntent = DoneIntent> = TestAgentV2ConfigEvent | TestAgentV2HistoryEvent<TDone> | TestAgentV2BlockEvent | TestAgentV2StatusEvent | TestAgentV2FullHistoryEvent<TDone> | TestAgentV2UserInputEvent | TestAgentV2TestEvent | TestAgentV2NotifyEvent;
180
+ export interface TestAgentV2Event<TDone extends DoneIntent = DoneIntent> {
181
+ ts: string;
182
+ type: TestAgentV2EventType;
183
+ data: TestAgentV2EventData<TDone>;
184
+ }
185
+ export interface TestAgentV2Data {
186
+ agent_id: string;
187
+ liveview_url: string;
188
+ recording_path?: string | null;
189
+ page_url?: string | null;
190
+ autopilot: boolean;
191
+ model_name: string;
192
+ organization_id?: string | null;
193
+ group_key?: string | null;
194
+ app_config_id?: string | null;
195
+ persona_id?: string | null;
196
+ test_id: string;
197
+ dependency_test_ids: string[];
198
+ blocks: Block[];
199
+ history: HistoryItem<DoneIntent>[];
200
+ last_done?: DoneIntent | null;
201
+ pending_user_input?: UserInputIntent | null;
202
+ status: TestAgentV2Status;
203
+ }
204
+ export interface TestAgentV2Session extends AuditBase {
205
+ id: string;
206
+ source?: string;
207
+ data: TestAgentV2Data;
208
+ }
209
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export var DBStatus;
2
+ (function (DBStatus) {
3
+ DBStatus["ACTIVE"] = "active";
4
+ DBStatus["DELETED"] = "deleted";
5
+ })(DBStatus || (DBStatus = {}));
6
+ export const isDoneIntent = (intent) => {
7
+ // eslint-disable-next-line no-prototype-builtins
8
+ return intent.hasOwnProperty('status');
9
+ };
10
+ export const isTestCreatorDoneIntent = (intent) => {
11
+ return ('issues' in intent &&
12
+ 'success_criteria' in intent &&
13
+ 'is_positive' in intent &&
14
+ 'explanation' in intent);
15
+ };
16
+ export const isUserInputIntent = (intent) => {
17
+ // eslint-disable-next-line no-prototype-builtins
18
+ return intent.hasOwnProperty('question');
19
+ };
20
+ export const isNextTaskIntent = (intent) => {
21
+ // eslint-disable-next-line no-prototype-builtins
22
+ return intent.hasOwnProperty('next_task');
23
+ };
24
+ export const isClarificationIntent = (intent) => {
25
+ return (
26
+ // eslint-disable-next-line no-prototype-builtins
27
+ intent.hasOwnProperty('type') && intent.type !== undefined);
28
+ };
29
+ export const isActionIntent = (intent) => {
30
+ return (
31
+ // eslint-disable-next-line no-prototype-builtins
32
+ intent.hasOwnProperty('type') && intent.type !== undefined);
33
+ };
34
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,+BAAmB,CAAA;AACrB,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AAoKD,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAA+B,EACd,EAAE;IACnB,iDAAiD;IACjD,OAAO,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAkB,EAAmC,EAAE;IAC7F,OAAO,CACL,QAAQ,IAAI,MAAM;QAClB,kBAAkB,IAAI,MAAM;QAC5B,aAAa,IAAI,MAAM;QACvB,aAAa,IAAI,MAAM,CACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAA+B,EACJ,EAAE;IAC7B,iDAAiD;IACjD,OAAO,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAA+B,EACL,EAAE;IAC5B,iDAAiD;IACjD,OAAO,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAA+B,EACA,EAAE;IACjC,OAAO;IACL,iDAAiD;IACjD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAK,MAAkB,CAAC,IAAI,KAAK,SAAS,CACxE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,MAA+B,EACP,EAAE;IAC1B,OAAO;IACL,iDAAiD;IACjD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAK,MAAkB,CAAC,IAAI,KAAK,SAAS,CACxE,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ interface PackageJson {
2
+ name: string;
3
+ version: string;
4
+ description: string;
5
+ [key: string]: unknown;
6
+ }
7
+ export declare function getPackageInfo(): PackageJson;
8
+ export declare function getVersion(): string;
9
+ export declare function getName(): string;
10
+ export declare function getDescription(): string;
11
+ export {};
12
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/utils/package.ts"],"names":[],"mappings":"AAWA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,wBAAgB,cAAc,IAAI,WAAW,CAe5C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,36 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ // Get the directory of the current module
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ // Read package.json from the project root
8
+ const packageJsonPath = join(__dirname, '../../package.json');
9
+ let packageJson = null;
10
+ export function getPackageInfo() {
11
+ if (!packageJson) {
12
+ try {
13
+ const packageContent = readFileSync(packageJsonPath, 'utf-8');
14
+ packageJson = JSON.parse(packageContent);
15
+ }
16
+ catch (error) {
17
+ // Fallback values if package.json can't be read
18
+ packageJson = {
19
+ name: 'qa-use-mcp',
20
+ version: '1.0.0',
21
+ description: 'MCP server for browser automation and QA testing',
22
+ };
23
+ }
24
+ }
25
+ return packageJson;
26
+ }
27
+ export function getVersion() {
28
+ return getPackageInfo().version;
29
+ }
30
+ export function getName() {
31
+ return getPackageInfo().name;
32
+ }
33
+ export function getDescription() {
34
+ return getPackageInfo().description;
35
+ }
36
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/utils/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,0CAA0C;AAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,0CAA0C;AAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAS9D,IAAI,WAAW,GAAuB,IAAI,CAAC;AAE3C,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC9D,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gDAAgD;YAChD,WAAW,GAAG;gBACZ,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,kDAAkD;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,WAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,cAAc,EAAE,CAAC,OAAO,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,cAAc,EAAE,CAAC,WAAW,CAAC;AACtC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { TestAgentV2Data, IssueReport } from '../types.js';
2
+ export interface BlockSummary {
3
+ id: number;
4
+ name: string;
5
+ action: string;
6
+ status: 'completed' | 'failed' | 'skipped';
7
+ confidence?: string;
8
+ error?: string;
9
+ }
10
+ export interface EnhancedTestSummary {
11
+ testId: string;
12
+ modelName: string;
13
+ totalSteps: number;
14
+ completedSteps: number;
15
+ failedSteps: number;
16
+ totalDuration: number;
17
+ testResult?: {
18
+ status: 'success' | 'failure';
19
+ message: string;
20
+ explanation: string;
21
+ isPositiveTest: boolean;
22
+ successCriteria: string;
23
+ };
24
+ discoveredIssues: IssueReport[];
25
+ stuckStates: string[];
26
+ finalUrl: string;
27
+ blocks: BlockSummary[];
28
+ }
29
+ export declare function generateEnhancedTestSummary(data: TestAgentV2Data): EnhancedTestSummary;
30
+ export declare function categorizeIssues(issues: IssueReport[]): {
31
+ critical: IssueReport[];
32
+ high: IssueReport[];
33
+ medium: IssueReport[];
34
+ low: IssueReport[];
35
+ };
36
+ export declare function formatEnhancedTestReport(summary: EnhancedTestSummary): string;
37
+ export declare function generateIssueStatistics(issues: IssueReport[]): {
38
+ totalIssues: number;
39
+ bySeverity: Record<string, number>;
40
+ byType: Record<string, number>;
41
+ criticalCount: number;
42
+ hasBlockers: boolean;
43
+ mostCommonType: string | null;
44
+ };
45
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/utils/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAGhG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,OAAO,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,eAAe,GAAG,mBAAmB,CAiFtF;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG;IACvD,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,GAAG,EAAE,WAAW,EAAE,CAAC;CACpB,CAsBA;AAGD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA2E7E;AAGD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAmCA"}
@@ -0,0 +1,198 @@
1
+ import { isTestCreatorDoneIntent } from '../types.js';
2
+ export function generateEnhancedTestSummary(data) {
3
+ const { test_id, model_name, history, blocks, last_done } = data;
4
+ // Calculate totals from history
5
+ const completedSteps = history.filter((h) => h.status === 'completed').length;
6
+ const failedSteps = history.filter((h) => h.status === 'failed').length;
7
+ // Calculate total duration
8
+ const totalDuration = history.reduce((acc, item) => {
9
+ return acc + (item.elapsed_ms || 0);
10
+ }, 0);
11
+ // Process test result if available
12
+ let testResult;
13
+ let discoveredIssues = [];
14
+ if (last_done && isTestCreatorDoneIntent(last_done)) {
15
+ testResult = {
16
+ status: last_done.status,
17
+ message: last_done.message,
18
+ explanation: last_done.explanation,
19
+ isPositiveTest: last_done.is_positive,
20
+ successCriteria: last_done.success_criteria,
21
+ };
22
+ discoveredIssues = last_done.issues || [];
23
+ }
24
+ // Extract stuck states
25
+ const stuckStates = [];
26
+ history.forEach((item) => {
27
+ // Check intents for stuck states
28
+ item.intents.forEach((intent) => {
29
+ if (intent.intent && 'reasoning' in intent.intent) {
30
+ const reasoning = intent.intent.reasoning.toLowerCase();
31
+ if (reasoning.includes('stuck') || reasoning.includes('switching organization')) {
32
+ stuckStates.push(intent.intent.reasoning);
33
+ }
34
+ }
35
+ });
36
+ });
37
+ // Get final URL from last completed history item
38
+ const lastCompleted = [...history].reverse().find((h) => h.status === 'completed');
39
+ const finalUrl = lastCompleted?.end_url || '';
40
+ // Process blocks into summary
41
+ const blockSummaries = blocks.map((block) => {
42
+ const relatedHistory = history.filter((h) => h.block_ids.includes(block.id));
43
+ const hasFailure = relatedHistory.some((h) => h.status === 'failed');
44
+ const allCompleted = relatedHistory.every((h) => h.status === 'completed');
45
+ return {
46
+ id: block.id,
47
+ name: block.name,
48
+ action: block.action?.action || 'unknown',
49
+ status: block.skipped
50
+ ? 'skipped'
51
+ : hasFailure
52
+ ? 'failed'
53
+ : allCompleted
54
+ ? 'completed'
55
+ : 'skipped',
56
+ confidence: block.confidence,
57
+ error: block.last_error || undefined,
58
+ };
59
+ });
60
+ return {
61
+ testId: test_id,
62
+ modelName: model_name,
63
+ totalSteps: history.length,
64
+ completedSteps,
65
+ failedSteps,
66
+ totalDuration,
67
+ testResult,
68
+ discoveredIssues,
69
+ stuckStates: [...new Set(stuckStates)],
70
+ finalUrl,
71
+ blocks: blockSummaries,
72
+ };
73
+ }
74
+ // Helper function to format issues by severity
75
+ export function categorizeIssues(issues) {
76
+ const categorized = {
77
+ critical: [],
78
+ high: [],
79
+ medium: [],
80
+ low: [],
81
+ };
82
+ issues.forEach((issue) => {
83
+ const severity = issue.severity || 'low';
84
+ if (severity === 'critical' || severity === 'blocker') {
85
+ categorized.critical.push(issue);
86
+ }
87
+ else if (severity === 'high' || severity === 'major') {
88
+ categorized.high.push(issue);
89
+ }
90
+ else if (severity === 'medium' || severity === 'minor') {
91
+ categorized.medium.push(issue);
92
+ }
93
+ else {
94
+ categorized.low.push(issue);
95
+ }
96
+ });
97
+ return categorized;
98
+ }
99
+ // Enhanced report formatter
100
+ export function formatEnhancedTestReport(summary) {
101
+ const successRate = ((summary.completedSteps / summary.totalSteps) * 100).toFixed(1);
102
+ const durationSeconds = (summary.totalDuration / 1000).toFixed(2);
103
+ let report = `# Test Execution Report\n\n`;
104
+ report += `**Test ID:** ${summary.testId}\n`;
105
+ report += `**Model:** ${summary.modelName}\n`;
106
+ report += `**Success Rate:** ${successRate}% (${summary.completedSteps}/${summary.totalSteps} steps)\n`;
107
+ report += `**Total Duration:** ${durationSeconds} seconds\n`;
108
+ report += `**Final URL:** ${summary.finalUrl}\n\n`;
109
+ // Add test result section if available
110
+ if (summary.testResult) {
111
+ const statusIcon = summary.testResult.status === 'success' ? '✅' : '❌';
112
+ const testType = summary.testResult.isPositiveTest ? 'Positive' : 'Negative';
113
+ report += `## Test Result ${statusIcon}\n`;
114
+ report += `**Test Type:** ${testType} Test\n`;
115
+ report += `**Status:** ${summary.testResult.status.toUpperCase()}\n`;
116
+ report += `**Message:** ${summary.testResult.message}\n`;
117
+ report += `**Success Criteria:** ${summary.testResult.successCriteria}\n\n`;
118
+ report += `### Explanation\n${summary.testResult.explanation}\n\n`;
119
+ }
120
+ // Add discovered issues section
121
+ if (summary.discoveredIssues.length > 0) {
122
+ report += `## Discovered Issues (${summary.discoveredIssues.length})\n\n`;
123
+ const categorized = categorizeIssues(summary.discoveredIssues);
124
+ ['critical', 'high', 'medium', 'low'].forEach((severity) => {
125
+ const issues = categorized[severity];
126
+ if (issues.length > 0) {
127
+ report += `### ${severity.toUpperCase()} Severity (${issues.length})\n`;
128
+ issues.forEach((issue) => {
129
+ report += `- **${issue.title}** [${issue.issue_type || 'observation'}]\n`;
130
+ report += ` ${issue.description}\n`;
131
+ if (issue.url) {
132
+ report += ` URL: ${issue.url}\n`;
133
+ }
134
+ if (issue.recommendations && issue.recommendations.length > 0) {
135
+ report += ` Recommendations:\n`;
136
+ issue.recommendations.forEach((rec) => {
137
+ report += ` - ${rec}\n`;
138
+ });
139
+ }
140
+ });
141
+ report += `\n`;
142
+ }
143
+ });
144
+ }
145
+ if (summary.stuckStates.length > 0) {
146
+ report += `## Stuck States Detected\n`;
147
+ summary.stuckStates.forEach((state) => {
148
+ report += `- ${state.substring(0, 150)}...\n`;
149
+ });
150
+ report += `\n`;
151
+ }
152
+ report += `## Test Blocks\n`;
153
+ summary.blocks.forEach((block) => {
154
+ const statusIcon = block.status === 'completed' ? '✅' : block.status === 'failed' ? '❌' : '⏭️';
155
+ report += `${statusIcon} **${block.name}** (${block.action})`;
156
+ if (block.confidence) {
157
+ report += ` - Confidence: ${block.confidence}`;
158
+ }
159
+ if (block.error) {
160
+ report += `\n Error: ${block.error}`;
161
+ }
162
+ report += `\n`;
163
+ });
164
+ return report;
165
+ }
166
+ // Function to generate issue statistics
167
+ export function generateIssueStatistics(issues) {
168
+ const bySeverity = {};
169
+ const byType = {};
170
+ let criticalCount = 0;
171
+ let hasBlockers = false;
172
+ issues.forEach((issue) => {
173
+ // Count by severity
174
+ const severity = issue.severity || 'low';
175
+ bySeverity[severity] = (bySeverity[severity] || 0) + 1;
176
+ if (severity === 'critical' || severity === 'blocker') {
177
+ criticalCount++;
178
+ if (severity === 'blocker')
179
+ hasBlockers = true;
180
+ }
181
+ // Count by type
182
+ const type = issue.issue_type || 'observation';
183
+ byType[type] = (byType[type] || 0) + 1;
184
+ });
185
+ // Find most common type
186
+ const mostCommonType = Object.keys(byType).length > 0
187
+ ? Object.entries(byType).sort((a, b) => b[1] - a[1])[0][0]
188
+ : null;
189
+ return {
190
+ totalIssues: issues.length,
191
+ bySeverity,
192
+ byType,
193
+ criticalCount,
194
+ hasBlockers,
195
+ mostCommonType,
196
+ };
197
+ }
198
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/utils/summary.ts"],"names":[],"mappings":"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"}