@dallask/a11y-mcp-srv 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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +9 -0
  3. package/README.md +1328 -0
  4. package/bin/server.js +8 -0
  5. package/dist/core/accessibility-runner.d.ts +123 -0
  6. package/dist/core/accessibility-runner.d.ts.map +1 -0
  7. package/dist/core/accessibility-runner.js +465 -0
  8. package/dist/core/accessibility-runner.js.map +1 -0
  9. package/dist/core/basic-auth.d.ts +35 -0
  10. package/dist/core/basic-auth.d.ts.map +1 -0
  11. package/dist/core/basic-auth.js +52 -0
  12. package/dist/core/basic-auth.js.map +1 -0
  13. package/dist/core/config.d.ts +44 -0
  14. package/dist/core/config.d.ts.map +1 -0
  15. package/dist/core/config.js +163 -0
  16. package/dist/core/config.js.map +1 -0
  17. package/dist/core/error-handler.d.ts +66 -0
  18. package/dist/core/error-handler.d.ts.map +1 -0
  19. package/dist/core/error-handler.js +305 -0
  20. package/dist/core/error-handler.js.map +1 -0
  21. package/dist/core/normalize-audit-result.d.ts +18 -0
  22. package/dist/core/normalize-audit-result.d.ts.map +1 -0
  23. package/dist/core/normalize-audit-result.js +118 -0
  24. package/dist/core/normalize-audit-result.js.map +1 -0
  25. package/dist/core/playwright-bootstrap.d.ts +21 -0
  26. package/dist/core/playwright-bootstrap.d.ts.map +1 -0
  27. package/dist/core/playwright-bootstrap.js +144 -0
  28. package/dist/core/playwright-bootstrap.js.map +1 -0
  29. package/dist/core/progress-streamer.d.ts +44 -0
  30. package/dist/core/progress-streamer.d.ts.map +1 -0
  31. package/dist/core/progress-streamer.js +160 -0
  32. package/dist/core/progress-streamer.js.map +1 -0
  33. package/dist/core/result-processor.d.ts +86 -0
  34. package/dist/core/result-processor.d.ts.map +1 -0
  35. package/dist/core/result-processor.js +475 -0
  36. package/dist/core/result-processor.js.map +1 -0
  37. package/dist/core/session-manager.d.ts +73 -0
  38. package/dist/core/session-manager.d.ts.map +1 -0
  39. package/dist/core/session-manager.js +243 -0
  40. package/dist/core/session-manager.js.map +1 -0
  41. package/dist/server.d.ts +10 -0
  42. package/dist/server.d.ts.map +1 -0
  43. package/dist/server.js +1439 -0
  44. package/dist/server.js.map +1 -0
  45. package/dist/tools/aggregate.d.ts +26 -0
  46. package/dist/tools/aggregate.d.ts.map +1 -0
  47. package/dist/tools/aggregate.js +340 -0
  48. package/dist/tools/aggregate.js.map +1 -0
  49. package/dist/tools/analysis.d.ts +68 -0
  50. package/dist/tools/analysis.d.ts.map +1 -0
  51. package/dist/tools/analysis.js +1199 -0
  52. package/dist/tools/analysis.js.map +1 -0
  53. package/dist/tools/audit.d.ts +38 -0
  54. package/dist/tools/audit.d.ts.map +1 -0
  55. package/dist/tools/audit.js +472 -0
  56. package/dist/tools/audit.js.map +1 -0
  57. package/dist/tools/comparison.d.ts +27 -0
  58. package/dist/tools/comparison.d.ts.map +1 -0
  59. package/dist/tools/comparison.js +499 -0
  60. package/dist/tools/comparison.js.map +1 -0
  61. package/dist/tools/export.d.ts +43 -0
  62. package/dist/tools/export.d.ts.map +1 -0
  63. package/dist/tools/export.js +746 -0
  64. package/dist/tools/export.js.map +1 -0
  65. package/dist/tools/filter.d.ts +26 -0
  66. package/dist/tools/filter.d.ts.map +1 -0
  67. package/dist/tools/filter.js +244 -0
  68. package/dist/tools/filter.js.map +1 -0
  69. package/dist/tools/session.d.ts +26 -0
  70. package/dist/tools/session.d.ts.map +1 -0
  71. package/dist/tools/session.js +228 -0
  72. package/dist/tools/session.js.map +1 -0
  73. package/dist/tools/visualize.d.ts +26 -0
  74. package/dist/tools/visualize.d.ts.map +1 -0
  75. package/dist/tools/visualize.js +942 -0
  76. package/dist/tools/visualize.js.map +1 -0
  77. package/dist/types/index.d.ts +792 -0
  78. package/dist/types/index.d.ts.map +1 -0
  79. package/dist/types/index.js +24 -0
  80. package/dist/types/index.js.map +1 -0
  81. package/package.json +69 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Normalize audit result input so tools that accept "result or URL" can safely
3
+ * handle JSON strings, MCP response wrappers, and partial objects.
4
+ */
5
+ import type { AuditResult } from '../types/index.js';
6
+ /**
7
+ * Normalize audit result input from a client.
8
+ * - URL string: returns null (caller should run audit).
9
+ * - JSON string of single result: parses and normalizes.
10
+ * - MCP wrapper { content: [{ text: "..." }] }: extracts and normalizes.
11
+ * - Batch { results: [...] }: normalizes first element.
12
+ * - Plain object: fills missing fields with defaults.
13
+ *
14
+ * @param value - Raw value (string, or object from previous tool output).
15
+ * @returns Normalized AuditResult, or null when value is a URL (run audit) or parsing fails.
16
+ */
17
+ export declare function normalizeAuditResult(value: unknown): AuditResult | null;
18
+ //# sourceMappingURL=normalize-audit-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-audit-result.d.ts","sourceRoot":"","sources":["../../src/core/normalize-audit-result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,mBAAmB,CAAA;AA4DlF;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAsDvE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Normalize audit result input so tools that accept "result or URL" can safely
3
+ * handle JSON strings, MCP response wrappers, and partial objects.
4
+ */
5
+ const DEFAULT_SUMMARY = {
6
+ totalIssues: 0,
7
+ score: 0,
8
+ wcagCompliance: { A: 0, AA: 0, AAA: 0 },
9
+ byCategory: {},
10
+ byImpact: {},
11
+ };
12
+ function isUrlString(value) {
13
+ const t = value.trim();
14
+ return t.startsWith('http://') || t.startsWith('https://');
15
+ }
16
+ function isJsonLikeString(value) {
17
+ return value.trim().startsWith('{');
18
+ }
19
+ /**
20
+ * Normalize a raw object into a full AuditResult with guaranteed arrays and summary.
21
+ */
22
+ function normalizeObject(obj) {
23
+ const prioritizedIssues = Array.isArray(obj.prioritizedIssues) ? obj.prioritizedIssues : [];
24
+ const quickWins = Array.isArray(obj.quickWins) ? obj.quickWins : [];
25
+ const criticalBlockers = Array.isArray(obj.criticalBlockers) ? obj.criticalBlockers : [];
26
+ let summary = DEFAULT_SUMMARY;
27
+ if (obj.summary != null && typeof obj.summary === 'object') {
28
+ const s = obj.summary;
29
+ const wcag = s.wcagCompliance != null && typeof s.wcagCompliance === 'object'
30
+ ? s.wcagCompliance
31
+ : { A: 0, AA: 0, AAA: 0 };
32
+ summary = {
33
+ totalIssues: typeof s.totalIssues === 'number' ? s.totalIssues : 0,
34
+ score: typeof s.score === 'number' ? s.score : 0,
35
+ wcagCompliance: wcag,
36
+ byCategory: s.byCategory != null && typeof s.byCategory === 'object' && !Array.isArray(s.byCategory)
37
+ ? s.byCategory
38
+ : {},
39
+ byImpact: s.byImpact != null && typeof s.byImpact === 'object' && !Array.isArray(s.byImpact)
40
+ ? s.byImpact
41
+ : {},
42
+ };
43
+ }
44
+ return {
45
+ summary,
46
+ prioritizedIssues,
47
+ quickWins,
48
+ criticalBlockers,
49
+ conversationalSummary: typeof obj.conversationalSummary === 'string' ? obj.conversationalSummary : '',
50
+ issuesTable: typeof obj.issuesTable === 'string' ? obj.issuesTable : '',
51
+ appliedFilters: obj.appliedFilters != null && typeof obj.appliedFilters === 'object' ? obj.appliedFilters : undefined,
52
+ metadata: obj.metadata != null && typeof obj.metadata === 'object' ? obj.metadata : undefined,
53
+ rawResults: obj.rawResults,
54
+ responseStatus: typeof obj.responseStatus === 'number' ? obj.responseStatus : undefined,
55
+ };
56
+ }
57
+ /**
58
+ * Normalize audit result input from a client.
59
+ * - URL string: returns null (caller should run audit).
60
+ * - JSON string of single result: parses and normalizes.
61
+ * - MCP wrapper { content: [{ text: "..." }] }: extracts and normalizes.
62
+ * - Batch { results: [...] }: normalizes first element.
63
+ * - Plain object: fills missing fields with defaults.
64
+ *
65
+ * @param value - Raw value (string, or object from previous tool output).
66
+ * @returns Normalized AuditResult, or null when value is a URL (run audit) or parsing fails.
67
+ */
68
+ export function normalizeAuditResult(value) {
69
+ if (value == null) {
70
+ return null;
71
+ }
72
+ if (typeof value === 'string') {
73
+ const trimmed = value.trim();
74
+ if (isUrlString(trimmed)) {
75
+ return null;
76
+ }
77
+ if (isJsonLikeString(trimmed)) {
78
+ try {
79
+ const parsed = JSON.parse(trimmed);
80
+ return normalizeAuditResult(parsed);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ return null;
87
+ }
88
+ if (typeof value !== 'object') {
89
+ return null;
90
+ }
91
+ const obj = value;
92
+ // MCP response wrapper: { content: [ { type, text } ] }
93
+ const content = obj.content;
94
+ if (Array.isArray(content) && content.length > 0) {
95
+ const first = content[0];
96
+ if (first != null && typeof first === 'object' && 'text' in first && typeof first.text === 'string') {
97
+ try {
98
+ const parsed = JSON.parse(first.text);
99
+ return normalizeAuditResult(parsed);
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ }
106
+ // Batch result from audit_multiple_urls: { results: AuditResult[], ... }
107
+ const resultsArray = obj.results;
108
+ if (Array.isArray(resultsArray) && resultsArray.length > 0) {
109
+ return normalizeAuditResult(resultsArray[0]);
110
+ }
111
+ // Plain audit result (single): must look like one (has summary or prioritizedIssues)
112
+ if ('summary' in obj || 'prioritizedIssues' in obj) {
113
+ return normalizeObject(obj);
114
+ }
115
+ // Empty or unrecognized object: return minimal valid result so callers don't throw
116
+ return normalizeObject(obj);
117
+ }
118
+ //# sourceMappingURL=normalize-audit-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-audit-result.js","sourceRoot":"","sources":["../../src/core/normalize-audit-result.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Ensures Playwright browsers are installed when running in environments (e.g. CodeMie, CI)
3
+ * where they may not be pre-installed. On "Executable doesn't exist", runs
4
+ * `playwright install chromium` and retries the launch.
5
+ */
6
+ import { chromium, type Browser } from 'playwright';
7
+ /** Detect the "Executable doesn't exist" error from Playwright (missing browser install). */
8
+ export declare function isMissingBrowserError(error: unknown): boolean;
9
+ /** Detect "Failed to launch the browser process" (often missing system deps on Linux/Docker). */
10
+ export declare function isLaunchFailureError(error: unknown): boolean;
11
+ /** Run `playwright install chromium` so the current process's cache has the browser. */
12
+ export declare function installPlaywrightChromium(): void;
13
+ export type LaunchOptions = Parameters<typeof chromium.launch>[0];
14
+ /**
15
+ * Launch Chromium, installing the browser if missing (e.g. first run in CodeMie).
16
+ * Retries launch once after install on "Executable doesn't exist".
17
+ * On "Failed to launch the browser process", tries `playwright install chromium --with-deps` and retries once.
18
+ * Uses robust launch args for CI/containers; caller args are merged in.
19
+ */
20
+ export declare function launchChromium(options: LaunchOptions): Promise<Browser>;
21
+ //# sourceMappingURL=playwright-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/playwright-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAGnD,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM7D;AAED,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG5D;AASD,wFAAwF;AACxF,wBAAgB,yBAAyB,IAAI,IAAI,CAgBhD;AA2BD,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAiDjE;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB7E"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Ensures Playwright browsers are installed when running in environments (e.g. CodeMie, CI)
3
+ * where they may not be pre-installed. On "Executable doesn't exist", runs
4
+ * `playwright install chromium` and retries the launch.
5
+ */
6
+ import { createRequire } from 'node:module';
7
+ import { execSync } from 'node:child_process';
8
+ import { dirname, join } from 'node:path';
9
+ import { chromium } from 'playwright';
10
+ import { toErrorMessage } from './error-handler.js';
11
+ /** Detect the "Executable doesn't exist" error from Playwright (missing browser install). */
12
+ export function isMissingBrowserError(error) {
13
+ const msg = toErrorMessage(error).toLowerCase();
14
+ return ((msg.includes('executable doesn\'t exist') || msg.includes('executable does not exist')) &&
15
+ (msg.includes('ms-playwright') || msg.includes('chromium_headless_shell') || msg.includes('playwright')));
16
+ }
17
+ /** Detect "Failed to launch the browser process" (often missing system deps on Linux/Docker). */
18
+ export function isLaunchFailureError(error) {
19
+ const msg = toErrorMessage(error).toLowerCase();
20
+ return msg.includes('failed to launch the browser process');
21
+ }
22
+ /** Resolve path to the Playwright CLI (same package as the one we import). */
23
+ function getPlaywrightCliPath() {
24
+ const require = createRequire(import.meta.url);
25
+ const playwrightDir = dirname(require.resolve('playwright/package.json'));
26
+ return join(playwrightDir, 'cli.js');
27
+ }
28
+ /** Run `playwright install chromium` so the current process's cache has the browser. */
29
+ export function installPlaywrightChromium() {
30
+ const cliPath = getPlaywrightCliPath();
31
+ const node = process.execPath;
32
+ console.error('[accessibility-mcp-server] Installing Playwright Chromium (one-time or after update)...');
33
+ try {
34
+ execSync(`"${node}" "${cliPath}" install chromium`, {
35
+ stdio: 'inherit',
36
+ env: process.env,
37
+ cwd: process.cwd(),
38
+ });
39
+ console.error('[accessibility-mcp-server] Playwright Chromium install completed.');
40
+ }
41
+ catch (err) {
42
+ const msg = toErrorMessage(err);
43
+ console.error(`[accessibility-mcp-server] Playwright install failed: ${msg}`);
44
+ throw new Error(`Playwright Chromium install failed: ${msg}`);
45
+ }
46
+ }
47
+ /**
48
+ * Run `playwright install chromium --with-deps` to install browser + system dependencies
49
+ * (e.g. libgbm, libnss3 on Linux). Use when the browser binary exists but fails to launch.
50
+ * May require root/sudo in some environments; best-effort only.
51
+ */
52
+ function installPlaywrightChromiumWithDeps() {
53
+ const cliPath = getPlaywrightCliPath();
54
+ const node = process.execPath;
55
+ console.error('[accessibility-mcp-server] Installing Chromium with system dependencies (--with-deps)...');
56
+ try {
57
+ execSync(`"${node}" "${cliPath}" install chromium --with-deps`, {
58
+ stdio: 'inherit',
59
+ env: process.env,
60
+ cwd: process.cwd(),
61
+ });
62
+ console.error('[accessibility-mcp-server] Chromium + deps install completed.');
63
+ }
64
+ catch (err) {
65
+ const msg = toErrorMessage(err);
66
+ console.error(`[accessibility-mcp-server] install --with-deps failed: ${msg}`);
67
+ throw new Error(`Chromium system-deps install failed: ${msg}. You may need to run 'npx playwright install --with-deps' manually with appropriate permissions.`);
68
+ }
69
+ }
70
+ /**
71
+ * Chromium args that improve launch success in CI, containers, and restricted environments
72
+ * (e.g. CodeMie, Docker, headless Linux). Reduces GPU/sandbox/display issues.
73
+ */
74
+ const ROBUST_LAUNCH_ARGS = [
75
+ '--disable-dev-shm-usage',
76
+ '--no-sandbox',
77
+ '--disable-setuid-sandbox',
78
+ '--disable-gpu',
79
+ '--disable-software-rasterizer',
80
+ '--disable-extensions',
81
+ '--disable-background-networking',
82
+ '--disable-default-apps',
83
+ '--disable-sync',
84
+ '--disable-translate',
85
+ '--metrics-recording-only',
86
+ '--mute-audio',
87
+ '--no-first-run',
88
+ '--safebrowsing-disable-auto-update',
89
+ '--disable-features=TranslateUI',
90
+ '--disable-ipc-flooding-protection',
91
+ '--disable-renderer-backgrounding',
92
+ '--disable-backgrounding-occluded-windows',
93
+ '--disable-hang-monitor',
94
+ '--disable-prompt-on-repost',
95
+ '--disable-client-side-phishing-detection',
96
+ '--run-all-compositor-stages-before-draw',
97
+ ];
98
+ /**
99
+ * Merge caller args with robust defaults (caller args take precedence; no duplicates).
100
+ */
101
+ function mergeLaunchArgs(callerArgs) {
102
+ const seen = new Set(ROBUST_LAUNCH_ARGS);
103
+ const out = [...ROBUST_LAUNCH_ARGS];
104
+ if (Array.isArray(callerArgs)) {
105
+ for (const a of callerArgs) {
106
+ const flag = a.split('=')[0];
107
+ if (!seen.has(flag)) {
108
+ seen.add(flag);
109
+ out.push(a);
110
+ }
111
+ }
112
+ }
113
+ return out;
114
+ }
115
+ /**
116
+ * Launch Chromium, installing the browser if missing (e.g. first run in CodeMie).
117
+ * Retries launch once after install on "Executable doesn't exist".
118
+ * On "Failed to launch the browser process", tries `playwright install chromium --with-deps` and retries once.
119
+ * Uses robust launch args for CI/containers; caller args are merged in.
120
+ */
121
+ export async function launchChromium(options) {
122
+ const args = mergeLaunchArgs(options?.args);
123
+ const launchOpts = {
124
+ ...options,
125
+ headless: options?.headless !== false,
126
+ args,
127
+ };
128
+ const tryLaunch = async () => chromium.launch(launchOpts);
129
+ try {
130
+ return await tryLaunch();
131
+ }
132
+ catch (error) {
133
+ if (isMissingBrowserError(error)) {
134
+ installPlaywrightChromium();
135
+ return await tryLaunch();
136
+ }
137
+ if (isLaunchFailureError(error)) {
138
+ installPlaywrightChromiumWithDeps();
139
+ return await tryLaunch();
140
+ }
141
+ throw error;
142
+ }
143
+ }
144
+ //# sourceMappingURL=playwright-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-bootstrap.js","sourceRoot":"","sources":["../../src/core/playwright-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Progress Streamer - Handles progress updates for long-running operations
3
+ * Provides utilities for tracking and reporting progress with time estimates
4
+ */
5
+ import type { ProgressUpdate, BatchAuditProgress } from '../types/index.js';
6
+ /**
7
+ * Progress callback type
8
+ */
9
+ export type ProgressCallback = (progress: ProgressUpdate | BatchAuditProgress) => void;
10
+ /**
11
+ * Progress tracker for long-running operations
12
+ */
13
+ export declare class ProgressTracker {
14
+ private total;
15
+ private startTime;
16
+ private progressHistory;
17
+ private readonly historyWindow;
18
+ constructor(total: number);
19
+ /**
20
+ * Update progress and calculate time estimates
21
+ */
22
+ update(current: number, status: string, currentItem?: string, additionalData?: Partial<ProgressUpdate>): ProgressUpdate;
23
+ /**
24
+ * Get final progress update
25
+ */
26
+ finalize(status?: string): ProgressUpdate;
27
+ /**
28
+ * Reset the tracker
29
+ */
30
+ reset(newTotal?: number): void;
31
+ }
32
+ /**
33
+ * Format time remaining in human-readable format
34
+ */
35
+ export declare function formatTimeRemaining(seconds: number): string;
36
+ /**
37
+ * Create a progress callback that formats updates for MCP responses
38
+ */
39
+ export declare function createProgressCallback(onProgress?: ProgressCallback): ProgressCallback;
40
+ /**
41
+ * Create a batch audit progress callback
42
+ */
43
+ export declare function createBatchProgressCallback(onProgress?: ProgressCallback): (progress: BatchAuditProgress) => void;
44
+ //# sourceMappingURL=progress-streamer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-streamer.d.ts","sourceRoot":"","sources":["../../src/core/progress-streamer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAE1B;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,cAAc,GAAG,kBAAkB,KAAK,IAAI,CAAA;AAEtF;;GAEG;AACH,qBAAa,eAAe;IAKd,OAAO,CAAC,KAAK;IAJzB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAsD;IAC7E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAI;gBAEd,KAAK,EAAE,MAAM;IAIjC;;OAEG;IACH,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GACvC,cAAc;IAkEjB;;OAEG;IACH,QAAQ,CAAC,MAAM,GAAE,MAAmB,GAAG,cAAc;IAUrD;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;CAO/B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,gBAAgB,CAiBlB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAsBxC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Progress Streamer - Handles progress updates for long-running operations
3
+ * Provides utilities for tracking and reporting progress with time estimates
4
+ */
5
+ /**
6
+ * Progress tracker for long-running operations
7
+ */
8
+ export class ProgressTracker {
9
+ constructor(total) {
10
+ this.total = total;
11
+ this.progressHistory = [];
12
+ this.historyWindow = 5; // Keep last 5 progress points for estimation
13
+ this.startTime = Date.now();
14
+ }
15
+ /**
16
+ * Update progress and calculate time estimates
17
+ */
18
+ update(current, status, currentItem, additionalData) {
19
+ const now = Date.now();
20
+ const elapsed = (now - this.startTime) / 1000; // seconds
21
+ const percentage = Math.round((current / this.total) * 100);
22
+ // Add to history
23
+ this.progressHistory.push({
24
+ timestamp: now,
25
+ completed: current,
26
+ });
27
+ // Keep only recent history
28
+ if (this.progressHistory.length > this.historyWindow) {
29
+ this.progressHistory.shift();
30
+ }
31
+ // Calculate estimated time remaining
32
+ let estimatedTimeRemaining;
33
+ if (current > 0 && this.progressHistory.length >= 2) {
34
+ // Use recent history to estimate remaining time
35
+ const recentHistory = this.progressHistory.slice(-3); // Use last 3 points
36
+ const timeDeltas = [];
37
+ const progressDeltas = [];
38
+ for (let i = 1; i < recentHistory.length; i++) {
39
+ const timeDelta = (recentHistory[i].timestamp - recentHistory[i - 1].timestamp) /
40
+ 1000;
41
+ const progressDelta = recentHistory[i].completed - recentHistory[i - 1].completed;
42
+ if (progressDelta > 0) {
43
+ timeDeltas.push(timeDelta);
44
+ progressDeltas.push(progressDelta);
45
+ }
46
+ }
47
+ if (timeDeltas.length > 0 && progressDeltas.length > 0) {
48
+ // Calculate average time per item
49
+ const totalTime = timeDeltas.reduce((a, b) => a + b, 0);
50
+ const totalProgress = progressDeltas.reduce((a, b) => a + b, 0);
51
+ const avgTimePerItem = totalTime / totalProgress;
52
+ // Estimate remaining time
53
+ const remaining = this.total - current;
54
+ estimatedTimeRemaining = Math.round(avgTimePerItem * remaining);
55
+ }
56
+ }
57
+ else if (current > 0) {
58
+ // Fallback: use overall average
59
+ const avgTimePerItem = elapsed / current;
60
+ const remaining = this.total - current;
61
+ estimatedTimeRemaining = Math.round(avgTimePerItem * remaining);
62
+ }
63
+ return {
64
+ current,
65
+ total: this.total,
66
+ percentage,
67
+ status,
68
+ estimatedTimeRemaining,
69
+ currentItem,
70
+ ...additionalData,
71
+ };
72
+ }
73
+ /**
74
+ * Get final progress update
75
+ */
76
+ finalize(status = 'Complete') {
77
+ return {
78
+ current: this.total,
79
+ total: this.total,
80
+ percentage: 100,
81
+ status,
82
+ estimatedTimeRemaining: 0,
83
+ };
84
+ }
85
+ /**
86
+ * Reset the tracker
87
+ */
88
+ reset(newTotal) {
89
+ this.startTime = Date.now();
90
+ this.progressHistory = [];
91
+ if (newTotal !== undefined) {
92
+ this.total = newTotal;
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * Format time remaining in human-readable format
98
+ */
99
+ export function formatTimeRemaining(seconds) {
100
+ if (seconds < 60) {
101
+ return `${seconds} second${seconds !== 1 ? 's' : ''}`;
102
+ }
103
+ else if (seconds < 3600) {
104
+ const minutes = Math.floor(seconds / 60);
105
+ const remainingSeconds = seconds % 60;
106
+ if (remainingSeconds === 0) {
107
+ return `${minutes} minute${minutes !== 1 ? 's' : ''}`;
108
+ }
109
+ return `${minutes} minute${minutes !== 1 ? 's' : ''} ${remainingSeconds} second${remainingSeconds !== 1 ? 's' : ''}`;
110
+ }
111
+ else {
112
+ const hours = Math.floor(seconds / 3600);
113
+ const minutes = Math.floor((seconds % 3600) / 60);
114
+ if (minutes === 0) {
115
+ return `${hours} hour${hours !== 1 ? 's' : ''}`;
116
+ }
117
+ return `${hours} hour${hours !== 1 ? 's' : ''} ${minutes} minute${minutes !== 1 ? 's' : ''}`;
118
+ }
119
+ }
120
+ /**
121
+ * Create a progress callback that formats updates for MCP responses
122
+ */
123
+ export function createProgressCallback(onProgress) {
124
+ return (progress) => {
125
+ // Format progress message
126
+ const timeRemainingText = progress.estimatedTimeRemaining
127
+ ? ` (estimated ${formatTimeRemaining(progress.estimatedTimeRemaining)} remaining)`
128
+ : '';
129
+ const progressMessage = `Progress: ${progress.current}/${progress.total} (${progress.percentage}%) - ${progress.status}${timeRemainingText}`;
130
+ // Log to console
131
+ console.log(progressMessage);
132
+ // Call user-provided callback if available
133
+ if (onProgress) {
134
+ onProgress(progress);
135
+ }
136
+ };
137
+ }
138
+ /**
139
+ * Create a batch audit progress callback
140
+ */
141
+ export function createBatchProgressCallback(onProgress) {
142
+ return (progress) => {
143
+ const timeRemainingText = progress.estimatedTimeRemaining
144
+ ? ` (estimated ${formatTimeRemaining(progress.estimatedTimeRemaining)} remaining)`
145
+ : '';
146
+ const completedCount = progress.completedUrls?.length || 0;
147
+ const failedCount = progress.failedUrls?.length || 0;
148
+ const currentUrlText = progress.currentUrl
149
+ ? ` - Current: ${progress.currentUrl}`
150
+ : '';
151
+ const progressMessage = `Batch Progress: ${progress.current}/${progress.total} (${progress.percentage}%) - ${progress.status}${timeRemainingText} - Completed: ${completedCount}, Failed: ${failedCount}${currentUrlText}`;
152
+ // Log to console
153
+ console.log(progressMessage);
154
+ // Call user-provided callback if available
155
+ if (onProgress) {
156
+ onProgress(progress);
157
+ }
158
+ };
159
+ }
160
+ //# sourceMappingURL=progress-streamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-streamer.js","sourceRoot":"","sources":["../../src/core/progress-streamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Result Processor - Formats accessibility results into conversational, actionable format
3
+ * Converts raw accessibility results into structured, prioritized, and human-readable format
4
+ */
5
+ import type { AccessibilityResults, AuditResult, AppliedFilters } from '../types/index.js';
6
+ /** Options passed when processing audit results (e.g. WCAG label used for the audit) */
7
+ export interface ProcessOptions {
8
+ /** WCAG version and level used for the audit (e.g. "WCAG 2.2 AA"). Used when rule tags are empty. */
9
+ auditWcagLabel?: string;
10
+ }
11
+ /**
12
+ * Derive full WCAG label from engine tags (e.g. wcag22aa -> "WCAG 2.2 AA").
13
+ * Used for display and for audit fallback.
14
+ */
15
+ export declare function getWcagLabelFromTags(tags: string[]): string;
16
+ /** True if wcagLevel string matches the given level (A, AA, AAA); supports full label e.g. "WCAG 2.2 AA". */
17
+ export declare function wcagLevelMatches(level: string, target: 'A' | 'AA' | 'AAA'): boolean;
18
+ /** Numeric order for sorting by WCAG level (A=3, AA=2, AAA=1). Supports full label e.g. "WCAG 2.2 AA". */
19
+ export declare function wcagLevelOrder(level: string): number;
20
+ /**
21
+ * ResultProcessor class - Formats and processes accessibility results
22
+ */
23
+ export declare class ResultProcessor {
24
+ /**
25
+ * Get WCAG level for display (full label e.g. "WCAG 2.2 AA"). Uses tags when present, else audit fallback.
26
+ */
27
+ private getWCAGLevel;
28
+ /**
29
+ * Determine impact level from engine-reported impact (axe or ACE native levels).
30
+ */
31
+ private getImpactLevel;
32
+ /**
33
+ * Get impact rank for ordering (higher = worse). Uses IMPACT_ORDER.
34
+ */
35
+ private impactRank;
36
+ /**
37
+ * Calculate priority score for an issue (higher = more important)
38
+ */
39
+ private calculatePriority;
40
+ /**
41
+ * Generate fix suggestion for an issue
42
+ */
43
+ private generateFixSuggestion;
44
+ /**
45
+ * Generate user impact description from engine-native impact level.
46
+ */
47
+ private generateUserImpact;
48
+ /**
49
+ * Process accessibility violations into prioritized issues
50
+ */
51
+ private processViolations;
52
+ /**
53
+ * Calculate accessibility score (0-100)
54
+ */
55
+ private calculateScore;
56
+ /**
57
+ * Calculate WCAG compliance percentages
58
+ */
59
+ private calculateWCAGCompliance;
60
+ /**
61
+ * Generate summary statistics
62
+ */
63
+ private generateSummary;
64
+ /**
65
+ * Identify quick wins (easy fixes with high impact)
66
+ */
67
+ private identifyQuickWins;
68
+ /**
69
+ * Identify critical blockers (must fix before launch)
70
+ */
71
+ private identifyCriticalBlockers;
72
+ /**
73
+ * Generate conversational summary
74
+ */
75
+ private generateConversationalSummary;
76
+ /**
77
+ * Generate a markdown table summarising all prioritised issues.
78
+ * Columns: Severity | Rule ID | Description | WCAG | Element / XPath | Fix hint
79
+ */
80
+ private generateIssuesTable;
81
+ /**
82
+ * Process accessibility results into structured audit result
83
+ */
84
+ process(accessibilityResults: AccessibilityResults, appliedFilters?: AppliedFilters, options?: ProcessOptions): AuditResult;
85
+ }
86
+ //# sourceMappingURL=result-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-processor.d.ts","sourceRoot":"","sources":["../../src/core/result-processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAEpB,WAAW,EAOX,cAAc,EAEf,MAAM,mBAAmB,CAAA;AAG1B,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,qGAAqG;IACrG,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAW3D;AAED,6GAA6G;AAC7G,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,CAInF;AAED,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwC7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAwChC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAsErC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoC3B;;OAEG;IACH,OAAO,CACL,oBAAoB,EAAE,oBAAoB,EAC1C,cAAc,CAAC,EAAE,cAAc,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,WAAW;CAiDf"}