afterburn-cli 1.0.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/LICENSE +21 -0
- package/README.md +281 -0
- package/dist/ai/gemini-client.d.ts +21 -0
- package/dist/ai/gemini-client.js +105 -0
- package/dist/ai/gemini-client.js.map +1 -0
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/analysis/diagnosis-schema.d.ts +106 -0
- package/dist/analysis/diagnosis-schema.js +54 -0
- package/dist/analysis/diagnosis-schema.js.map +1 -0
- package/dist/analysis/error-analyzer.d.ts +9 -0
- package/dist/analysis/error-analyzer.js +573 -0
- package/dist/analysis/error-analyzer.js.map +1 -0
- package/dist/analysis/index.d.ts +4 -0
- package/dist/analysis/index.js +6 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/source-mapper.d.ts +19 -0
- package/dist/analysis/source-mapper.js +329 -0
- package/dist/analysis/source-mapper.js.map +1 -0
- package/dist/analysis/ui-auditor.d.ts +9 -0
- package/dist/analysis/ui-auditor.js +104 -0
- package/dist/analysis/ui-auditor.js.map +1 -0
- package/dist/artifacts/artifact-storage.d.ts +44 -0
- package/dist/artifacts/artifact-storage.js +99 -0
- package/dist/artifacts/artifact-storage.js.map +1 -0
- package/dist/artifacts/index.d.ts +1 -0
- package/dist/artifacts/index.js +3 -0
- package/dist/artifacts/index.js.map +1 -0
- package/dist/browser/browser-manager.d.ts +45 -0
- package/dist/browser/browser-manager.js +88 -0
- package/dist/browser/browser-manager.js.map +1 -0
- package/dist/browser/challenge-detector.d.ts +10 -0
- package/dist/browser/challenge-detector.js +58 -0
- package/dist/browser/challenge-detector.js.map +1 -0
- package/dist/browser/cookie-dismisser.d.ts +18 -0
- package/dist/browser/cookie-dismisser.js +76 -0
- package/dist/browser/cookie-dismisser.js.map +1 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.js +6 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/stealth-browser.d.ts +13 -0
- package/dist/browser/stealth-browser.js +59 -0
- package/dist/browser/stealth-browser.js.map +1 -0
- package/dist/cli/commander-cli.d.ts +2 -0
- package/dist/cli/commander-cli.js +150 -0
- package/dist/cli/commander-cli.js.map +1 -0
- package/dist/cli/doctor.d.ts +34 -0
- package/dist/cli/doctor.js +124 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/first-run.d.ts +6 -0
- package/dist/cli/first-run.js +58 -0
- package/dist/cli/first-run.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/progress.d.ts +11 -0
- package/dist/cli/progress.js +30 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/core/engine.d.ts +33 -0
- package/dist/core/engine.js +269 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/validation.d.ts +52 -0
- package/dist/core/validation.js +228 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/discovery/crawler.d.ts +58 -0
- package/dist/discovery/crawler.js +240 -0
- package/dist/discovery/crawler.js.map +1 -0
- package/dist/discovery/discovery-pipeline.d.ts +22 -0
- package/dist/discovery/discovery-pipeline.js +256 -0
- package/dist/discovery/discovery-pipeline.js.map +1 -0
- package/dist/discovery/element-mapper.d.ts +21 -0
- package/dist/discovery/element-mapper.js +422 -0
- package/dist/discovery/element-mapper.js.map +1 -0
- package/dist/discovery/index.d.ts +8 -0
- package/dist/discovery/index.js +8 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/link-validator.d.ts +15 -0
- package/dist/discovery/link-validator.js +137 -0
- package/dist/discovery/link-validator.js.map +1 -0
- package/dist/discovery/sitemap-builder.d.ts +19 -0
- package/dist/discovery/sitemap-builder.js +166 -0
- package/dist/discovery/sitemap-builder.js.map +1 -0
- package/dist/discovery/spa-detector.d.ts +12 -0
- package/dist/discovery/spa-detector.js +271 -0
- package/dist/discovery/spa-detector.js.map +1 -0
- package/dist/execution/error-detector.d.ts +10 -0
- package/dist/execution/error-detector.js +87 -0
- package/dist/execution/error-detector.js.map +1 -0
- package/dist/execution/evidence-capture.d.ts +8 -0
- package/dist/execution/evidence-capture.js +37 -0
- package/dist/execution/evidence-capture.js.map +1 -0
- package/dist/execution/index.d.ts +5 -0
- package/dist/execution/index.js +7 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/step-handlers.d.ts +48 -0
- package/dist/execution/step-handlers.js +349 -0
- package/dist/execution/step-handlers.js.map +1 -0
- package/dist/execution/test-data.d.ts +50 -0
- package/dist/execution/test-data.js +160 -0
- package/dist/execution/test-data.js.map +1 -0
- package/dist/execution/workflow-executor.d.ts +56 -0
- package/dist/execution/workflow-executor.js +331 -0
- package/dist/execution/workflow-executor.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/entry.d.ts +2 -0
- package/dist/mcp/entry.js +5 -0
- package/dist/mcp/entry.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.js +19 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -0
- package/dist/mcp/tools.js +162 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/planning/heuristic-planner.d.ts +7 -0
- package/dist/planning/heuristic-planner.js +238 -0
- package/dist/planning/heuristic-planner.js.map +1 -0
- package/dist/planning/index.d.ts +3 -0
- package/dist/planning/index.js +5 -0
- package/dist/planning/index.js.map +1 -0
- package/dist/planning/plan-schema.d.ts +74 -0
- package/dist/planning/plan-schema.js +39 -0
- package/dist/planning/plan-schema.js.map +1 -0
- package/dist/planning/workflow-planner.d.ts +39 -0
- package/dist/planning/workflow-planner.js +211 -0
- package/dist/planning/workflow-planner.js.map +1 -0
- package/dist/reports/health-scorer.d.ts +14 -0
- package/dist/reports/health-scorer.js +88 -0
- package/dist/reports/health-scorer.js.map +1 -0
- package/dist/reports/html-generator.d.ts +10 -0
- package/dist/reports/html-generator.js +155 -0
- package/dist/reports/html-generator.js.map +1 -0
- package/dist/reports/index.d.ts +4 -0
- package/dist/reports/index.js +6 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/markdown-generator.d.ts +10 -0
- package/dist/reports/markdown-generator.js +334 -0
- package/dist/reports/markdown-generator.js.map +1 -0
- package/dist/reports/priority-ranker.d.ts +22 -0
- package/dist/reports/priority-ranker.js +608 -0
- package/dist/reports/priority-ranker.js.map +1 -0
- package/dist/screenshots/dual-format.d.ts +14 -0
- package/dist/screenshots/dual-format.js +59 -0
- package/dist/screenshots/dual-format.js.map +1 -0
- package/dist/screenshots/index.d.ts +2 -0
- package/dist/screenshots/index.js +4 -0
- package/dist/screenshots/index.js.map +1 -0
- package/dist/screenshots/screenshot-manager.d.ts +33 -0
- package/dist/screenshots/screenshot-manager.js +86 -0
- package/dist/screenshots/screenshot-manager.js.map +1 -0
- package/dist/testing/accessibility-auditor.d.ts +23 -0
- package/dist/testing/accessibility-auditor.js +44 -0
- package/dist/testing/accessibility-auditor.js.map +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/meta-auditor.d.ts +16 -0
- package/dist/testing/meta-auditor.js +268 -0
- package/dist/testing/meta-auditor.js.map +1 -0
- package/dist/testing/performance-monitor.d.ts +15 -0
- package/dist/testing/performance-monitor.js +64 -0
- package/dist/testing/performance-monitor.js.map +1 -0
- package/dist/types/artifacts.d.ts +58 -0
- package/dist/types/artifacts.js +3 -0
- package/dist/types/artifacts.js.map +1 -0
- package/dist/types/discovery.d.ts +124 -0
- package/dist/types/discovery.js +3 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/execution.d.ts +154 -0
- package/dist/types/execution.js +3 -0
- package/dist/types/execution.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/sanitizer.d.ts +25 -0
- package/dist/utils/sanitizer.js +98 -0
- package/dist/utils/sanitizer.js.map +1 -0
- package/package.json +86 -0
- package/templates/report.hbs +202 -0
- package/templates/styles/report.css +607 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
// Discovery pipeline orchestrator: crawl + elements + SPA + links + sitemap + workflows
|
|
2
|
+
import { SiteCrawler } from './crawler.js';
|
|
3
|
+
import { detectSPAFramework, interceptRouteChanges } from './spa-detector.js';
|
|
4
|
+
import { discoverElements, discoverHiddenElements } from './element-mapper.js';
|
|
5
|
+
import { validateLinks, createLinkValidationState } from './link-validator.js';
|
|
6
|
+
import { buildSitemap, printSitemapTree } from './sitemap-builder.js';
|
|
7
|
+
import { WorkflowPlanner } from '../planning/index.js';
|
|
8
|
+
import { generateHeuristicPlans } from '../planning/heuristic-planner.js';
|
|
9
|
+
import { GeminiClient } from '../ai/index.js';
|
|
10
|
+
import { BrowserManager } from '../browser/index.js';
|
|
11
|
+
import { ScreenshotManager } from '../screenshots/index.js';
|
|
12
|
+
import { ArtifactStorage } from '../artifacts/index.js';
|
|
13
|
+
export async function resolveWorkflowPlans(planPromise, sitemap) {
|
|
14
|
+
if (!planPromise) {
|
|
15
|
+
return {
|
|
16
|
+
workflowPlans: generateHeuristicPlans(sitemap),
|
|
17
|
+
usedHeuristicFallback: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const workflowPlans = await planPromise;
|
|
22
|
+
return {
|
|
23
|
+
workflowPlans,
|
|
24
|
+
usedHeuristicFallback: false,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return {
|
|
29
|
+
workflowPlans: generateHeuristicPlans(sitemap),
|
|
30
|
+
usedHeuristicFallback: true,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Runs complete Phase 2 discovery pipeline: crawl, discover elements, detect SPA,
|
|
36
|
+
* validate links, build sitemap, generate workflow plans.
|
|
37
|
+
*
|
|
38
|
+
* @param options Discovery configuration
|
|
39
|
+
* @returns Complete discovery artifact with sitemap and workflow plans
|
|
40
|
+
*/
|
|
41
|
+
export async function runDiscovery(options) {
|
|
42
|
+
const { targetUrl, sessionId, userHints = [], maxPages = 10, headless = true, onProgress = (msg) => console.log(msg) } = options;
|
|
43
|
+
// Step 1: Initialize managers
|
|
44
|
+
const browserManager = new BrowserManager({ headless });
|
|
45
|
+
const screenshotManager = new ScreenshotManager();
|
|
46
|
+
const artifactStorage = new ArtifactStorage();
|
|
47
|
+
let spaFramework = { framework: 'none' };
|
|
48
|
+
let spaRoutes = [];
|
|
49
|
+
const allBrokenLinks = [];
|
|
50
|
+
const linkValidationState = createLinkValidationState();
|
|
51
|
+
try {
|
|
52
|
+
// Step 2: Launch browser
|
|
53
|
+
onProgress('Launching browser...');
|
|
54
|
+
await browserManager.launch();
|
|
55
|
+
// Block heavy resources during discovery (images, fonts, video, analytics)
|
|
56
|
+
// Keep SVG — icon-only buttons need them for element discovery
|
|
57
|
+
const ctx = browserManager.getContext();
|
|
58
|
+
if (ctx) {
|
|
59
|
+
await ctx.route('**/*.{png,jpg,jpeg,gif,webp,woff,woff2,ttf,mp4,mp3}', r => r.abort());
|
|
60
|
+
await ctx.route('**/analytics**', r => r.abort());
|
|
61
|
+
await ctx.route('**/gtag**', r => r.abort());
|
|
62
|
+
}
|
|
63
|
+
// Step 3: SPA Detection (first page only)
|
|
64
|
+
onProgress(`Detecting SPA framework on ${targetUrl}...`);
|
|
65
|
+
const spaDetectionPage = await browserManager.newPage(targetUrl, { networkIdleTimeout: 5000 });
|
|
66
|
+
try {
|
|
67
|
+
// Detect framework
|
|
68
|
+
spaFramework = await detectSPAFramework(spaDetectionPage);
|
|
69
|
+
if (spaFramework.framework !== 'none') {
|
|
70
|
+
onProgress(`Detected ${spaFramework.framework} app${spaFramework.version ? ' v' + spaFramework.version : ''}`);
|
|
71
|
+
// Intercept routes if SPA detected
|
|
72
|
+
onProgress('Discovering client-side routes...');
|
|
73
|
+
spaRoutes = await interceptRouteChanges(spaDetectionPage);
|
|
74
|
+
if (spaRoutes.length > 0) {
|
|
75
|
+
onProgress(`Found ${spaRoutes.length} client-side routes`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
onProgress('No SPA framework detected');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
await spaDetectionPage.close();
|
|
84
|
+
}
|
|
85
|
+
// Step 4: Define pageProcessor callback
|
|
86
|
+
// This is called by the crawler for each page BEFORE it closes the page
|
|
87
|
+
let pageIndex = 0;
|
|
88
|
+
const pageProcessor = async (page, url) => {
|
|
89
|
+
pageIndex++;
|
|
90
|
+
try {
|
|
91
|
+
// Discover visible elements
|
|
92
|
+
const visibleElements = await discoverElements(page, url);
|
|
93
|
+
// Discover hidden elements (modals, dropdowns)
|
|
94
|
+
const hiddenElements = await discoverHiddenElements(page, url);
|
|
95
|
+
// Merge visible + hidden (deduplicate by selector/href)
|
|
96
|
+
const mergedElements = {
|
|
97
|
+
forms: [...visibleElements.forms],
|
|
98
|
+
buttons: [...visibleElements.buttons],
|
|
99
|
+
links: [...visibleElements.links],
|
|
100
|
+
menus: [...visibleElements.menus],
|
|
101
|
+
otherInteractive: [...visibleElements.otherInteractive],
|
|
102
|
+
};
|
|
103
|
+
// Merge hidden forms
|
|
104
|
+
for (const form of hiddenElements.forms) {
|
|
105
|
+
if (!mergedElements.forms.some(f => f.selector === form.selector)) {
|
|
106
|
+
mergedElements.forms.push(form);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Merge hidden buttons
|
|
110
|
+
for (const button of hiddenElements.buttons) {
|
|
111
|
+
if (!mergedElements.buttons.some(b => b.selector === button.selector)) {
|
|
112
|
+
mergedElements.buttons.push(button);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Merge hidden links
|
|
116
|
+
for (const link of hiddenElements.links) {
|
|
117
|
+
if (!mergedElements.links.some(l => l.href === link.href)) {
|
|
118
|
+
mergedElements.links.push(link);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Merge hidden menus
|
|
122
|
+
for (const menu of hiddenElements.menus) {
|
|
123
|
+
if (!mergedElements.menus.some(m => m.selector === menu.selector)) {
|
|
124
|
+
mergedElements.menus.push(menu);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Merge other interactive
|
|
128
|
+
for (const other of hiddenElements.otherInteractive) {
|
|
129
|
+
if (!mergedElements.otherInteractive.some(o => o.selector === other.selector)) {
|
|
130
|
+
mergedElements.otherInteractive.push(other);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Capture screenshot
|
|
134
|
+
const screenshotRef = await screenshotManager.capture(page, `page-${pageIndex}`);
|
|
135
|
+
// Validate links
|
|
136
|
+
const brokenLinksOnPage = await validateLinks(mergedElements.links, page, linkValidationState);
|
|
137
|
+
allBrokenLinks.push(...brokenLinksOnPage);
|
|
138
|
+
// Report progress
|
|
139
|
+
onProgress(` Crawled: ${url} (${pageIndex} pages found)`);
|
|
140
|
+
// Return partial PageData to merge with crawler's base data
|
|
141
|
+
return {
|
|
142
|
+
forms: mergedElements.forms,
|
|
143
|
+
buttons: mergedElements.buttons,
|
|
144
|
+
menus: mergedElements.menus,
|
|
145
|
+
otherInteractive: mergedElements.otherInteractive,
|
|
146
|
+
screenshotRef,
|
|
147
|
+
spaFramework,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Log warning but continue crawl
|
|
152
|
+
console.warn(`Warning: Failed to process page ${url}:`, error instanceof Error ? error.message : String(error));
|
|
153
|
+
return {
|
|
154
|
+
forms: [],
|
|
155
|
+
buttons: [],
|
|
156
|
+
menus: [],
|
|
157
|
+
otherInteractive: [],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
// Step 5: Construct SiteCrawler with pageProcessor and additionalUrls
|
|
162
|
+
const crawlerOptions = {
|
|
163
|
+
maxPages,
|
|
164
|
+
onPageCrawled: (url, count) => {
|
|
165
|
+
// Progress already handled in pageProcessor
|
|
166
|
+
},
|
|
167
|
+
pageProcessor,
|
|
168
|
+
additionalUrls: spaRoutes,
|
|
169
|
+
};
|
|
170
|
+
const crawler = new SiteCrawler(browserManager, crawlerOptions);
|
|
171
|
+
// Step 6: Run crawler
|
|
172
|
+
onProgress('Starting site crawl...');
|
|
173
|
+
const crawlResult = await crawler.crawl(targetUrl, spaRoutes);
|
|
174
|
+
// Update crawl result with our collected data
|
|
175
|
+
crawlResult.brokenLinks = allBrokenLinks;
|
|
176
|
+
crawlResult.totalLinksChecked = linkValidationState.checkedCount;
|
|
177
|
+
crawlResult.spaDetected = spaFramework;
|
|
178
|
+
onProgress(`Crawl complete: ${crawlResult.totalPagesDiscovered} pages discovered`);
|
|
179
|
+
// Step 7: Build sitemap
|
|
180
|
+
onProgress('Building sitemap...');
|
|
181
|
+
const sitemap = buildSitemap(crawlResult.pages, targetUrl);
|
|
182
|
+
console.log('\nSite Map:');
|
|
183
|
+
console.log(printSitemapTree(sitemap));
|
|
184
|
+
// Step 8: Generate workflow plans (overlapped with browser cleanup)
|
|
185
|
+
let workflowPlans = [];
|
|
186
|
+
// Check if GEMINI_API_KEY is set
|
|
187
|
+
const geminiApiKey = process.env.GEMINI_API_KEY;
|
|
188
|
+
// Fire off planning as a non-blocking promise (doesn't need browser)
|
|
189
|
+
let planPromise = null;
|
|
190
|
+
if (geminiApiKey) {
|
|
191
|
+
onProgress('Generating workflow plans with AI...');
|
|
192
|
+
const geminiClient = new GeminiClient(geminiApiKey);
|
|
193
|
+
const workflowPlanner = new WorkflowPlanner(geminiClient);
|
|
194
|
+
planPromise = workflowPlanner.generatePlans(sitemap, userHints);
|
|
195
|
+
}
|
|
196
|
+
// Meanwhile, close browser (planning doesn't need it)
|
|
197
|
+
onProgress('Closing browser...');
|
|
198
|
+
await browserManager.close();
|
|
199
|
+
// Now await planning result (or generate heuristic plans)
|
|
200
|
+
const { workflowPlans: resolvedPlans, usedHeuristicFallback } = await resolveWorkflowPlans(planPromise, sitemap);
|
|
201
|
+
workflowPlans = resolvedPlans;
|
|
202
|
+
if (usedHeuristicFallback) {
|
|
203
|
+
if (planPromise) {
|
|
204
|
+
console.warn('\nAI planning failed - using heuristic test plans');
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
console.warn('\nUsing heuristic test plans (set GEMINI_API_KEY for smarter AI-driven testing)');
|
|
208
|
+
}
|
|
209
|
+
if (workflowPlans.length > 0) {
|
|
210
|
+
console.log('\nDiscovered Workflows (heuristic):');
|
|
211
|
+
workflowPlans.forEach((plan, index) => {
|
|
212
|
+
console.log(` ${index + 1}. ${plan.workflowName} (${plan.priority}) - ${plan.steps.length} steps`);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else if (workflowPlans.length > 0) {
|
|
217
|
+
console.log('\nDiscovered Workflows:');
|
|
218
|
+
workflowPlans.forEach((plan, index) => {
|
|
219
|
+
console.log(` ${index + 1}. ${plan.workflowName} (${plan.priority}) - ${plan.steps.length} steps`);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
console.log('\nNo workflows generated');
|
|
224
|
+
}
|
|
225
|
+
// Step 9: Save discovery artifact (after plans are ready)
|
|
226
|
+
const artifact = {
|
|
227
|
+
version: '1.0',
|
|
228
|
+
stage: 'discovery',
|
|
229
|
+
timestamp: new Date().toISOString(),
|
|
230
|
+
sessionId,
|
|
231
|
+
targetUrl,
|
|
232
|
+
sitemap,
|
|
233
|
+
crawlResult,
|
|
234
|
+
workflowPlans,
|
|
235
|
+
userHints,
|
|
236
|
+
};
|
|
237
|
+
onProgress('Saving discovery artifact...');
|
|
238
|
+
await artifactStorage.save(artifact);
|
|
239
|
+
// Step 10: Return artifact
|
|
240
|
+
return artifact;
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
console.error('Discovery pipeline failed:', error instanceof Error ? error.message : String(error));
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
// Always close browser even on error
|
|
248
|
+
try {
|
|
249
|
+
await browserManager.close();
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Ignore cleanup errors
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=discovery-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-pipeline.js","sourceRoot":"","sources":["../../src/discovery/discovery-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { FormInfo, InteractiveElement, LinkInfo } from '../types/discovery.js';
|
|
3
|
+
/**
|
|
4
|
+
* Container for all discovered interactive elements on a page
|
|
5
|
+
*/
|
|
6
|
+
export interface DiscoveredElements {
|
|
7
|
+
forms: FormInfo[];
|
|
8
|
+
buttons: InteractiveElement[];
|
|
9
|
+
links: LinkInfo[];
|
|
10
|
+
menus: InteractiveElement[];
|
|
11
|
+
otherInteractive: InteractiveElement[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Discover all visible interactive elements on a page
|
|
15
|
+
*/
|
|
16
|
+
export declare function discoverElements(page: Page, pageUrl: string): Promise<DiscoveredElements>;
|
|
17
|
+
/**
|
|
18
|
+
* Discover hidden elements by triggering interactions (buttons, menus, modals)
|
|
19
|
+
* Returns only NEWLY discovered elements (not present in initial page load)
|
|
20
|
+
*/
|
|
21
|
+
export declare function discoverHiddenElements(page: Page, pageUrl: string): Promise<DiscoveredElements>;
|