accessflow-mcp-server 1.0.15 → 1.1.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.
Files changed (144) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +66 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/services/apiSchemas.d.ts +200 -0
  6. package/dist/services/apiSchemas.d.ts.map +1 -0
  7. package/dist/services/apiSchemas.js +95 -0
  8. package/dist/services/apiSchemas.js.map +1 -0
  9. package/dist/services/apiService.d.ts +37 -0
  10. package/dist/services/apiService.d.ts.map +1 -0
  11. package/dist/services/apiService.js +198 -0
  12. package/dist/services/apiService.js.map +1 -0
  13. package/dist/services/loggerService.d.ts +3 -0
  14. package/dist/services/loggerService.d.ts.map +1 -0
  15. package/dist/services/loggerService.js +38 -0
  16. package/dist/services/loggerService.js.map +1 -0
  17. package/dist/services/rulesService.d.ts +10 -0
  18. package/dist/services/rulesService.d.ts.map +1 -0
  19. package/dist/services/rulesService.js +70 -0
  20. package/dist/services/rulesService.js.map +1 -0
  21. package/dist/tools/getIssueRemediation.d.ts +16 -0
  22. package/dist/tools/getIssueRemediation.d.ts.map +1 -0
  23. package/dist/tools/getIssueRemediation.js +77 -0
  24. package/dist/tools/getIssueRemediation.js.map +1 -0
  25. package/dist/tools/getMostUrgentIssues.d.ts +7 -0
  26. package/dist/tools/getMostUrgentIssues.d.ts.map +1 -0
  27. package/dist/tools/getMostUrgentIssues.js +94 -0
  28. package/dist/tools/getMostUrgentIssues.js.map +1 -0
  29. package/dist/tools/index.d.ts +4 -0
  30. package/dist/tools/index.d.ts.map +1 -0
  31. package/dist/tools/index.js +21 -0
  32. package/dist/tools/index.js.map +1 -0
  33. package/dist/tools/resolveIssue.d.ts +16 -0
  34. package/dist/tools/resolveIssue.d.ts.map +1 -0
  35. package/dist/tools/resolveIssue.js +70 -0
  36. package/dist/tools/resolveIssue.js.map +1 -0
  37. package/dist/tools/toolRegistry.d.ts +19 -0
  38. package/dist/tools/toolRegistry.d.ts.map +1 -0
  39. package/dist/tools/toolRegistry.js +9 -0
  40. package/dist/tools/toolRegistry.js.map +1 -0
  41. package/dist/types/issues.d.ts +32 -0
  42. package/dist/types/issues.d.ts.map +1 -0
  43. package/dist/types/issues.js +6 -0
  44. package/dist/types/issues.js.map +1 -0
  45. package/dist/types/remediation.d.ts +24 -0
  46. package/dist/types/remediation.d.ts.map +1 -0
  47. package/dist/types/remediation.js +6 -0
  48. package/dist/types/remediation.js.map +1 -0
  49. package/dist/utils/domains.d.ts +2 -0
  50. package/dist/utils/domains.d.ts.map +1 -0
  51. package/dist/utils/domains.js +14 -0
  52. package/dist/utils/domains.js.map +1 -0
  53. package/dist/utils/issues.d.ts +16 -0
  54. package/dist/utils/issues.d.ts.map +1 -0
  55. package/dist/utils/issues.js +24 -0
  56. package/dist/utils/issues.js.map +1 -0
  57. package/dist/utils/middleware.d.ts +14 -0
  58. package/dist/utils/middleware.d.ts.map +1 -0
  59. package/dist/utils/middleware.js +37 -0
  60. package/dist/utils/middleware.js.map +1 -0
  61. package/dist/utils/remediation.d.ts +27 -0
  62. package/dist/utils/remediation.d.ts.map +1 -0
  63. package/dist/utils/remediation.js +139 -0
  64. package/dist/utils/remediation.js.map +1 -0
  65. package/dist/utils.d.ts +2 -0
  66. package/dist/utils.d.ts.map +1 -0
  67. package/dist/utils.js +14 -0
  68. package/dist/utils.js.map +1 -0
  69. package/package.json +48 -14
  70. package/TOOL_REFERENCE.md +0 -126
  71. package/assets/MCP_banner.png +0 -0
  72. package/bin/flow-mcp +0 -4
  73. package/build/index.d.ts +0 -12
  74. package/build/index.d.ts.map +0 -1
  75. package/build/index.js +0 -95
  76. package/build/index.js.map +0 -1
  77. package/build/prompts/formatUrgentIssues.d.ts +0 -4
  78. package/build/prompts/formatUrgentIssues.d.ts.map +0 -1
  79. package/build/prompts/formatUrgentIssues.js +0 -78
  80. package/build/prompts/formatUrgentIssues.js.map +0 -1
  81. package/build/prompts/index.d.ts +0 -4
  82. package/build/prompts/index.d.ts.map +0 -1
  83. package/build/prompts/index.js +0 -12
  84. package/build/prompts/index.js.map +0 -1
  85. package/build/prompts/types.d.ts +0 -22
  86. package/build/prompts/types.d.ts.map +0 -1
  87. package/build/prompts/types.js +0 -2
  88. package/build/prompts/types.js.map +0 -1
  89. package/build/rules.json +0 -4591
  90. package/build/services/accessflow.d.ts +0 -6
  91. package/build/services/accessflow.d.ts.map +0 -1
  92. package/build/services/accessflow.js +0 -8
  93. package/build/services/accessflow.js.map +0 -1
  94. package/build/tools/getIssueRemediation.d.ts +0 -4
  95. package/build/tools/getIssueRemediation.d.ts.map +0 -1
  96. package/build/tools/getIssueRemediation.js +0 -165
  97. package/build/tools/getIssueRemediation.js.map +0 -1
  98. package/build/tools/getMostUrgentIssues.d.ts +0 -4
  99. package/build/tools/getMostUrgentIssues.d.ts.map +0 -1
  100. package/build/tools/getMostUrgentIssues.js +0 -106
  101. package/build/tools/getMostUrgentIssues.js.map +0 -1
  102. package/build/tools/index.d.ts +0 -9
  103. package/build/tools/index.d.ts.map +0 -1
  104. package/build/tools/index.js +0 -19
  105. package/build/tools/index.js.map +0 -1
  106. package/build/tools/types.d.ts +0 -19
  107. package/build/tools/types.d.ts.map +0 -1
  108. package/build/tools/types.js +0 -2
  109. package/build/tools/types.js.map +0 -1
  110. package/build/utils/config.d.ts +0 -8
  111. package/build/utils/config.d.ts.map +0 -1
  112. package/build/utils/config.js +0 -26
  113. package/build/utils/config.js.map +0 -1
  114. package/build/utils/database.d.ts +0 -13
  115. package/build/utils/database.d.ts.map +0 -1
  116. package/build/utils/database.js +0 -64
  117. package/build/utils/database.js.map +0 -1
  118. package/build/utils/domain.d.ts +0 -2
  119. package/build/utils/domain.d.ts.map +0 -1
  120. package/build/utils/domain.js +0 -11
  121. package/build/utils/domain.js.map +0 -1
  122. package/build/utils/logger.d.ts +0 -18
  123. package/build/utils/logger.d.ts.map +0 -1
  124. package/build/utils/logger.js +0 -51
  125. package/build/utils/logger.js.map +0 -1
  126. package/build/utils/responses.d.ts +0 -19
  127. package/build/utils/responses.d.ts.map +0 -1
  128. package/build/utils/responses.js +0 -41
  129. package/build/utils/responses.js.map +0 -1
  130. package/build/utils/validation.d.ts +0 -7
  131. package/build/utils/validation.d.ts.map +0 -1
  132. package/build/utils/validation.js +0 -47
  133. package/build/utils/validation.js.map +0 -1
  134. package/mcp-config.json +0 -11
  135. package/src/index.ts +0 -125
  136. package/src/services/accessflow.ts +0 -9
  137. package/src/tools/getIssueRemediation.ts +0 -218
  138. package/src/tools/getMostUrgentIssues.ts +0 -144
  139. package/src/tools/index.ts +0 -33
  140. package/src/tools/types.ts +0 -20
  141. package/src/utils/domain.ts +0 -13
  142. package/test.mjs +0 -63
  143. package/tsconfig.json +0 -20
  144. /package/{src → dist/data}/rules.json +0 -0
@@ -0,0 +1,2 @@
1
+ import 'dotenv/config';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,66 @@
1
+ import 'dotenv/config';
2
+ import { FastMCP } from 'fastmcp';
3
+ import packageJson from '../package.json' with { type: 'json' };
4
+ import { registerTools } from './tools/index.js';
5
+ import { sanitizeDomain } from './utils/domains.js';
6
+ import { ApiService } from './services/apiService.js';
7
+ import { logger } from './services/loggerService.js';
8
+ class FlowMcpServer {
9
+ options;
10
+ server;
11
+ domain;
12
+ environment;
13
+ apiKey;
14
+ apiService;
15
+ constructor() {
16
+ this.options = {
17
+ name: 'accessFlow MCP Server',
18
+ version: packageJson.version,
19
+ };
20
+ this.server = new FastMCP(this.options);
21
+ this.domain = sanitizeDomain(process.env.DOMAIN || '');
22
+ this.environment =
23
+ process.env.ENVIRONMENT || 'https://accessflow.accessibe.com'; // Default to production environment
24
+ this.apiKey = process.env.API_KEY || '';
25
+ const nonProdUserName = process.env.NON_PROD_USER_NAME;
26
+ const nonProdPassword = process.env.NON_PROD_PASSWORD;
27
+ this.apiService = new ApiService(this.environment, this.domain, this.apiKey, nonProdUserName, nonProdPassword);
28
+ }
29
+ async init() {
30
+ registerTools(this.server, this.apiService);
31
+ // Start the FastMCP server
32
+ await this.server.start({
33
+ transportType: 'stdio',
34
+ });
35
+ return this;
36
+ }
37
+ async stop() {
38
+ if (this.server)
39
+ await this.server.stop();
40
+ }
41
+ }
42
+ async function startServer() {
43
+ const server = new FlowMcpServer();
44
+ // Handle graceful shutdown
45
+ process.on('SIGINT', async () => {
46
+ await server.stop();
47
+ process.exit(0);
48
+ });
49
+ process.on('SIGTERM', async () => {
50
+ await server.stop();
51
+ process.exit(0);
52
+ });
53
+ try {
54
+ await server.init();
55
+ }
56
+ catch (error) {
57
+ logger.error({
58
+ error: error instanceof Error ? error.message : 'Unknown error',
59
+ stack: error instanceof Error ? error.stack : undefined,
60
+ }, 'Failed to start Flow MCP Server');
61
+ // Exit code 1 will indicate failure to the parent process
62
+ process.exit(1);
63
+ }
64
+ }
65
+ startServer();
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Zod validation schemas for API responses
3
+ * These schemas match the server-side BasicIssueSchema and IssueSchema
4
+ */
5
+ import { z } from 'zod';
6
+ export declare const Device: z.ZodEnum<["desktop", "mobile", "cross"]>;
7
+ export declare const ResolutionType: z.ZodEnum<["none", "resolved", "dismissed", "falsePositive"]>;
8
+ export declare const SeveritySchema: z.ZodEnum<["extreme", "high", "medium", "low"]>;
9
+ export declare const WCAGLevelSchema: z.ZodEnum<["A", "AA", "AAA"]>;
10
+ export declare const AltTextFeedbackSchema: z.ZodEnum<["positive", "negative"]>;
11
+ export declare const DismissedReason: z.ZodEnum<["duplicate", "falsePositive", "notApplicable", "willNotFix"]>;
12
+ export declare const DismissedReasonSchema: z.ZodOptional<z.ZodNullable<z.ZodObject<{
13
+ comment: z.ZodOptional<z.ZodString>;
14
+ type: z.ZodOptional<z.ZodEnum<["duplicate", "falsePositive", "notApplicable", "willNotFix"]>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ comment?: string | undefined;
17
+ type?: "falsePositive" | "duplicate" | "notApplicable" | "willNotFix" | undefined;
18
+ }, {
19
+ comment?: string | undefined;
20
+ type?: "falsePositive" | "duplicate" | "notApplicable" | "willNotFix" | undefined;
21
+ }>>>;
22
+ export declare const LastStatusChangeLogSchema: z.ZodOptional<z.ZodNullable<z.ZodObject<{
23
+ autoResolved: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
24
+ date: z.ZodOptional<z.ZodString>;
25
+ status: z.ZodOptional<z.ZodNullable<z.ZodEnum<["none", "resolved", "dismissed", "falsePositive"]>>>;
26
+ userId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
27
+ userName: z.ZodOptional<z.ZodString>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ status?: "none" | "resolved" | "dismissed" | "falsePositive" | null | undefined;
30
+ autoResolved?: boolean | null | undefined;
31
+ date?: string | undefined;
32
+ userId?: string | null | undefined;
33
+ userName?: string | undefined;
34
+ }, {
35
+ status?: "none" | "resolved" | "dismissed" | "falsePositive" | null | undefined;
36
+ autoResolved?: boolean | null | undefined;
37
+ date?: string | undefined;
38
+ userId?: string | null | undefined;
39
+ userName?: string | undefined;
40
+ }>>>;
41
+ export declare const AltTextSuggestionSchema: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
42
+ export declare const FalsePositiveAiValidationSchema: z.ZodObject<{
43
+ feedback: z.ZodDefault<z.ZodNullable<z.ZodObject<{
44
+ helpful: z.ZodBoolean;
45
+ userId: z.ZodString;
46
+ userText: z.ZodString;
47
+ }, "strip", z.ZodTypeAny, {
48
+ userId: string;
49
+ helpful: boolean;
50
+ userText: string;
51
+ }, {
52
+ userId: string;
53
+ helpful: boolean;
54
+ userText: string;
55
+ }>>>;
56
+ type: z.ZodEnum<["falsePositive"]>;
57
+ isFalsePositive: z.ZodBoolean;
58
+ reasoning: z.ZodString;
59
+ }, "strip", z.ZodTypeAny, {
60
+ type: "falsePositive";
61
+ feedback: {
62
+ userId: string;
63
+ helpful: boolean;
64
+ userText: string;
65
+ } | null;
66
+ isFalsePositive: boolean;
67
+ reasoning: string;
68
+ }, {
69
+ type: "falsePositive";
70
+ isFalsePositive: boolean;
71
+ reasoning: string;
72
+ feedback?: {
73
+ userId: string;
74
+ helpful: boolean;
75
+ userText: string;
76
+ } | null | undefined;
77
+ }>;
78
+ export declare const BasicIssueSchema: z.ZodObject<{
79
+ displayName: z.ZodString;
80
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
81
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
82
+ siteOccurrences: z.ZodNumber;
83
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
84
+ displayName: z.ZodString;
85
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
86
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
87
+ siteOccurrences: z.ZodNumber;
88
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
89
+ displayName: z.ZodString;
90
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
91
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
92
+ siteOccurrences: z.ZodNumber;
93
+ }, z.ZodTypeAny, "passthrough">>;
94
+ export declare const DetailedIssueSchema: z.ZodObject<{
95
+ displayName: z.ZodString;
96
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
97
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
98
+ siteOccurrences: z.ZodNumber;
99
+ HTML: z.ZodString;
100
+ confidence: z.ZodNumber;
101
+ modified: z.ZodString;
102
+ occurrences: z.ZodNumber;
103
+ webpath: z.ZodOptional<z.ZodString>;
104
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
+ relatedRuleId: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
106
+ $oid: z.ZodString;
107
+ }, "strip", z.ZodTypeAny, {
108
+ $oid: string;
109
+ }, {
110
+ $oid: string;
111
+ }>]>>;
112
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
113
+ displayName: z.ZodString;
114
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
115
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
116
+ siteOccurrences: z.ZodNumber;
117
+ HTML: z.ZodString;
118
+ confidence: z.ZodNumber;
119
+ modified: z.ZodString;
120
+ occurrences: z.ZodNumber;
121
+ webpath: z.ZodOptional<z.ZodString>;
122
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
123
+ relatedRuleId: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
124
+ $oid: z.ZodString;
125
+ }, "strip", z.ZodTypeAny, {
126
+ $oid: string;
127
+ }, {
128
+ $oid: string;
129
+ }>]>>;
130
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
131
+ displayName: z.ZodString;
132
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
133
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
134
+ siteOccurrences: z.ZodNumber;
135
+ HTML: z.ZodString;
136
+ confidence: z.ZodNumber;
137
+ modified: z.ZodString;
138
+ occurrences: z.ZodNumber;
139
+ webpath: z.ZodOptional<z.ZodString>;
140
+ selector: z.ZodOptional<z.ZodNullable<z.ZodString>>;
141
+ relatedRuleId: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodObject<{
142
+ $oid: z.ZodString;
143
+ }, "strip", z.ZodTypeAny, {
144
+ $oid: string;
145
+ }, {
146
+ $oid: string;
147
+ }>]>>;
148
+ }, z.ZodTypeAny, "passthrough">>;
149
+ export declare const UrgentIssuesResponseSchema: z.ZodObject<{
150
+ issues: z.ZodArray<z.ZodObject<{
151
+ displayName: z.ZodString;
152
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
153
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
154
+ siteOccurrences: z.ZodNumber;
155
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
156
+ displayName: z.ZodString;
157
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
158
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
159
+ siteOccurrences: z.ZodNumber;
160
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
161
+ displayName: z.ZodString;
162
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
163
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
164
+ siteOccurrences: z.ZodNumber;
165
+ }, z.ZodTypeAny, "passthrough">>, "many">;
166
+ }, "strip", z.ZodTypeAny, {
167
+ issues: z.objectOutputType<{
168
+ displayName: z.ZodString;
169
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
170
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
171
+ siteOccurrences: z.ZodNumber;
172
+ }, z.ZodTypeAny, "passthrough">[];
173
+ }, {
174
+ issues: z.objectInputType<{
175
+ displayName: z.ZodString;
176
+ severity: z.ZodEnum<["extreme", "high", "medium", "low"]>;
177
+ WCAGLevel: z.ZodEnum<["A", "AA", "AAA"]>;
178
+ siteOccurrences: z.ZodNumber;
179
+ }, z.ZodTypeAny, "passthrough">[];
180
+ }>;
181
+ export declare const ResolveIssueRequestSchema: z.ZodObject<{
182
+ displayName: z.ZodString;
183
+ }, "strip", z.ZodTypeAny, {
184
+ displayName: string;
185
+ }, {
186
+ displayName: string;
187
+ }>;
188
+ export declare const ResolveIssueResponseSchema: z.ZodObject<{
189
+ success: z.ZodLiteral<true>;
190
+ }, "strip", z.ZodTypeAny, {
191
+ success: true;
192
+ }, {
193
+ success: true;
194
+ }>;
195
+ export type Severity = z.infer<typeof SeveritySchema>;
196
+ export type WCAGLevel = z.infer<typeof WCAGLevelSchema>;
197
+ export type ApiIssue = z.infer<typeof BasicIssueSchema>;
198
+ export type ApiUrgentIssuesResponse = z.infer<typeof UrgentIssuesResponseSchema>;
199
+ export type ApiIssueRemediation = z.infer<typeof DetailedIssueSchema>;
200
+ //# sourceMappingURL=apiSchemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiSchemas.d.ts","sourceRoot":"","sources":["../../src/services/apiSchemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,MAAM,2CAAyC,CAAC;AAC7D,eAAO,MAAM,cAAc,+DAKzB,CAAC;AACH,eAAO,MAAM,cAAc,iDAA+C,CAAC;AAC3E,eAAO,MAAM,eAAe,+BAA6B,CAAC;AAC1D,eAAO,MAAM,qBAAqB,qCAAmC,CAAC;AACtE,eAAO,MAAM,eAAe,0EAK1B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;IAMrB,CAAC;AAEd,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;IASzB,CAAC;AAEd,eAAO,MAAM,uBAAuB,+DAGvB,CAAC;AAEd,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY1C,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;gCASb,CAAC;AAEjB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAoBhB,CAAC;AAEjB,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAErC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;EAEpC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACxD,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAC3C,OAAO,0BAA0B,CAClC,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Zod validation schemas for API responses
3
+ * These schemas match the server-side BasicIssueSchema and IssueSchema
4
+ */
5
+ import { z } from 'zod';
6
+ export const Device = z.enum(['desktop', 'mobile', 'cross']);
7
+ export const ResolutionType = z.enum([
8
+ 'none',
9
+ 'resolved',
10
+ 'dismissed',
11
+ 'falsePositive',
12
+ ]);
13
+ export const SeveritySchema = z.enum(['extreme', 'high', 'medium', 'low']);
14
+ export const WCAGLevelSchema = z.enum(['A', 'AA', 'AAA']);
15
+ export const AltTextFeedbackSchema = z.enum(['positive', 'negative']);
16
+ export const DismissedReason = z.enum([
17
+ 'duplicate',
18
+ 'falsePositive',
19
+ 'notApplicable',
20
+ 'willNotFix',
21
+ ]);
22
+ export const DismissedReasonSchema = z
23
+ .object({
24
+ comment: z.string().optional(),
25
+ type: DismissedReason.optional(),
26
+ })
27
+ .nullable()
28
+ .optional();
29
+ export const LastStatusChangeLogSchema = z
30
+ .object({
31
+ autoResolved: z.boolean().nullable().optional(),
32
+ date: z.string().optional(),
33
+ status: ResolutionType.nullable().optional(),
34
+ userId: z.string().nullable().optional(),
35
+ userName: z.string().optional(),
36
+ })
37
+ .nullable()
38
+ .optional();
39
+ export const AltTextSuggestionSchema = z
40
+ .array(z.string())
41
+ .nullable()
42
+ .optional();
43
+ export const FalsePositiveAiValidationSchema = z.object({
44
+ feedback: z
45
+ .object({
46
+ helpful: z.boolean(),
47
+ userId: z.string(),
48
+ userText: z.string(),
49
+ })
50
+ .nullable()
51
+ .default(null),
52
+ type: z.enum(['falsePositive']),
53
+ isFalsePositive: z.boolean(),
54
+ reasoning: z.string(),
55
+ });
56
+ export const BasicIssueSchema = z
57
+ .object({
58
+ // REQUIRED: Critical fields for MCP (must not be null)
59
+ displayName: z.string(),
60
+ severity: SeveritySchema,
61
+ WCAGLevel: WCAGLevelSchema,
62
+ siteOccurrences: z.number(),
63
+ })
64
+ // allow extra fields from API
65
+ .passthrough();
66
+ export const DetailedIssueSchema = z
67
+ .object({
68
+ // REQUIRED: Critical fields for MCP (must not be null)
69
+ displayName: z.string(),
70
+ severity: SeveritySchema,
71
+ WCAGLevel: WCAGLevelSchema,
72
+ siteOccurrences: z.number(),
73
+ HTML: z.string(),
74
+ confidence: z.number(),
75
+ modified: z.string(),
76
+ occurrences: z.number(),
77
+ // OPTIONAL: Used but have fallbacks in code
78
+ webpath: z.string().optional(),
79
+ selector: z.string().nullable().optional(),
80
+ relatedRuleId: z
81
+ .union([z.string(), z.object({ $oid: z.string() })])
82
+ .optional(),
83
+ })
84
+ // allow extra fields from API
85
+ .passthrough();
86
+ export const UrgentIssuesResponseSchema = z.object({
87
+ issues: z.array(BasicIssueSchema),
88
+ });
89
+ export const ResolveIssueRequestSchema = z.object({
90
+ displayName: z.string(),
91
+ });
92
+ export const ResolveIssueResponseSchema = z.object({
93
+ success: z.literal(true),
94
+ });
95
+ //# sourceMappingURL=apiSchemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiSchemas.js","sourceRoot":"","sources":["../../src/services/apiSchemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type ApiIssue, type ApiIssueRemediation } from './apiSchemas.js';
2
+ export interface ApiRequestOptions {
3
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
4
+ headers?: Record<string, string>;
5
+ body?: unknown;
6
+ }
7
+ export declare class ApiError extends Error {
8
+ readonly statusCode: number;
9
+ readonly statusText: string;
10
+ constructor(message: string, statusCode: number, statusText: string);
11
+ }
12
+ export declare class ApiService {
13
+ private readonly baseUrl;
14
+ private readonly defaultHeaders;
15
+ readonly domain: string;
16
+ readonly apiKey: string;
17
+ constructor(environment: string, domain: string, apiKey: string, nonProdUserName?: string, nonProdPassword?: string);
18
+ /**
19
+ * Makes an HTTP request to the API
20
+ */
21
+ request<T>(endpoint: string, options?: ApiRequestOptions): Promise<T>;
22
+ /**
23
+ * Makes a GET request that returns null for 404 errors instead of throwing
24
+ */
25
+ getOrNull<T>(endpoint: string, headers?: Record<string, string>): Promise<T | null>;
26
+ get<T>(endpoint: string, headers?: Record<string, string>): Promise<T>;
27
+ post<T>(endpoint: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
28
+ put<T>(endpoint: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
29
+ getUrgentIssues(limit?: number): Promise<ApiIssue[]>;
30
+ getIssueRemediation(issueDisplayName: string): Promise<ApiIssueRemediation | null>;
31
+ resolveIssue(issueDisplayName: string): Promise<{
32
+ success: boolean;
33
+ message: string;
34
+ issueDisplayName: string;
35
+ }>;
36
+ }
37
+ //# sourceMappingURL=apiService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiService.d.ts","sourceRoot":"","sources":["../../src/services/apiService.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,QAAS,SAAQ,KAAK;aAGf,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;gBAFlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM;CAKrC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAG7B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,MAAM,EACxB,eAAe,CAAC,EAAE,MAAM;IA2C1B;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,CAAC,CAAC;IA4Fb;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAoBd,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQtE,IAAI,CAAC,CAAC,EACV,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAWP,GAAG,CAAC,CAAC,EACT,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAWP,eAAe,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUxD,mBAAmB,CACvB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAchC,YAAY,CAChB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CAiB5E"}
@@ -0,0 +1,198 @@
1
+ import { logger } from './loggerService.js';
2
+ import { UrgentIssuesResponseSchema, DetailedIssueSchema, ResolveIssueRequestSchema, ResolveIssueResponseSchema, } from './apiSchemas.js';
3
+ export class ApiError extends Error {
4
+ statusCode;
5
+ statusText;
6
+ constructor(message, statusCode, statusText) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.statusText = statusText;
10
+ this.name = 'ApiError';
11
+ }
12
+ }
13
+ export class ApiService {
14
+ baseUrl;
15
+ defaultHeaders;
16
+ domain;
17
+ apiKey;
18
+ constructor(environment, domain, apiKey, nonProdUserName, nonProdPassword) {
19
+ this.domain = domain;
20
+ this.apiKey = apiKey;
21
+ // Ensure environment has protocol and ends properly
22
+ const sanitizedEnvironment = environment.startsWith('http')
23
+ ? environment
24
+ : `https://${environment}`;
25
+ this.baseUrl = sanitizedEnvironment.replace(/\/$/, '');
26
+ // Check if this is a non-production environment
27
+ const isTestEnvironment = sanitizedEnvironment
28
+ .toLowerCase()
29
+ .match(/\.acsb-test\.com\/?$/);
30
+ const headers = {
31
+ 'x-api-key': apiKey,
32
+ 'x-accessflow-domain': domain,
33
+ 'Content-Type': 'application/json',
34
+ };
35
+ // add Basic Authentication for non-production/test environments
36
+ if (isTestEnvironment) {
37
+ const user = nonProdUserName;
38
+ const pass = nonProdPassword;
39
+ if (user && pass) {
40
+ const basicAuth = Buffer.from(`${user}:${pass}`).toString('base64');
41
+ headers['Authorization'] = `Basic ${basicAuth}`;
42
+ }
43
+ else {
44
+ logger.error({
45
+ user: user ? '[PROVIDED]' : undefined,
46
+ pass: pass ? '[PROVIDED]' : undefined,
47
+ }, 'Basic Auth credentials missing for test environment');
48
+ }
49
+ }
50
+ this.defaultHeaders = headers;
51
+ }
52
+ /**
53
+ * Makes an HTTP request to the API
54
+ */
55
+ async request(endpoint, options = {}) {
56
+ const url = `${this.baseUrl}${endpoint.startsWith('/') ? endpoint : `/${endpoint}`}`;
57
+ const method = options.method || 'GET';
58
+ const headers = {
59
+ ...this.defaultHeaders,
60
+ ...options.headers,
61
+ };
62
+ const fetchOptions = {
63
+ method,
64
+ headers,
65
+ };
66
+ if (options.body && method !== 'GET') {
67
+ fetchOptions.body = JSON.stringify(options.body);
68
+ }
69
+ try {
70
+ const response = await fetch(url, fetchOptions);
71
+ if (!response.ok) {
72
+ // Try to get error details from response body
73
+ let errorDetails = '';
74
+ try {
75
+ const errorBody = await response.text();
76
+ if (errorBody) {
77
+ try {
78
+ const parsed = JSON.parse(errorBody);
79
+ errorDetails = ` Response: ${JSON.stringify(parsed, null, 2)}`;
80
+ }
81
+ catch {
82
+ errorDetails = ` Response body: ${errorBody.substring(0, 500)}`;
83
+ }
84
+ }
85
+ }
86
+ catch {
87
+ // Ignore errors reading response body
88
+ }
89
+ const apiError = new ApiError(`API request failed: ${response.status} ${response.statusText}. URL: ${url}${errorDetails}`, response.status, response.statusText);
90
+ logger.error({
91
+ url,
92
+ method,
93
+ statusCode: response.status,
94
+ statusText: response.statusText,
95
+ errorDetails,
96
+ }, 'API reuest failed');
97
+ throw apiError;
98
+ }
99
+ // Handle empty responses
100
+ const contentType = response.headers.get('content-type');
101
+ if (!contentType || !contentType.includes('application/json')) {
102
+ return {};
103
+ }
104
+ const result = (await response.json());
105
+ return result;
106
+ }
107
+ catch (error) {
108
+ if (error instanceof ApiError) {
109
+ throw error;
110
+ }
111
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
112
+ logger.error({
113
+ url,
114
+ method,
115
+ error: errorMessage,
116
+ stack: error instanceof Error ? error.stack : undefined,
117
+ }, 'Network error in API request');
118
+ throw new ApiError(`Failed to fetch from API: ${errorMessage}`, 0, 'Network Error');
119
+ }
120
+ }
121
+ /**
122
+ * Makes a GET request that returns null for 404 errors instead of throwing
123
+ */
124
+ async getOrNull(endpoint, headers) {
125
+ try {
126
+ return await this.get(endpoint, headers);
127
+ }
128
+ catch (error) {
129
+ if (error instanceof ApiError && error.statusCode === 404) {
130
+ return null;
131
+ }
132
+ logger.error({
133
+ endpoint,
134
+ error: error instanceof Error ? error.message : 'Unknown error',
135
+ }, 'Error in getOrNull');
136
+ throw error;
137
+ }
138
+ }
139
+ async get(endpoint, headers) {
140
+ const options = { method: 'GET' };
141
+ if (headers) {
142
+ options.headers = headers;
143
+ }
144
+ return this.request(endpoint, options);
145
+ }
146
+ async post(endpoint, body, headers) {
147
+ const options = { method: 'POST' };
148
+ if (body) {
149
+ options.body = body;
150
+ }
151
+ if (headers) {
152
+ options.headers = headers;
153
+ }
154
+ return this.request(endpoint, options);
155
+ }
156
+ async put(endpoint, body, headers) {
157
+ const options = { method: 'PUT' };
158
+ if (body) {
159
+ options.body = body;
160
+ }
161
+ if (headers) {
162
+ options.headers = headers;
163
+ }
164
+ return this.request(endpoint, options);
165
+ }
166
+ async getUrgentIssues(limit = 10) {
167
+ const response = await this.get(`/api/v6/mcp/urgent-issues?limit=${limit}`);
168
+ // Validate response with server schema
169
+ const parsedResponse = UrgentIssuesResponseSchema.parse(response);
170
+ return parsedResponse.issues;
171
+ }
172
+ async getIssueRemediation(issueDisplayName) {
173
+ try {
174
+ const response = await this.get(`/api/v6/mcp/${encodeURIComponent(issueDisplayName)}`);
175
+ return DetailedIssueSchema.parse(response);
176
+ }
177
+ catch (error) {
178
+ if (error instanceof ApiError && error.statusCode === 404) {
179
+ return null;
180
+ }
181
+ throw error;
182
+ }
183
+ }
184
+ async resolveIssue(issueDisplayName) {
185
+ const requestBody = ResolveIssueRequestSchema.parse({
186
+ displayName: issueDisplayName,
187
+ });
188
+ const response = await this.put('/api/v6/mcp/resolve-issue', requestBody);
189
+ const parsedResponse = ResolveIssueResponseSchema.parse(response);
190
+ // Return consistent format with additional context
191
+ return {
192
+ success: parsedResponse.success,
193
+ message: 'Issue resolved successfully',
194
+ issueDisplayName: issueDisplayName,
195
+ };
196
+ }
197
+ }
198
+ //# sourceMappingURL=apiService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiService.js","sourceRoot":"","sources":["../../src/services/apiService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,GAG3B,MAAM,iBAAiB,CAAC;AAQzB,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IAHlB,YACE,OAAe,EACC,UAAkB,EAClB,UAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAClB,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,UAAU;IACJ,OAAO,CAAS;IAChB,cAAc,CAAyB;IACxC,MAAM,CAAS;IACf,MAAM,CAAS;IAE/B,YACE,WAAmB,EACnB,MAAc,EACd,MAAc,EACd,eAAwB,EACxB,eAAwB;QAExB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,oDAAoD;QACpD,MAAM,oBAAoB,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;YACzD,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,WAAW,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEvD,gDAAgD;QAChD,MAAM,iBAAiB,GAAG,oBAAoB;aAC3C,WAAW,EAAE;aACb,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEjC,MAAM,OAAO,GAA2B;YACtC,WAAW,EAAE,MAAM;YACnB,qBAAqB,EAAE,MAAM;YAC7B,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,gEAAgE;QAChE,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,eAAe,CAAC;YAC7B,MAAM,IAAI,GAAG,eAAe,CAAC;YAE7B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACpE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,SAAS,EAAE,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CACV;oBACE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;oBACrC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;iBACtC,EACD,qDAAqD,CACtD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,UAA6B,EAAE;QAE/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC;QACrF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACvC,MAAM,OAAO,GAAG;YACd,GAAG,IAAI,CAAC,cAAc;YACtB,GAAG,OAAO,CAAC,OAAO;SACnB,CAAC;QAEF,MAAM,YAAY,GAAgB;YAChC,MAAM;YACN,OAAO;SACR,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEhD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,8CAA8C;gBAC9C,IAAI,YAAY,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,IAAI,SAAS,EAAE,CAAC;wBACd,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;4BACrC,YAAY,GAAG,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;wBACjE,CAAC;wBAAC,MAAM,CAAC;4BACP,YAAY,GAAG,mBAAmB,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBAClE,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,sCAAsC;gBACxC,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC3B,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,UAAU,GAAG,GAAG,YAAY,EAAE,EAC3F,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,CACpB,CAAC;gBAEF,MAAM,CAAC,KAAK,CACV;oBACE,GAAG;oBACH,MAAM;oBACN,UAAU,EAAE,QAAQ,CAAC,MAAM;oBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,YAAY;iBACb,EACD,mBAAmB,CACpB,CAAC;gBAEF,MAAM,QAAQ,CAAC;YACjB,CAAC;YAED,yBAAyB;YACzB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACzD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC9D,OAAO,EAAO,CAAC;YACjB,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YAE5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAE3D,MAAM,CAAC,KAAK,CACV;gBACE,GAAG;gBACH,MAAM;gBACN,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,EACD,8BAA8B,CAC/B,CAAC;YAEF,MAAM,IAAI,QAAQ,CAChB,6BAA6B,YAAY,EAAE,EAC3C,CAAC,EACD,eAAe,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACb,QAAgB,EAChB,OAAgC;QAEhC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAI,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,CAAC,KAAK,CACV;gBACE,QAAQ;gBACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,EACD,oBAAoB,CACrB,CAAC;YAEF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,QAAgB,EAAE,OAAgC;QAC7D,MAAM,OAAO,GAAsB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAAgB,EAChB,IAAc,EACd,OAAgC;QAEhC,MAAM,OAAO,GAAsB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CACP,QAAgB,EAChB,IAAc,EACd,OAAgC;QAEhC,MAAM,OAAO,GAAsB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAC7B,mCAAmC,KAAK,EAAE,CAC3C,CAAC;QAEF,uCAAuC;QACvC,MAAM,cAAc,GAAG,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,cAAc,CAAC,MAAoB,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,gBAAwB;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAC7B,eAAe,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CACtD,CAAC;YACF,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAwB,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,gBAAwB;QAExB,MAAM,WAAW,GAAG,yBAAyB,CAAC,KAAK,CAAC;YAClD,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAC7B,2BAA2B,EAC3B,WAAW,CACZ,CAAC;QACF,MAAM,cAAc,GAAG,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElE,mDAAmD;QACnD,OAAO;YACL,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,OAAO,EAAE,6BAA6B;YACtC,gBAAgB,EAAE,gBAAgB;SACnC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import pino from 'pino';
2
+ export declare const logger: pino.Logger;
3
+ //# sourceMappingURL=loggerService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loggerService.d.ts","sourceRoot":"","sources":["../../src/services/loggerService.ts"],"names":[],"mappings":"AACA,OAAO,IAAmC,MAAM,MAAM,CAAC;AA8CvD,eAAO,MAAM,MAAM,aAAsB,CAAC"}