fridayy 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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/bin/fridayy.js +12 -0
  4. package/dist/adapters/base.d.ts +40 -0
  5. package/dist/adapters/base.d.ts.map +1 -0
  6. package/dist/adapters/base.js +7 -0
  7. package/dist/adapters/base.js.map +1 -0
  8. package/dist/adapters/manual/adapter.d.ts +18 -0
  9. package/dist/adapters/manual/adapter.d.ts.map +1 -0
  10. package/dist/adapters/manual/adapter.js +52 -0
  11. package/dist/adapters/manual/adapter.js.map +1 -0
  12. package/dist/adapters/nodejs/adapter.d.ts +19 -0
  13. package/dist/adapters/nodejs/adapter.d.ts.map +1 -0
  14. package/dist/adapters/nodejs/adapter.js +135 -0
  15. package/dist/adapters/nodejs/adapter.js.map +1 -0
  16. package/dist/adapters/nodejs/ast-scanner.d.ts +21 -0
  17. package/dist/adapters/nodejs/ast-scanner.d.ts.map +1 -0
  18. package/dist/adapters/nodejs/ast-scanner.js +102 -0
  19. package/dist/adapters/nodejs/ast-scanner.js.map +1 -0
  20. package/dist/adapters/openapi/adapter.d.ts +22 -0
  21. package/dist/adapters/openapi/adapter.d.ts.map +1 -0
  22. package/dist/adapters/openapi/adapter.js +271 -0
  23. package/dist/adapters/openapi/adapter.js.map +1 -0
  24. package/dist/adapters/openapi/parser.d.ts +30 -0
  25. package/dist/adapters/openapi/parser.d.ts.map +1 -0
  26. package/dist/adapters/openapi/parser.js +136 -0
  27. package/dist/adapters/openapi/parser.js.map +1 -0
  28. package/dist/adapters/openapi/request-builder.d.ts +13 -0
  29. package/dist/adapters/openapi/request-builder.d.ts.map +1 -0
  30. package/dist/adapters/openapi/request-builder.js +83 -0
  31. package/dist/adapters/openapi/request-builder.js.map +1 -0
  32. package/dist/adapters/registry.d.ts +28 -0
  33. package/dist/adapters/registry.d.ts.map +1 -0
  34. package/dist/adapters/registry.js +46 -0
  35. package/dist/adapters/registry.js.map +1 -0
  36. package/dist/adapters/rest/adapter.d.ts +18 -0
  37. package/dist/adapters/rest/adapter.d.ts.map +1 -0
  38. package/dist/adapters/rest/adapter.js +41 -0
  39. package/dist/adapters/rest/adapter.js.map +1 -0
  40. package/dist/adapters/rest/executor.d.ts +19 -0
  41. package/dist/adapters/rest/executor.d.ts.map +1 -0
  42. package/dist/adapters/rest/executor.js +101 -0
  43. package/dist/adapters/rest/executor.js.map +1 -0
  44. package/dist/cli/commands/config.d.ts +7 -0
  45. package/dist/cli/commands/config.d.ts.map +1 -0
  46. package/dist/cli/commands/config.js +92 -0
  47. package/dist/cli/commands/config.js.map +1 -0
  48. package/dist/cli/commands/doctor.d.ts +7 -0
  49. package/dist/cli/commands/doctor.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor.js +126 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/generate.d.ts +7 -0
  53. package/dist/cli/commands/generate.d.ts.map +1 -0
  54. package/dist/cli/commands/generate.js +58 -0
  55. package/dist/cli/commands/generate.js.map +1 -0
  56. package/dist/cli/commands/init.d.ts +7 -0
  57. package/dist/cli/commands/init.d.ts.map +1 -0
  58. package/dist/cli/commands/init.js +54 -0
  59. package/dist/cli/commands/init.js.map +1 -0
  60. package/dist/cli/commands/review.d.ts +7 -0
  61. package/dist/cli/commands/review.d.ts.map +1 -0
  62. package/dist/cli/commands/review.js +151 -0
  63. package/dist/cli/commands/review.js.map +1 -0
  64. package/dist/cli/commands/scan.d.ts +7 -0
  65. package/dist/cli/commands/scan.d.ts.map +1 -0
  66. package/dist/cli/commands/scan.js +77 -0
  67. package/dist/cli/commands/scan.js.map +1 -0
  68. package/dist/cli/commands/start.d.ts +7 -0
  69. package/dist/cli/commands/start.d.ts.map +1 -0
  70. package/dist/cli/commands/start.js +54 -0
  71. package/dist/cli/commands/start.js.map +1 -0
  72. package/dist/cli/commands/tools.d.ts +7 -0
  73. package/dist/cli/commands/tools.d.ts.map +1 -0
  74. package/dist/cli/commands/tools.js +48 -0
  75. package/dist/cli/commands/tools.js.map +1 -0
  76. package/dist/cli/index.d.ts +8 -0
  77. package/dist/cli/index.d.ts.map +1 -0
  78. package/dist/cli/index.js +42 -0
  79. package/dist/cli/index.js.map +1 -0
  80. package/dist/cli/ui/banner.d.ts +6 -0
  81. package/dist/cli/ui/banner.d.ts.map +1 -0
  82. package/dist/cli/ui/banner.js +20 -0
  83. package/dist/cli/ui/banner.js.map +1 -0
  84. package/dist/cli/ui/logger.d.ts +12 -0
  85. package/dist/cli/ui/logger.d.ts.map +1 -0
  86. package/dist/cli/ui/logger.js +13 -0
  87. package/dist/cli/ui/logger.js.map +1 -0
  88. package/dist/cli/ui/tables.d.ts +9 -0
  89. package/dist/cli/ui/tables.d.ts.map +1 -0
  90. package/dist/cli/ui/tables.js +72 -0
  91. package/dist/cli/ui/tables.js.map +1 -0
  92. package/dist/config/config-manager.d.ts +37 -0
  93. package/dist/config/config-manager.d.ts.map +1 -0
  94. package/dist/config/config-manager.js +129 -0
  95. package/dist/config/config-manager.js.map +1 -0
  96. package/dist/config/defaults.d.ts +8 -0
  97. package/dist/config/defaults.d.ts.map +1 -0
  98. package/dist/config/defaults.js +37 -0
  99. package/dist/config/defaults.js.map +1 -0
  100. package/dist/core/authentication/manager.d.ts +20 -0
  101. package/dist/core/authentication/manager.d.ts.map +1 -0
  102. package/dist/core/authentication/manager.js +71 -0
  103. package/dist/core/authentication/manager.js.map +1 -0
  104. package/dist/core/authentication/secret-resolver.d.ts +39 -0
  105. package/dist/core/authentication/secret-resolver.d.ts.map +1 -0
  106. package/dist/core/authentication/secret-resolver.js +89 -0
  107. package/dist/core/authentication/secret-resolver.js.map +1 -0
  108. package/dist/core/discovery/index.d.ts +5 -0
  109. package/dist/core/discovery/index.d.ts.map +1 -0
  110. package/dist/core/discovery/index.js +5 -0
  111. package/dist/core/discovery/index.js.map +1 -0
  112. package/dist/core/discovery/project-scanner.d.ts +20 -0
  113. package/dist/core/discovery/project-scanner.d.ts.map +1 -0
  114. package/dist/core/discovery/project-scanner.js +174 -0
  115. package/dist/core/discovery/project-scanner.js.map +1 -0
  116. package/dist/core/permissions/classifier.d.ts +25 -0
  117. package/dist/core/permissions/classifier.d.ts.map +1 -0
  118. package/dist/core/permissions/classifier.js +92 -0
  119. package/dist/core/permissions/classifier.js.map +1 -0
  120. package/dist/core/permissions/enforcer.d.ts +24 -0
  121. package/dist/core/permissions/enforcer.d.ts.map +1 -0
  122. package/dist/core/permissions/enforcer.js +71 -0
  123. package/dist/core/permissions/enforcer.js.map +1 -0
  124. package/dist/core/schema/json-schema.d.ts +29 -0
  125. package/dist/core/schema/json-schema.d.ts.map +1 -0
  126. package/dist/core/schema/json-schema.js +129 -0
  127. package/dist/core/schema/json-schema.js.map +1 -0
  128. package/dist/core/schema/types.d.ts +187 -0
  129. package/dist/core/schema/types.d.ts.map +1 -0
  130. package/dist/core/schema/types.js +6 -0
  131. package/dist/core/schema/types.js.map +1 -0
  132. package/dist/core/tool-generator/description-builder.d.ts +15 -0
  133. package/dist/core/tool-generator/description-builder.d.ts.map +1 -0
  134. package/dist/core/tool-generator/description-builder.js +32 -0
  135. package/dist/core/tool-generator/description-builder.js.map +1 -0
  136. package/dist/core/tool-generator/generator.d.ts +21 -0
  137. package/dist/core/tool-generator/generator.d.ts.map +1 -0
  138. package/dist/core/tool-generator/generator.js +61 -0
  139. package/dist/core/tool-generator/generator.js.map +1 -0
  140. package/dist/core/tool-generator/name-sanitizer.d.ts +21 -0
  141. package/dist/core/tool-generator/name-sanitizer.d.ts.map +1 -0
  142. package/dist/core/tool-generator/name-sanitizer.js +84 -0
  143. package/dist/core/tool-generator/name-sanitizer.js.map +1 -0
  144. package/dist/core/validation/config-schema.d.ts +1458 -0
  145. package/dist/core/validation/config-schema.d.ts.map +1 -0
  146. package/dist/core/validation/config-schema.js +137 -0
  147. package/dist/core/validation/config-schema.js.map +1 -0
  148. package/dist/core/validation/validator.d.ts +28 -0
  149. package/dist/core/validation/validator.d.ts.map +1 -0
  150. package/dist/core/validation/validator.js +108 -0
  151. package/dist/core/validation/validator.js.map +1 -0
  152. package/dist/index.d.ts +38 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +38 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/mcp/prompts/prompt-registry.d.ts +28 -0
  157. package/dist/mcp/prompts/prompt-registry.d.ts.map +1 -0
  158. package/dist/mcp/prompts/prompt-registry.js +65 -0
  159. package/dist/mcp/prompts/prompt-registry.js.map +1 -0
  160. package/dist/mcp/resources/resource-registry.d.ts +26 -0
  161. package/dist/mcp/resources/resource-registry.d.ts.map +1 -0
  162. package/dist/mcp/resources/resource-registry.js +87 -0
  163. package/dist/mcp/resources/resource-registry.js.map +1 -0
  164. package/dist/mcp/server/fridayy-server.d.ts +38 -0
  165. package/dist/mcp/server/fridayy-server.d.ts.map +1 -0
  166. package/dist/mcp/server/fridayy-server.js +143 -0
  167. package/dist/mcp/server/fridayy-server.js.map +1 -0
  168. package/dist/mcp/tools/tool-handler.d.ts +29 -0
  169. package/dist/mcp/tools/tool-handler.d.ts.map +1 -0
  170. package/dist/mcp/tools/tool-handler.js +206 -0
  171. package/dist/mcp/tools/tool-handler.js.map +1 -0
  172. package/dist/mcp/tools/tool-registry.d.ts +20 -0
  173. package/dist/mcp/tools/tool-registry.d.ts.map +1 -0
  174. package/dist/mcp/tools/tool-registry.js +38 -0
  175. package/dist/mcp/tools/tool-registry.js.map +1 -0
  176. package/dist/security/allowlist.d.ts +10 -0
  177. package/dist/security/allowlist.d.ts.map +1 -0
  178. package/dist/security/allowlist.js +30 -0
  179. package/dist/security/allowlist.js.map +1 -0
  180. package/dist/security/audit-logger.d.ts +35 -0
  181. package/dist/security/audit-logger.d.ts.map +1 -0
  182. package/dist/security/audit-logger.js +52 -0
  183. package/dist/security/audit-logger.js.map +1 -0
  184. package/dist/security/rate-limiter.d.ts +28 -0
  185. package/dist/security/rate-limiter.d.ts.map +1 -0
  186. package/dist/security/rate-limiter.js +64 -0
  187. package/dist/security/rate-limiter.js.map +1 -0
  188. package/dist/security/sanitizer.d.ts +17 -0
  189. package/dist/security/sanitizer.d.ts.map +1 -0
  190. package/dist/security/sanitizer.js +70 -0
  191. package/dist/security/sanitizer.js.map +1 -0
  192. package/package.json +77 -0
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Fridayy - Official Model Context Protocol (MCP) Server
3
+ * Implements standard MCP tools, resources, and prompts over Stdio and SSE transports.
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { FridayyConfig, FridayyToolDefinition } from '../../core/schema/types.js';
7
+ import { ToolRegistry } from '../tools/tool-registry.js';
8
+ import { AdapterRegistry } from '../../adapters/registry.js';
9
+ export interface FridayyServerOptions {
10
+ config: FridayyConfig;
11
+ tools: FridayyToolDefinition[];
12
+ adapterRegistry?: AdapterRegistry;
13
+ }
14
+ export declare class FridayyMcpServer {
15
+ private server;
16
+ private config;
17
+ private toolRegistry;
18
+ private toolHandler;
19
+ private resourceRegistry;
20
+ private promptRegistry;
21
+ private sseTransports;
22
+ constructor(options: FridayyServerOptions);
23
+ private registerHandlers;
24
+ /**
25
+ * Starts the server on Stdio transport (default for Claude Desktop, Cursor, local tools).
26
+ */
27
+ startStdio(): Promise<void>;
28
+ /**
29
+ * Starts the server on HTTP / SSE transport (for remote or network clients).
30
+ */
31
+ startSse(port?: number, host?: string): Promise<{
32
+ app: any;
33
+ close: () => Promise<void>;
34
+ }>;
35
+ getToolRegistry(): ToolRegistry;
36
+ getUnderlyingServer(): Server;
37
+ }
38
+ //# sourceMappingURL=fridayy-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fridayy-server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/fridayy-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAYnE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,OAAO,EAAE,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAA8C;gBAEvD,OAAO,EAAE,oBAAoB;IA8BzC,OAAO,CAAC,gBAAgB;IA4CxB;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxC;;OAEG;IACU,QAAQ,CAAC,IAAI,SAAO,EAAE,IAAI,SAAc,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAmDlG,eAAe,IAAI,YAAY;IAI/B,mBAAmB,IAAI,MAAM;CAGrC"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Fridayy - Official Model Context Protocol (MCP) Server
3
+ * Implements standard MCP tools, resources, and prompts over Stdio and SSE transports.
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
8
+ import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema } from '@modelcontextprotocol/sdk/types.js';
9
+ import express from 'express';
10
+ import { ToolRegistry } from '../tools/tool-registry.js';
11
+ import { ToolHandler } from '../tools/tool-handler.js';
12
+ import { ResourceRegistry } from '../resources/resource-registry.js';
13
+ import { PromptRegistry } from '../prompts/prompt-registry.js';
14
+ import { defaultAdapterRegistry } from '../../adapters/registry.js';
15
+ export class FridayyMcpServer {
16
+ server;
17
+ config;
18
+ toolRegistry;
19
+ toolHandler;
20
+ resourceRegistry;
21
+ promptRegistry;
22
+ sseTransports = new Map();
23
+ constructor(options) {
24
+ this.config = options.config;
25
+ const serverName = options.config.server?.name || options.config.name || 'fridayy-mcp-server';
26
+ const serverVersion = options.config.server?.version || options.config.version || '1.0.0';
27
+ this.server = new Server({
28
+ name: serverName,
29
+ version: serverVersion
30
+ }, {
31
+ capabilities: {
32
+ tools: {},
33
+ resources: {},
34
+ prompts: {}
35
+ }
36
+ });
37
+ this.toolRegistry = new ToolRegistry(options.tools, options.config);
38
+ this.toolHandler = new ToolHandler({
39
+ config: options.config,
40
+ adapterRegistry: options.adapterRegistry || defaultAdapterRegistry
41
+ });
42
+ this.resourceRegistry = new ResourceRegistry(this.toolRegistry, options.config);
43
+ this.promptRegistry = new PromptRegistry();
44
+ this.registerHandlers();
45
+ }
46
+ registerHandlers() {
47
+ // 1. List Tools Handler
48
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
49
+ const exposedTools = this.toolRegistry.getExposedTools();
50
+ return {
51
+ tools: exposedTools.map(tool => ({
52
+ name: tool.name,
53
+ description: tool.description,
54
+ inputSchema: tool.inputSchema
55
+ }))
56
+ };
57
+ });
58
+ // 2. Call Tool Handler
59
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
60
+ const { name, arguments: args } = request.params;
61
+ return await this.toolHandler.handleCall(name, args || {}, this.toolRegistry);
62
+ });
63
+ // 3. List Resources Handler
64
+ this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
65
+ return {
66
+ resources: this.resourceRegistry.listResources()
67
+ };
68
+ });
69
+ // 4. Read Resource Handler
70
+ this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
71
+ return this.resourceRegistry.readResource(request.params.uri);
72
+ });
73
+ // 5. List Prompts Handler
74
+ this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
75
+ return {
76
+ prompts: this.promptRegistry.listPrompts()
77
+ };
78
+ });
79
+ // 6. Get Prompt Handler
80
+ this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
81
+ return this.promptRegistry.getPrompt(request.params.name, request.params.arguments);
82
+ });
83
+ }
84
+ /**
85
+ * Starts the server on Stdio transport (default for Claude Desktop, Cursor, local tools).
86
+ */
87
+ async startStdio() {
88
+ const transport = new StdioServerTransport();
89
+ await this.server.connect(transport);
90
+ }
91
+ /**
92
+ * Starts the server on HTTP / SSE transport (for remote or network clients).
93
+ */
94
+ async startSse(port = 3000, host = 'localhost') {
95
+ const app = express();
96
+ app.use(express.json());
97
+ // SSE endpoint
98
+ app.get('/sse', async (req, res) => {
99
+ const transport = new SSEServerTransport('/messages', res);
100
+ const sessionId = transport.sessionId;
101
+ this.sseTransports.set(sessionId, transport);
102
+ req.on('close', () => {
103
+ this.sseTransports.delete(sessionId);
104
+ });
105
+ await this.server.connect(transport);
106
+ });
107
+ // Message receiver endpoint
108
+ app.post('/messages', async (req, res) => {
109
+ const sessionId = req.query.sessionId;
110
+ const transport = this.sseTransports.get(sessionId);
111
+ if (!transport) {
112
+ res.status(404).json({ error: 'Session not found' });
113
+ return;
114
+ }
115
+ await transport.handlePostMessage(req, res);
116
+ });
117
+ // Health endpoint
118
+ app.get('/health', (req, res) => {
119
+ res.json({
120
+ status: 'healthy',
121
+ server: this.config.server?.name || this.config.name,
122
+ exposedToolsCount: this.toolRegistry.getExposedTools().length
123
+ });
124
+ });
125
+ return new Promise((resolve) => {
126
+ const serverInstance = app.listen(port, host, () => {
127
+ resolve({
128
+ app,
129
+ close: async () => {
130
+ await new Promise((r) => serverInstance.close(() => r()));
131
+ }
132
+ });
133
+ });
134
+ });
135
+ }
136
+ getToolRegistry() {
137
+ return this.toolRegistry;
138
+ }
139
+ getUnderlyingServer() {
140
+ return this.server;
141
+ }
142
+ }
143
+ //# sourceMappingURL=fridayy-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fridayy-server.js","sourceRoot":"","sources":["../../../src/mcp/server/fridayy-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Fridayy - MCP Tool Call Invocation Handler
3
+ * Enforces permissions, validates input, checks rate limits, executes adapters, and logs audits.
4
+ */
5
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
6
+ import { FridayyConfig } from '../../core/schema/types.js';
7
+ import { RateLimiter } from '../../security/rate-limiter.js';
8
+ import { AuditLogger } from '../../security/audit-logger.js';
9
+ import { AdapterRegistry } from '../../adapters/registry.js';
10
+ import { ToolRegistry } from './tool-registry.js';
11
+ export interface ToolHandlerOptions {
12
+ config?: FridayyConfig;
13
+ adapterRegistry?: AdapterRegistry;
14
+ rateLimiter?: RateLimiter;
15
+ auditLogger?: AuditLogger;
16
+ }
17
+ export declare class ToolHandler {
18
+ private config?;
19
+ private enforcer;
20
+ private adapterRegistry;
21
+ private rateLimiter;
22
+ private auditLogger;
23
+ constructor(options?: ToolHandlerOptions);
24
+ /**
25
+ * Handles a tool call from an MCP client.
26
+ */
27
+ handleCall(toolName: string, args: Record<string, any> | undefined, toolRegistry: ToolRegistry): Promise<CallToolResult>;
28
+ }
29
+ //# sourceMappingURL=tool-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-handler.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/tool-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAEL,aAAa,EAEd,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;gBAErB,OAAO,GAAE,kBAAuB;IAe5C;;OAEG;IACU,UAAU,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAK,EAC9B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,cAAc,CAAC;CAsL3B"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Fridayy - MCP Tool Call Invocation Handler
3
+ * Enforces permissions, validates input, checks rate limits, executes adapters, and logs audits.
4
+ */
5
+ import { PermissionEnforcer } from '../../core/permissions/enforcer.js';
6
+ import { validateToolInput } from '../../core/validation/validator.js';
7
+ import { RateLimiter } from '../../security/rate-limiter.js';
8
+ import { AuditLogger } from '../../security/audit-logger.js';
9
+ import { defaultAdapterRegistry } from '../../adapters/registry.js';
10
+ export class ToolHandler {
11
+ config;
12
+ enforcer;
13
+ adapterRegistry;
14
+ rateLimiter;
15
+ auditLogger;
16
+ constructor(options = {}) {
17
+ this.config = options.config;
18
+ this.enforcer = new PermissionEnforcer(options.config);
19
+ this.adapterRegistry = options.adapterRegistry || defaultAdapterRegistry;
20
+ this.rateLimiter =
21
+ options.rateLimiter ||
22
+ new RateLimiter(options.config?.security?.rateLimit || { maxRequests: 60, windowSeconds: 60 });
23
+ this.auditLogger =
24
+ options.auditLogger ||
25
+ new AuditLogger({
26
+ logFilePath: options.config?.logging?.auditLogPath,
27
+ maskSecrets: options.config?.logging?.maskSecrets ?? true
28
+ });
29
+ }
30
+ /**
31
+ * Handles a tool call from an MCP client.
32
+ */
33
+ async handleCall(toolName, args = {}, toolRegistry) {
34
+ const startTime = Date.now();
35
+ const tool = toolRegistry.get(toolName);
36
+ // 1. Check if tool exists
37
+ if (!tool) {
38
+ this.auditLogger.log({
39
+ timestamp: new Date().toISOString(),
40
+ toolName,
41
+ input: args,
42
+ result: { success: false, durationMs: Date.now() - startTime, error: 'TOOL_NOT_FOUND' }
43
+ });
44
+ return {
45
+ isError: true,
46
+ content: [
47
+ {
48
+ type: 'text',
49
+ text: JSON.stringify({
50
+ error: 'TOOL_NOT_FOUND',
51
+ message: `Tool "${toolName}" is not registered in Fridayy.`
52
+ }, null, 2)
53
+ }
54
+ ]
55
+ };
56
+ }
57
+ // 2. Permission & Approval Enforcement
58
+ try {
59
+ this.enforcer.validateExecution(tool);
60
+ }
61
+ catch (permErr) {
62
+ this.auditLogger.log({
63
+ timestamp: new Date().toISOString(),
64
+ toolName,
65
+ input: args,
66
+ result: { success: false, durationMs: Date.now() - startTime, error: permErr.code || permErr.message }
67
+ });
68
+ return {
69
+ isError: true,
70
+ content: [
71
+ {
72
+ type: 'text',
73
+ text: JSON.stringify({
74
+ error: permErr.code || 'PERMISSION_DENIED',
75
+ message: permErr.message,
76
+ toolStatus: tool.status,
77
+ risk: tool.risk,
78
+ permissions: tool.permissions
79
+ }, null, 2)
80
+ }
81
+ ]
82
+ };
83
+ }
84
+ // 3. Rate Limit Check
85
+ const rateLimitCheck = this.rateLimiter.checkLimit(toolName, tool.rateLimit);
86
+ if (!rateLimitCheck.allowed) {
87
+ this.auditLogger.log({
88
+ timestamp: new Date().toISOString(),
89
+ toolName,
90
+ input: args,
91
+ result: { success: false, durationMs: Date.now() - startTime, error: 'RATE_LIMIT_EXCEEDED' }
92
+ });
93
+ return {
94
+ isError: true,
95
+ content: [
96
+ {
97
+ type: 'text',
98
+ text: JSON.stringify({
99
+ error: 'RATE_LIMIT_EXCEEDED',
100
+ message: `Rate limit exceeded for tool "${toolName}". Retry in ${rateLimitCheck.retryAfterSeconds}s.`
101
+ }, null, 2)
102
+ }
103
+ ]
104
+ };
105
+ }
106
+ // 4. Input Validation
107
+ const validation = validateToolInput(tool, args);
108
+ if (!validation.valid) {
109
+ this.auditLogger.log({
110
+ timestamp: new Date().toISOString(),
111
+ toolName,
112
+ input: args,
113
+ result: { success: false, durationMs: Date.now() - startTime, error: 'INVALID_INPUT' }
114
+ });
115
+ return {
116
+ isError: true,
117
+ content: [
118
+ {
119
+ type: 'text',
120
+ text: JSON.stringify({
121
+ error: 'INVALID_INPUT',
122
+ message: `Invalid parameters provided for tool "${toolName}"`,
123
+ details: validation.errors
124
+ }, null, 2)
125
+ }
126
+ ]
127
+ };
128
+ }
129
+ // 5. Select Adapter
130
+ const sourceType = tool.source.type || 'openapi';
131
+ const adapter = this.adapterRegistry.get(sourceType);
132
+ if (!adapter) {
133
+ return {
134
+ isError: true,
135
+ content: [
136
+ {
137
+ type: 'text',
138
+ text: JSON.stringify({
139
+ error: 'ADAPTER_NOT_FOUND',
140
+ message: `No adapter registered for source type "${sourceType}"`
141
+ }, null, 2)
142
+ }
143
+ ]
144
+ };
145
+ }
146
+ // 6. Execute Tool via Adapter
147
+ try {
148
+ const result = await adapter.executeTool(tool, args, {
149
+ config: this.config
150
+ });
151
+ const durationMs = Date.now() - startTime;
152
+ this.auditLogger.log({
153
+ timestamp: new Date().toISOString(),
154
+ toolName,
155
+ input: args,
156
+ result: {
157
+ success: result.success,
158
+ statusCode: result.metadata?.statusCode,
159
+ durationMs,
160
+ error: result.error?.message
161
+ }
162
+ });
163
+ if (!result.success) {
164
+ return {
165
+ isError: true,
166
+ content: [
167
+ {
168
+ type: 'text',
169
+ text: JSON.stringify(result.error || { message: 'Execution failed' }, null, 2)
170
+ }
171
+ ]
172
+ };
173
+ }
174
+ return {
175
+ content: [
176
+ {
177
+ type: 'text',
178
+ text: typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2)
179
+ }
180
+ ]
181
+ };
182
+ }
183
+ catch (execErr) {
184
+ const durationMs = Date.now() - startTime;
185
+ this.auditLogger.log({
186
+ timestamp: new Date().toISOString(),
187
+ toolName,
188
+ input: args,
189
+ result: { success: false, durationMs, error: execErr.message }
190
+ });
191
+ return {
192
+ isError: true,
193
+ content: [
194
+ {
195
+ type: 'text',
196
+ text: JSON.stringify({
197
+ error: 'EXECUTION_ERROR',
198
+ message: execErr.message || 'An unexpected error occurred during execution'
199
+ }, null, 2)
200
+ }
201
+ ]
202
+ };
203
+ }
204
+ }
205
+ }
206
+ //# sourceMappingURL=tool-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-handler.js","sourceRoot":"","sources":["../../../src/mcp/tools/tool-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Fridayy - Tool Registry for MCP Server
3
+ * Manages active tools, visibility filtering, and runtime lookups.
4
+ */
5
+ import { FridayyToolDefinition, FridayyConfig } from '../../core/schema/types.js';
6
+ export declare class ToolRegistry {
7
+ private toolsMap;
8
+ private enforcer;
9
+ constructor(tools?: FridayyToolDefinition[], config?: FridayyConfig);
10
+ setTools(tools: FridayyToolDefinition[]): void;
11
+ register(tool: FridayyToolDefinition): void;
12
+ get(name: string): FridayyToolDefinition | undefined;
13
+ getAll(): FridayyToolDefinition[];
14
+ /**
15
+ * Returns only tools that are approved and allowed to be exposed to MCP clients.
16
+ */
17
+ getExposedTools(): FridayyToolDefinition[];
18
+ size(): number;
19
+ }
20
+ //# sourceMappingURL=tool-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/tool-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAGlF,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,KAAK,GAAE,qBAAqB,EAAO,EAAE,MAAM,CAAC,EAAE,aAAa;IAKhE,QAAQ,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,IAAI;IAO9C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAI3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIpD,MAAM,IAAI,qBAAqB,EAAE;IAIxC;;OAEG;IACI,eAAe,IAAI,qBAAqB,EAAE;IAI1C,IAAI,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Fridayy - Tool Registry for MCP Server
3
+ * Manages active tools, visibility filtering, and runtime lookups.
4
+ */
5
+ import { PermissionEnforcer } from '../../core/permissions/enforcer.js';
6
+ export class ToolRegistry {
7
+ toolsMap = new Map();
8
+ enforcer;
9
+ constructor(tools = [], config) {
10
+ this.enforcer = new PermissionEnforcer(config);
11
+ this.setTools(tools);
12
+ }
13
+ setTools(tools) {
14
+ this.toolsMap.clear();
15
+ for (const tool of tools) {
16
+ this.toolsMap.set(tool.name, tool);
17
+ }
18
+ }
19
+ register(tool) {
20
+ this.toolsMap.set(tool.name, tool);
21
+ }
22
+ get(name) {
23
+ return this.toolsMap.get(name);
24
+ }
25
+ getAll() {
26
+ return Array.from(this.toolsMap.values());
27
+ }
28
+ /**
29
+ * Returns only tools that are approved and allowed to be exposed to MCP clients.
30
+ */
31
+ getExposedTools() {
32
+ return this.getAll().filter(tool => this.enforcer.isToolExposed(tool));
33
+ }
34
+ size() {
35
+ return this.toolsMap.size;
36
+ }
37
+ }
38
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../../src/mcp/tools/tool-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,OAAO,YAAY;IACf,QAAQ,GAAuC,IAAI,GAAG,EAAE,CAAC;IACzD,QAAQ,CAAqB;IAErC,YAAY,QAAiC,EAAE,EAAE,MAAsB;QACrE,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEM,QAAQ,CAAC,KAA8B;QAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAEM,QAAQ,CAAC,IAA2B;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAEM,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEM,MAAM;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Fridayy - Allowlist & Denylist Filter
3
+ * Filters candidate tools using exact names and wildcard patterns.
4
+ */
5
+ export declare function matchesPattern(name: string, pattern: string): boolean;
6
+ export declare function isToolAllowed(toolName: string, options?: {
7
+ allowlist?: string[];
8
+ denylist?: string[];
9
+ }): boolean;
10
+ //# sourceMappingURL=allowlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../src/security/allowlist.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAOrE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC1D,OAAO,CAkBT"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Fridayy - Allowlist & Denylist Filter
3
+ * Filters candidate tools using exact names and wildcard patterns.
4
+ */
5
+ export function matchesPattern(name, pattern) {
6
+ if (pattern === '*')
7
+ return true;
8
+ if (pattern === name)
9
+ return true;
10
+ // Simple wildcard match (e.g. "get_*", "*_user")
11
+ const regexPattern = '^' + pattern.replace(/\*/g, '.*') + '$';
12
+ return new RegExp(regexPattern).test(name);
13
+ }
14
+ export function isToolAllowed(toolName, options = {}) {
15
+ const { allowlist, denylist } = options;
16
+ // Denylist has highest priority
17
+ if (denylist && denylist.length > 0) {
18
+ for (const pattern of denylist) {
19
+ if (matchesPattern(toolName, pattern)) {
20
+ return false;
21
+ }
22
+ }
23
+ }
24
+ // If allowlist is defined and non-empty, tool must match at least one pattern
25
+ if (allowlist && allowlist.length > 0) {
26
+ return allowlist.some(pattern => matchesPattern(toolName, pattern));
27
+ }
28
+ return true;
29
+ }
30
+ //# sourceMappingURL=allowlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowlist.js","sourceRoot":"","sources":["../../src/security/allowlist.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAC1D,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAElC,iDAAiD;IACjD,MAAM,YAAY,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;IAC9D,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,UAAyD,EAAE;IAE3D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAExC,gCAAgC;IAChC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Fridayy - Structured Audit Logger
3
+ * Records tool invocations, inputs, execution duration, and outcomes with secret masking.
4
+ */
5
+ export interface AuditLogEntry {
6
+ timestamp: string;
7
+ toolName: string;
8
+ input: any;
9
+ result?: {
10
+ success: boolean;
11
+ statusCode?: number;
12
+ durationMs: number;
13
+ error?: string;
14
+ };
15
+ client?: {
16
+ id?: string;
17
+ ip?: string;
18
+ userAgent?: string;
19
+ };
20
+ }
21
+ export declare class AuditLogger {
22
+ private logFilePath?;
23
+ private maskSecrets;
24
+ private consoleLogging;
25
+ constructor(options?: {
26
+ logFilePath?: string;
27
+ maskSecrets?: boolean;
28
+ consoleLogging?: boolean;
29
+ });
30
+ /**
31
+ * Logs a tool invocation event.
32
+ */
33
+ log(entry: AuditLogEntry): void;
34
+ }
35
+ //# sourceMappingURL=audit-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/security/audit-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,cAAc,CAAU;gBAEpB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO;IAanG;;OAEG;IACI,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CA6BvC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Fridayy - Structured Audit Logger
3
+ * Records tool invocations, inputs, execution duration, and outcomes with secret masking.
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import chalk from 'chalk';
8
+ import { sanitizeData } from './sanitizer.js';
9
+ export class AuditLogger {
10
+ logFilePath;
11
+ maskSecrets;
12
+ consoleLogging;
13
+ constructor(options = {}) {
14
+ this.logFilePath = options.logFilePath;
15
+ this.maskSecrets = options.maskSecrets ?? true;
16
+ this.consoleLogging = options.consoleLogging ?? false;
17
+ if (this.logFilePath) {
18
+ const dir = path.dirname(path.resolve(this.logFilePath));
19
+ if (!fs.existsSync(dir)) {
20
+ fs.mkdirSync(dir, { recursive: true });
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * Logs a tool invocation event.
26
+ */
27
+ log(entry) {
28
+ const sanitizedEntry = {
29
+ ...entry,
30
+ input: this.maskSecrets ? sanitizeData(entry.input) : entry.input
31
+ };
32
+ const jsonString = JSON.stringify(sanitizedEntry);
33
+ // File log
34
+ if (this.logFilePath) {
35
+ try {
36
+ fs.appendFileSync(this.logFilePath, jsonString + '\n', 'utf-8');
37
+ }
38
+ catch (err) {
39
+ // Fail silently on logging error to avoid breaking server
40
+ }
41
+ }
42
+ // Console log (if enabled or debug mode)
43
+ if (this.consoleLogging) {
44
+ const statusText = entry.result?.success
45
+ ? chalk.green('SUCCESS')
46
+ : chalk.red(`FAILED (${entry.result?.error || 'Unknown error'})`);
47
+ const duration = entry.result?.durationMs ? chalk.gray(`${entry.result.durationMs}ms`) : '';
48
+ console.error(`${chalk.gray(entry.timestamp)} ${chalk.cyan('[AUDIT]')} ${chalk.bold(entry.toolName)} → ${statusText} ${duration}`);
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=audit-logger.js.map