accessflow-mcp-server 1.0.15 → 1.2.0-beta.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/services/apiSchemas.d.ts +200 -0
- package/dist/services/apiSchemas.d.ts.map +1 -0
- package/dist/services/apiSchemas.js +95 -0
- package/dist/services/apiSchemas.js.map +1 -0
- package/dist/services/apiService.d.ts +37 -0
- package/dist/services/apiService.d.ts.map +1 -0
- package/dist/services/apiService.js +201 -0
- package/dist/services/apiService.js.map +1 -0
- package/dist/services/loggerService.d.ts +3 -0
- package/dist/services/loggerService.d.ts.map +1 -0
- package/dist/services/loggerService.js +38 -0
- package/dist/services/loggerService.js.map +1 -0
- package/dist/services/rulesService.d.ts +10 -0
- package/dist/services/rulesService.d.ts.map +1 -0
- package/dist/services/rulesService.js +70 -0
- package/dist/services/rulesService.js.map +1 -0
- package/dist/tools/getIssueRemediation.d.ts +16 -0
- package/dist/tools/getIssueRemediation.d.ts.map +1 -0
- package/dist/tools/getIssueRemediation.js +77 -0
- package/dist/tools/getIssueRemediation.js.map +1 -0
- package/dist/tools/getMostUrgentIssues.d.ts +7 -0
- package/dist/tools/getMostUrgentIssues.d.ts.map +1 -0
- package/dist/tools/getMostUrgentIssues.js +94 -0
- package/dist/tools/getMostUrgentIssues.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +21 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/resolveIssue.d.ts +16 -0
- package/dist/tools/resolveIssue.d.ts.map +1 -0
- package/dist/tools/resolveIssue.js +77 -0
- package/dist/tools/resolveIssue.js.map +1 -0
- package/dist/tools/toolRegistry.d.ts +19 -0
- package/dist/tools/toolRegistry.d.ts.map +1 -0
- package/dist/tools/toolRegistry.js +9 -0
- package/dist/tools/toolRegistry.js.map +1 -0
- package/dist/types/issues.d.ts +32 -0
- package/dist/types/issues.d.ts.map +1 -0
- package/dist/types/issues.js +6 -0
- package/dist/types/issues.js.map +1 -0
- package/dist/types/remediation.d.ts +24 -0
- package/dist/types/remediation.d.ts.map +1 -0
- package/dist/types/remediation.js +6 -0
- package/dist/types/remediation.js.map +1 -0
- package/dist/utils/domains.d.ts +2 -0
- package/dist/utils/domains.d.ts.map +1 -0
- package/dist/utils/domains.js +14 -0
- package/dist/utils/domains.js.map +1 -0
- package/dist/utils/issues.d.ts +16 -0
- package/dist/utils/issues.d.ts.map +1 -0
- package/dist/utils/issues.js +24 -0
- package/dist/utils/issues.js.map +1 -0
- package/dist/utils/middleware.d.ts +14 -0
- package/dist/utils/middleware.d.ts.map +1 -0
- package/dist/utils/middleware.js +37 -0
- package/dist/utils/middleware.js.map +1 -0
- package/dist/utils/remediation.d.ts +27 -0
- package/dist/utils/remediation.d.ts.map +1 -0
- package/dist/utils/remediation.js +139 -0
- package/dist/utils/remediation.js.map +1 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +14 -0
- package/dist/utils.js.map +1 -0
- package/package.json +48 -14
- package/TOOL_REFERENCE.md +0 -126
- package/assets/MCP_banner.png +0 -0
- package/bin/flow-mcp +0 -4
- package/build/index.d.ts +0 -12
- package/build/index.d.ts.map +0 -1
- package/build/index.js +0 -95
- package/build/index.js.map +0 -1
- package/build/prompts/formatUrgentIssues.d.ts +0 -4
- package/build/prompts/formatUrgentIssues.d.ts.map +0 -1
- package/build/prompts/formatUrgentIssues.js +0 -78
- package/build/prompts/formatUrgentIssues.js.map +0 -1
- package/build/prompts/index.d.ts +0 -4
- package/build/prompts/index.d.ts.map +0 -1
- package/build/prompts/index.js +0 -12
- package/build/prompts/index.js.map +0 -1
- package/build/prompts/types.d.ts +0 -22
- package/build/prompts/types.d.ts.map +0 -1
- package/build/prompts/types.js +0 -2
- package/build/prompts/types.js.map +0 -1
- package/build/rules.json +0 -4591
- package/build/services/accessflow.d.ts +0 -6
- package/build/services/accessflow.d.ts.map +0 -1
- package/build/services/accessflow.js +0 -8
- package/build/services/accessflow.js.map +0 -1
- package/build/tools/getIssueRemediation.d.ts +0 -4
- package/build/tools/getIssueRemediation.d.ts.map +0 -1
- package/build/tools/getIssueRemediation.js +0 -165
- package/build/tools/getIssueRemediation.js.map +0 -1
- package/build/tools/getMostUrgentIssues.d.ts +0 -4
- package/build/tools/getMostUrgentIssues.d.ts.map +0 -1
- package/build/tools/getMostUrgentIssues.js +0 -106
- package/build/tools/getMostUrgentIssues.js.map +0 -1
- package/build/tools/index.d.ts +0 -9
- package/build/tools/index.d.ts.map +0 -1
- package/build/tools/index.js +0 -19
- package/build/tools/index.js.map +0 -1
- package/build/tools/types.d.ts +0 -19
- package/build/tools/types.d.ts.map +0 -1
- package/build/tools/types.js +0 -2
- package/build/tools/types.js.map +0 -1
- package/build/utils/config.d.ts +0 -8
- package/build/utils/config.d.ts.map +0 -1
- package/build/utils/config.js +0 -26
- package/build/utils/config.js.map +0 -1
- package/build/utils/database.d.ts +0 -13
- package/build/utils/database.d.ts.map +0 -1
- package/build/utils/database.js +0 -64
- package/build/utils/database.js.map +0 -1
- package/build/utils/domain.d.ts +0 -2
- package/build/utils/domain.d.ts.map +0 -1
- package/build/utils/domain.js +0 -11
- package/build/utils/domain.js.map +0 -1
- package/build/utils/logger.d.ts +0 -18
- package/build/utils/logger.d.ts.map +0 -1
- package/build/utils/logger.js +0 -51
- package/build/utils/logger.js.map +0 -1
- package/build/utils/responses.d.ts +0 -19
- package/build/utils/responses.d.ts.map +0 -1
- package/build/utils/responses.js +0 -41
- package/build/utils/responses.js.map +0 -1
- package/build/utils/validation.d.ts +0 -7
- package/build/utils/validation.d.ts.map +0 -1
- package/build/utils/validation.js +0 -47
- package/build/utils/validation.js.map +0 -1
- package/mcp-config.json +0 -11
- package/src/index.ts +0 -125
- package/src/services/accessflow.ts +0 -9
- package/src/tools/getIssueRemediation.ts +0 -218
- package/src/tools/getMostUrgentIssues.ts +0 -144
- package/src/tools/index.ts +0 -33
- package/src/tools/types.ts +0 -20
- package/src/utils/domain.ts +0 -13
- package/test.mjs +0 -63
- package/tsconfig.json +0 -20
- /package/{src → dist/data}/rules.json +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// src/LoggerService.ts
|
|
2
|
+
import pino, {} from 'pino';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
class LoggerService {
|
|
7
|
+
static instance;
|
|
8
|
+
static build() {
|
|
9
|
+
const baseDir = path.join(os.homedir(), '.accessflow-mcp', 'logs');
|
|
10
|
+
fs.mkdirSync(baseDir, { recursive: true });
|
|
11
|
+
const logFile = path.join(baseDir, 'mcp-server.log');
|
|
12
|
+
const streams = [
|
|
13
|
+
{ stream: pino.destination({ dest: logFile, sync: false }) },
|
|
14
|
+
];
|
|
15
|
+
// add pretty printing in testing
|
|
16
|
+
if (process.env.NODE_ENV === 'test') {
|
|
17
|
+
streams.push({
|
|
18
|
+
stream: pino.transport({
|
|
19
|
+
target: 'pino-pretty',
|
|
20
|
+
options: { destination: 2 }, // stderr (safe for stdio MCP)
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return pino({
|
|
25
|
+
level: 'info',
|
|
26
|
+
timestamp: pino.stdTimeFunctions.isoTime,
|
|
27
|
+
}, pino.multistream(streams));
|
|
28
|
+
}
|
|
29
|
+
static get() {
|
|
30
|
+
if (!LoggerService.instance) {
|
|
31
|
+
LoggerService.instance = LoggerService.build();
|
|
32
|
+
}
|
|
33
|
+
return LoggerService.instance;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// export a ready-to-use singleton logger
|
|
37
|
+
export const logger = LoggerService.get();
|
|
38
|
+
//# sourceMappingURL=loggerService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loggerService.js","sourceRoot":"","sources":["../../src/services/loggerService.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,IAAI,EAAE,EAA6B,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,aAAa;IACT,MAAM,CAAC,QAAQ,CAAa;IAE5B,MAAM,CAAC,KAAK;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAEnE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAErD,MAAM,OAAO,GAAsB;YACjC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;SAC7D,CAAC;QAEF,iCAAiC;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACrB,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,8BAA8B;iBAC5D,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CACT;YACE,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;SACzC,EACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG;QACR,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;CACF;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ApiRule } from '../types/remediation.js';
|
|
2
|
+
/**
|
|
3
|
+
* Finds a rule by its ID (handles various ID formats)
|
|
4
|
+
*/
|
|
5
|
+
export declare function findRuleById(ruleId: string | null | undefined): ApiRule | null;
|
|
6
|
+
/**
|
|
7
|
+
* Gets all rules (useful for debugging or other purposes)
|
|
8
|
+
*/
|
|
9
|
+
export declare function getAllRules(): ApiRule[];
|
|
10
|
+
//# sourceMappingURL=rulesService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulesService.d.ts","sourceRoot":"","sources":["../../src/services/rulesService.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAmCvD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,GAAG,IAAI,CAchB;AA6BD;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,EAAE,CAEvC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { logger } from './loggerService.js';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
let rulesCache = null;
|
|
8
|
+
/**
|
|
9
|
+
* Loads rules from the JSON file
|
|
10
|
+
*/
|
|
11
|
+
function loadRules() {
|
|
12
|
+
if (rulesCache) {
|
|
13
|
+
return rulesCache;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const rulesPath = join(__dirname, '../data/rules.json');
|
|
17
|
+
const rulesData = readFileSync(rulesPath, 'utf-8');
|
|
18
|
+
rulesCache = JSON.parse(rulesData);
|
|
19
|
+
return rulesCache;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
logger.error({
|
|
23
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
24
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
25
|
+
}, 'Failed to load rules from file');
|
|
26
|
+
// Return empty array as fallback
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Finds a rule by its ID (handles various ID formats)
|
|
32
|
+
*/
|
|
33
|
+
export function findRuleById(ruleId) {
|
|
34
|
+
if (!ruleId) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const rules = loadRules();
|
|
38
|
+
const normalizedRuleId = normalizeRuleId(ruleId);
|
|
39
|
+
return (rules.find((rule) => {
|
|
40
|
+
const ruleIdStr = normalizeRuleId(rule._id);
|
|
41
|
+
return ruleIdStr === normalizedRuleId;
|
|
42
|
+
}) || null);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Normalizes rule ID from various formats to a string
|
|
46
|
+
*/
|
|
47
|
+
function normalizeRuleId(id) {
|
|
48
|
+
if (!id) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
if (typeof id === 'string') {
|
|
52
|
+
return id;
|
|
53
|
+
}
|
|
54
|
+
if (typeof id === 'object') {
|
|
55
|
+
if ('$oid' in id) {
|
|
56
|
+
return id.$oid;
|
|
57
|
+
}
|
|
58
|
+
if ('toString' in id && typeof id.toString === 'function') {
|
|
59
|
+
return id.toString();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Gets all rules (useful for debugging or other purposes)
|
|
66
|
+
*/
|
|
67
|
+
export function getAllRules() {
|
|
68
|
+
return loadRules();
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=rulesService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulesService.js","sourceRoot":"","sources":["../../src/services/rulesService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,IAAI,UAAU,GAAqB,IAAI,CAAC;AAExC;;GAEG;AACH,SAAS,SAAS;IAChB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAc,CAAC;QAChD,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV;YACE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;YAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACxD,EACD,gCAAgC,CACjC,CAAC;QAEF,iCAAiC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAiC;IAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEjD,OAAO,CACL,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAClB,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,SAAS,KAAK,gBAAgB,CAAC;IACxC,CAAC,CAAC,IAAI,IAAI,CACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,EAA2D;IAE3D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,UAAU,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC1D,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Tool } from 'fastmcp';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ApiService } from '../services/apiService.js';
|
|
4
|
+
declare const parameters: z.ZodObject<{
|
|
5
|
+
issueDisplayName: z.ZodString;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
issueDisplayName: string;
|
|
8
|
+
}, {
|
|
9
|
+
issueDisplayName: string;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* Creates the getIssueRemediation tool for FastMCP
|
|
13
|
+
*/
|
|
14
|
+
export declare const createGetIssueRemediation: (apiService: ApiService) => Tool<any, typeof parameters>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=getIssueRemediation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getIssueRemediation.d.ts","sourceRoot":"","sources":["../../src/tools/getIssueRemediation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAY,MAAM,2BAA2B,CAAC;AASjE,QAAA,MAAM,UAAU;;;;;;EAMd,CAAC;AAIH;;GAEG;AACH,eAAO,MAAM,yBAAyB,GACpC,YAAY,UAAU,KACrB,IAAI,CAAC,GAAG,EAAE,OAAO,UAAU,CA+E7B,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ApiService, ApiError } from '../services/apiService.js';
|
|
3
|
+
import { logger } from '../services/loggerService.js';
|
|
4
|
+
import { findRuleById } from '../services/rulesService.js';
|
|
5
|
+
import { formatRemediationResponse, extractRuleId, } from '../utils/remediation.js';
|
|
6
|
+
const parameters = z.object({
|
|
7
|
+
issueDisplayName: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe('The accessibility issue display name (e.g., Decorative-Content-6d277a13ba)'),
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Creates the getIssueRemediation tool for FastMCP
|
|
13
|
+
*/
|
|
14
|
+
export const createGetIssueRemediation = (apiService) => {
|
|
15
|
+
return {
|
|
16
|
+
name: 'getIssueRemediation',
|
|
17
|
+
description: 'Get detailed remediation guidance for an accessibility issue by issue display name',
|
|
18
|
+
parameters,
|
|
19
|
+
execute: async (args, context) => {
|
|
20
|
+
const typedArgs = args ?? {};
|
|
21
|
+
if (!typedArgs.issueDisplayName) {
|
|
22
|
+
logger.error('Missing issue display name in getIssueRemediation');
|
|
23
|
+
throw new Error('Issue display name is required');
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const issue = await fetchIssueRemediation(apiService, typedArgs.issueDisplayName);
|
|
27
|
+
if (!issue) {
|
|
28
|
+
return `**Issue Not Found**\n\nNo accessibility issue found with display name: ${typedArgs.issueDisplayName}\n\nPlease verify the issue display name and try again.`;
|
|
29
|
+
}
|
|
30
|
+
// Find related rule from local rules.json
|
|
31
|
+
const ruleId = extractRuleId(issue.relatedRuleId);
|
|
32
|
+
const rule = ruleId ? findRuleById(ruleId) : null;
|
|
33
|
+
// Format the remediation response
|
|
34
|
+
const response = formatRemediationResponse(issue, rule);
|
|
35
|
+
return response;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
let errorMessage;
|
|
39
|
+
let errorDetails = '';
|
|
40
|
+
if (error instanceof ApiError) {
|
|
41
|
+
errorMessage = error.message;
|
|
42
|
+
errorDetails = ` Status: ${error.statusCode} ${error.statusText}.`;
|
|
43
|
+
logger.error({
|
|
44
|
+
issueDisplayName: typedArgs.issueDisplayName,
|
|
45
|
+
message: error.message,
|
|
46
|
+
statusCode: error.statusCode,
|
|
47
|
+
statusText: error.statusText,
|
|
48
|
+
}, 'API error in getIssueRemediation');
|
|
49
|
+
}
|
|
50
|
+
else if (error instanceof Error) {
|
|
51
|
+
errorMessage = error.message;
|
|
52
|
+
errorDetails = error.stack ? ` Stack: ${error.stack}` : '';
|
|
53
|
+
logger.error({
|
|
54
|
+
issueDisplayName: typedArgs.issueDisplayName,
|
|
55
|
+
message: error.message,
|
|
56
|
+
stack: error.stack,
|
|
57
|
+
}, 'Error in getIssueRemediation');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
errorMessage = 'Unknown error occurred';
|
|
61
|
+
logger.error({
|
|
62
|
+
issueDisplayName: typedArgs.issueDisplayName,
|
|
63
|
+
error,
|
|
64
|
+
}, 'Unknown error in getIssueRemediation');
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Failed to fetch issue remediation: ${errorMessage}.${errorDetails} This may be due to an incorrect API endpoint, invalid domain/API key, or network issue.`);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Fetches issue remediation data from the API
|
|
73
|
+
*/
|
|
74
|
+
async function fetchIssueRemediation(apiService, issueDisplayName) {
|
|
75
|
+
return apiService.getIssueRemediation(issueDisplayName);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=getIssueRemediation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getIssueRemediation.js","sourceRoot":"","sources":["../../src/tools/getIssueRemediation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Tool } from 'fastmcp';
|
|
2
|
+
import { ApiService } from '../services/apiService.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates the getMostUrgentIssues tool for FastMCP
|
|
5
|
+
*/
|
|
6
|
+
export declare const createGetMostUrgentIssues: (apiService: ApiService) => Tool<any>;
|
|
7
|
+
//# sourceMappingURL=getMostUrgentIssues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMostUrgentIssues.d.ts","sourceRoot":"","sources":["../../src/tools/getMostUrgentIssues.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAY,MAAM,2BAA2B,CAAC;AAgBjE;;GAEG;AACH,eAAO,MAAM,yBAAyB,GACpC,YAAY,UAAU,KACrB,IAAI,CAAC,GAAG,CAmDV,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ApiService, ApiError } from '../services/apiService.js';
|
|
2
|
+
import { logger } from '../services/loggerService.js';
|
|
3
|
+
import { normalizeSeverity, normalizeWCAGLevel, normalizeCriteria, } from '../utils/issues.js';
|
|
4
|
+
const DEFAULT_ISSUE_LIMIT = 5;
|
|
5
|
+
/**
|
|
6
|
+
* Creates the getMostUrgentIssues tool for FastMCP
|
|
7
|
+
*/
|
|
8
|
+
export const createGetMostUrgentIssues = (apiService) => {
|
|
9
|
+
return {
|
|
10
|
+
name: 'getMostUrgentIssues',
|
|
11
|
+
description: 'Get the most urgent accessibility issues as structured JSON data, ordered by severity (extreme > high > medium > low), then by site occurrences, then by page occurrences. Use the formatUrgentIssues prompt to format the JSON response into user-friendly markdown.',
|
|
12
|
+
execute: async (args, context) => {
|
|
13
|
+
try {
|
|
14
|
+
const limit = DEFAULT_ISSUE_LIMIT;
|
|
15
|
+
const issues = await fetchUrgentIssues(apiService, limit);
|
|
16
|
+
const response = formatUrgentIssuesResponse(issues, limit);
|
|
17
|
+
return JSON.stringify(response, null, 2);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
let errorMessage;
|
|
21
|
+
let errorDetails = '';
|
|
22
|
+
if (error instanceof ApiError) {
|
|
23
|
+
errorMessage = error.message;
|
|
24
|
+
errorDetails = ` Status: ${error.statusCode} ${error.statusText}.`;
|
|
25
|
+
logger.error({
|
|
26
|
+
message: error.message,
|
|
27
|
+
statusCode: error.statusCode,
|
|
28
|
+
statusText: error.statusText,
|
|
29
|
+
}, 'error in getMstUrgentIssues');
|
|
30
|
+
}
|
|
31
|
+
else if (error instanceof Error) {
|
|
32
|
+
errorMessage = error.message;
|
|
33
|
+
errorDetails = error.stack ? ` Stack: ${error.stack}` : '';
|
|
34
|
+
logger.error({
|
|
35
|
+
message: error.message,
|
|
36
|
+
stack: error.stack,
|
|
37
|
+
}, 'Error in getMostUrgentIssues');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
errorMessage = 'Unknown error occurred';
|
|
41
|
+
logger.error({ error }, 'Unknown error in getMostUrgentIssues');
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`Failed to fetch urgent issues: ${errorMessage}.${errorDetails} This may be due to an incorrect API endpoint, invalid domain/API key, or network issue.`);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Fetches urgent issues from the API
|
|
50
|
+
*/
|
|
51
|
+
async function fetchUrgentIssues(apiService, limit) {
|
|
52
|
+
const issues = await apiService.getUrgentIssues(limit);
|
|
53
|
+
return issues;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Formats the API issues into a structured response
|
|
57
|
+
*/
|
|
58
|
+
function formatUrgentIssuesResponse(issues, limit) {
|
|
59
|
+
const sortedIssues = issues.slice(0, limit);
|
|
60
|
+
if (sortedIssues.length === 0) {
|
|
61
|
+
return {
|
|
62
|
+
totalIssues: 0,
|
|
63
|
+
showing: 0,
|
|
64
|
+
limit,
|
|
65
|
+
issues: [],
|
|
66
|
+
hasMore: false,
|
|
67
|
+
nextSteps: {
|
|
68
|
+
suggestion: 'Use getIssueRemediation with issueDisplayName for detailed fix guidance',
|
|
69
|
+
instructions: 'List to the user these issues with all the data for every one of them: severity, wcag, etc. For every issue, show the displayName to the user. After listing all the issues, suggest the user to get full issue remediation data. Do not fix the issues unless explicitly asked to fix',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const formattedIssues = sortedIssues.map((issue, index) => ({
|
|
74
|
+
rank: index + 1,
|
|
75
|
+
displayName: issue.displayName,
|
|
76
|
+
severity: normalizeSeverity(issue.severity),
|
|
77
|
+
wcagLevel: normalizeWCAGLevel(issue.WCAGLevel),
|
|
78
|
+
criteria: normalizeCriteria(issue.criteria),
|
|
79
|
+
siteOccurrences: issue.siteOccurrences,
|
|
80
|
+
pageOccurrences: issue.occurrences ?? 0,
|
|
81
|
+
}));
|
|
82
|
+
return {
|
|
83
|
+
totalIssues: issues.length,
|
|
84
|
+
showing: sortedIssues.length,
|
|
85
|
+
limit,
|
|
86
|
+
issues: formattedIssues,
|
|
87
|
+
hasMore: issues.length > limit,
|
|
88
|
+
nextSteps: {
|
|
89
|
+
suggestion: 'Use getIssueRemediation with issueDisplayName for detailed fix guidance',
|
|
90
|
+
instructions: 'List to the user these issues with all the data for every one of them: severity, wcag, etc. For every issue, show the displayName to the user. After listing all the issues, suggest the user to get full issue remediation data. Do not fix the issues unless explicitly asked to fix',
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=getMostUrgentIssues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMostUrgentIssues.js","sourceRoot":"","sources":["../../src/tools/getMostUrgentIssues.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,SAAS,CAAC;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,eAAO,MAAM,aAAa,GAAI,QAAQ,OAAO,EAAE,YAAY,UAAU,SAwBpE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createToolRegistry } from './toolRegistry.js';
|
|
2
|
+
import { withCredentialCheck } from '../utils/middleware.js';
|
|
3
|
+
import { logger } from '../services/loggerService.js';
|
|
4
|
+
export const registerTools = (server, apiService) => {
|
|
5
|
+
const toolRegistry = createToolRegistry(apiService);
|
|
6
|
+
for (const [toolName, tool] of Object.entries(toolRegistry)) {
|
|
7
|
+
try {
|
|
8
|
+
const wrappedTool = withCredentialCheck(apiService.domain, apiService.apiKey, tool);
|
|
9
|
+
server.addTool(wrappedTool);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
logger.error({
|
|
13
|
+
toolName,
|
|
14
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
15
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
16
|
+
}, 'Failed to register tool');
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAe,EAAE,UAAsB,EAAE,EAAE;IACvE,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,mBAAmB,CACrC,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,EACjB,IAAI,CACL,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,WAAwC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV;gBACE,QAAQ;gBACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;gBAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,EACD,yBAAyB,CAC1B,CAAC;YAEF,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Tool } from 'fastmcp';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ApiService } from '../services/apiService.js';
|
|
4
|
+
declare const parameters: z.ZodObject<{
|
|
5
|
+
issueDisplayName: z.ZodString;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
issueDisplayName: string;
|
|
8
|
+
}, {
|
|
9
|
+
issueDisplayName: string;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* Creates the resolveIssue tool for FastMCP
|
|
13
|
+
*/
|
|
14
|
+
export declare const createResolveIssue: (apiService: ApiService) => Tool<any, typeof parameters>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=resolveIssue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveIssue.d.ts","sourceRoot":"","sources":["../../src/tools/resolveIssue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAY,MAAM,2BAA2B,CAAC;AAGjE,QAAA,MAAM,UAAU;;;;;;EAMd,CAAC;AAUH;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,UAAU,KACrB,IAAI,CAAC,GAAG,EAAE,OAAO,UAAU,CA8E7B,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ApiService, ApiError } from '../services/apiService.js';
|
|
3
|
+
import { logger } from '../services/loggerService.js';
|
|
4
|
+
const parameters = z.object({
|
|
5
|
+
issueDisplayName: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe('The accessibility issue display name to resolve (e.g., Decorative-Content-6d277a13ba)'),
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Creates the resolveIssue tool for FastMCP
|
|
11
|
+
*/
|
|
12
|
+
export const createResolveIssue = (apiService) => {
|
|
13
|
+
return {
|
|
14
|
+
name: 'resolveIssue',
|
|
15
|
+
description: 'Mark an accessibility issue as resolved in accessFlow by its display name',
|
|
16
|
+
parameters,
|
|
17
|
+
execute: async (args, context) => {
|
|
18
|
+
const typedArgs = args ?? {};
|
|
19
|
+
if (!typedArgs.issueDisplayName) {
|
|
20
|
+
logger.error('Missing issue display name in resolveIssue');
|
|
21
|
+
throw new Error('Issue display name is required');
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await resolveIssueInAccessFlow(apiService, typedArgs.issueDisplayName);
|
|
25
|
+
if (!result) {
|
|
26
|
+
return `**Issue Not Found**
|
|
27
|
+
|
|
28
|
+
No accessibility issue found with display name: ${typedArgs.issueDisplayName}
|
|
29
|
+
|
|
30
|
+
Please verify the issue display name and try again.`;
|
|
31
|
+
}
|
|
32
|
+
return `**Issue Resolved Successfully**
|
|
33
|
+
|
|
34
|
+
The accessibility issue "${typedArgs.issueDisplayName}" has been marked as resolved in accessFlow.`;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
let errorMessage;
|
|
38
|
+
let errorDetails = '';
|
|
39
|
+
if (error instanceof ApiError) {
|
|
40
|
+
errorMessage = error.message;
|
|
41
|
+
errorDetails = ` Status: ${error.statusCode} ${error.statusText}.`;
|
|
42
|
+
logger.error({
|
|
43
|
+
issueDisplayName: typedArgs.issueDisplayName,
|
|
44
|
+
message: error.message,
|
|
45
|
+
statusCode: error.statusCode,
|
|
46
|
+
statusText: error.statusText,
|
|
47
|
+
}, 'API error in resolveIssue');
|
|
48
|
+
}
|
|
49
|
+
else if (error instanceof Error) {
|
|
50
|
+
errorMessage = error.message;
|
|
51
|
+
errorDetails = error.stack ? ` Stack: ${error.stack}` : '';
|
|
52
|
+
logger.error({
|
|
53
|
+
issueDisplayName: typedArgs.issueDisplayName,
|
|
54
|
+
message: error.message,
|
|
55
|
+
stack: error.stack,
|
|
56
|
+
}, 'Error in resolveIssue');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
errorMessage = 'Unknown error occurred';
|
|
60
|
+
logger.error({
|
|
61
|
+
issueDisplayName: typedArgs.issueDisplayName,
|
|
62
|
+
error,
|
|
63
|
+
}, 'Unknown error in resolveIssue');
|
|
64
|
+
}
|
|
65
|
+
throw new Error(`Failed to resolve issue: ${errorMessage}.${errorDetails} This may be due to an incorrect API endpoint, invalid domain/API key, network issue, or the issue may already be resolved.`);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Resolves an issue in accessFlow via the API
|
|
72
|
+
*/
|
|
73
|
+
async function resolveIssueInAccessFlow(apiService, issueDisplayName) {
|
|
74
|
+
const response = await apiService.resolveIssue(issueDisplayName);
|
|
75
|
+
return response;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=resolveIssue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveIssue.js","sourceRoot":"","sources":["../../src/tools/resolveIssue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ApiService } from '../services/apiService.js';
|
|
2
|
+
export declare const createToolRegistry: (apiService: ApiService) => {
|
|
3
|
+
get_most_urgent_issues: import("fastmcp").Tool<any>;
|
|
4
|
+
get_issue_remediation: import("fastmcp").Tool<any, import("zod").ZodObject<{
|
|
5
|
+
issueDisplayName: import("zod").ZodString;
|
|
6
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
7
|
+
issueDisplayName: string;
|
|
8
|
+
}, {
|
|
9
|
+
issueDisplayName: string;
|
|
10
|
+
}>>;
|
|
11
|
+
resolve_issue: import("fastmcp").Tool<any, import("zod").ZodObject<{
|
|
12
|
+
issueDisplayName: import("zod").ZodString;
|
|
13
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
14
|
+
issueDisplayName: string;
|
|
15
|
+
}, {
|
|
16
|
+
issueDisplayName: string;
|
|
17
|
+
}>>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=toolRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRegistry.d.ts","sourceRoot":"","sources":["../../src/tools/toolRegistry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,eAAO,MAAM,kBAAkB,GAAI,YAAY,UAAU;;;;;;;;;;;;;;;;CAIvD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createGetIssueRemediation } from './getIssueRemediation.js';
|
|
2
|
+
import { createGetMostUrgentIssues } from './getMostUrgentIssues.js';
|
|
3
|
+
import { createResolveIssue } from './resolveIssue.js';
|
|
4
|
+
export const createToolRegistry = (apiService) => ({
|
|
5
|
+
get_most_urgent_issues: createGetMostUrgentIssues(apiService),
|
|
6
|
+
get_issue_remediation: createGetIssueRemediation(apiService),
|
|
7
|
+
resolve_issue: createResolveIssue(apiService),
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=toolRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../src/tools/toolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAsB,EAAE,EAAE,CAAC,CAAC;IAC7D,sBAAsB,EAAE,yBAAyB,CAAC,UAAU,CAAC;IAC7D,qBAAqB,EAAE,yBAAyB,CAAC,UAAU,CAAC;IAC5D,aAAa,EAAE,kBAAkB,CAAC,UAAU,CAAC;CAC9C,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output type definitions for formatted responses
|
|
3
|
+
* (Input types are inferred from Zod schemas in apiSchemas.ts)
|
|
4
|
+
*/
|
|
5
|
+
export type { Severity, WCAGLevel, ApiIssue, ApiUrgentIssuesResponse, ApiIssueRemediation, } from '../services/apiSchemas.js';
|
|
6
|
+
/**
|
|
7
|
+
* Formatted issue for display (output type - created by our code)
|
|
8
|
+
*/
|
|
9
|
+
export interface FormattedIssue {
|
|
10
|
+
rank: number;
|
|
11
|
+
displayName: string;
|
|
12
|
+
severity: string;
|
|
13
|
+
wcagLevel: string;
|
|
14
|
+
criteria: string;
|
|
15
|
+
siteOccurrences: number;
|
|
16
|
+
pageOccurrences: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Response structure for urgent issues (output type - created by our code)
|
|
20
|
+
*/
|
|
21
|
+
export interface UrgentIssuesResponse {
|
|
22
|
+
totalIssues: number;
|
|
23
|
+
showing: number;
|
|
24
|
+
limit: number;
|
|
25
|
+
issues: FormattedIssue[];
|
|
26
|
+
hasMore: boolean;
|
|
27
|
+
nextSteps: {
|
|
28
|
+
suggestion: string;
|
|
29
|
+
instructions: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=issues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/types/issues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/types/issues.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for issue remediation
|
|
3
|
+
* (ApiIssueRemediation is inferred from Zod schema in apiSchemas.ts)
|
|
4
|
+
*/
|
|
5
|
+
export type { ApiIssueRemediation } from '../services/apiSchemas.js';
|
|
6
|
+
/**
|
|
7
|
+
* Rule definition from rules.json (local data, not API)
|
|
8
|
+
*/
|
|
9
|
+
export interface ApiRule {
|
|
10
|
+
_id?: {
|
|
11
|
+
$oid: string;
|
|
12
|
+
} | string;
|
|
13
|
+
shortDescription?: string;
|
|
14
|
+
issueWCAGLink?: string;
|
|
15
|
+
issueTutorialLink?: string;
|
|
16
|
+
issueResolution?: string;
|
|
17
|
+
suggestedFix?: Array<{
|
|
18
|
+
suggestedFixType?: string;
|
|
19
|
+
suggestedFixKey?: string;
|
|
20
|
+
suggestedFixValue?: string;
|
|
21
|
+
}>;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=remediation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation.d.ts","sourceRoot":"","sources":["../../src/types/remediation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation.js","sourceRoot":"","sources":["../../src/types/remediation.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../src/utils/domains.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,MAiB/C,CAAC"}
|