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,83 @@
1
+ /**
2
+ * Fridayy - HTTP Request Builder
3
+ * Interpolates URL path params, serializes query strings, and packages payloads for REST execution.
4
+ */
5
+ export function buildHttpRequest(tool, input = {}, baseUrlOverride) {
6
+ const method = (tool.source.method || 'GET').toUpperCase();
7
+ let rawPath = tool.source.path || tool.source.url || '/';
8
+ const baseUrl = baseUrlOverride || tool.source.baseUrl || 'http://localhost:3000';
9
+ const headers = {
10
+ 'Accept': 'application/json, text/plain, */*'
11
+ };
12
+ const queryParams = {};
13
+ let bodyPayload = undefined;
14
+ // Clone input to avoid mutating original
15
+ const remainingInput = { ...input };
16
+ // 1. Interpolate Path Parameters
17
+ const pathParamDefs = tool.parameters?.path || [];
18
+ for (const param of pathParamDefs) {
19
+ const val = remainingInput[param.name];
20
+ if (val !== undefined && val !== null) {
21
+ rawPath = rawPath.replace(new RegExp(`\\{${param.name}\\}|:${param.name}`, 'g'), encodeURIComponent(String(val)));
22
+ delete remainingInput[param.name];
23
+ }
24
+ }
25
+ // Also check any remaining path tokens in case they weren't in pathParamDefs
26
+ rawPath = rawPath.replace(/\{([a-zA-Z0-9_-]+)\}/g, (_, key) => {
27
+ if (remainingInput[key] !== undefined) {
28
+ const val = remainingInput[key];
29
+ delete remainingInput[key];
30
+ return encodeURIComponent(String(val));
31
+ }
32
+ return `{${key}}`;
33
+ });
34
+ // 2. Query Parameters
35
+ const queryParamDefs = tool.parameters?.query || [];
36
+ for (const param of queryParamDefs) {
37
+ if (remainingInput[param.name] !== undefined && remainingInput[param.name] !== null) {
38
+ queryParams[param.name] = String(remainingInput[param.name]);
39
+ delete remainingInput[param.name];
40
+ }
41
+ }
42
+ // 3. Header Parameters
43
+ const headerParamDefs = tool.parameters?.header || [];
44
+ for (const param of headerParamDefs) {
45
+ if (remainingInput[param.name] !== undefined && remainingInput[param.name] !== null) {
46
+ headers[param.name] = String(remainingInput[param.name]);
47
+ delete remainingInput[param.name];
48
+ }
49
+ }
50
+ // 4. Request Body
51
+ if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {
52
+ if (remainingInput['body'] !== undefined) {
53
+ bodyPayload = remainingInput['body'];
54
+ }
55
+ else if (Object.keys(remainingInput).length > 0) {
56
+ // Any remaining fields become the JSON body payload
57
+ bodyPayload = remainingInput;
58
+ }
59
+ }
60
+ // Build full URL
61
+ const cleanBase = baseUrl.replace(/\/+$/, '');
62
+ const cleanPath = rawPath.startsWith('/') ? rawPath : `/${rawPath}`;
63
+ let fullUrl = `${cleanBase}${cleanPath}`;
64
+ // Append query string if any
65
+ const searchParams = new URLSearchParams(queryParams);
66
+ const queryString = searchParams.toString();
67
+ if (queryString) {
68
+ fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryString;
69
+ }
70
+ // Serialize Body
71
+ let bodyString;
72
+ if (bodyPayload !== undefined) {
73
+ headers['Content-Type'] = 'application/json';
74
+ bodyString = typeof bodyPayload === 'string' ? bodyPayload : JSON.stringify(bodyPayload);
75
+ }
76
+ return {
77
+ url: fullUrl,
78
+ method,
79
+ headers,
80
+ body: bodyString
81
+ };
82
+ }
83
+ //# sourceMappingURL=request-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-builder.js","sourceRoot":"","sources":["../../../src/adapters/openapi/request-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Fridayy - Adapter Registry
3
+ * Central repository for pluggable application adapters.
4
+ */
5
+ import { BaseAdapter } from './base.js';
6
+ export declare class AdapterRegistry {
7
+ private adapters;
8
+ constructor();
9
+ private registerDefaults;
10
+ /**
11
+ * Registers a new adapter instance.
12
+ */
13
+ register(adapter: BaseAdapter): void;
14
+ /**
15
+ * Retrieves an adapter by name.
16
+ */
17
+ get(name: string): BaseAdapter | undefined;
18
+ /**
19
+ * Returns all registered adapters.
20
+ */
21
+ getAll(): BaseAdapter[];
22
+ /**
23
+ * Checks if an adapter is registered.
24
+ */
25
+ has(name: string): boolean;
26
+ }
27
+ export declare const defaultAdapterRegistry: AdapterRegistry;
28
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAuC;;IAMvD,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACI,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAI3C;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIjD;;OAEG;IACI,MAAM,IAAI,WAAW,EAAE;IAI9B;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGlC;AAED,eAAO,MAAM,sBAAsB,iBAAwB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Fridayy - Adapter Registry
3
+ * Central repository for pluggable application adapters.
4
+ */
5
+ import { OpenApiAdapter } from './openapi/adapter.js';
6
+ import { RestAdapter } from './rest/adapter.js';
7
+ import { NodeJsAdapter } from './nodejs/adapter.js';
8
+ import { ManualAdapter } from './manual/adapter.js';
9
+ export class AdapterRegistry {
10
+ adapters = new Map();
11
+ constructor() {
12
+ this.registerDefaults();
13
+ }
14
+ registerDefaults() {
15
+ this.register(new OpenApiAdapter());
16
+ this.register(new RestAdapter());
17
+ this.register(new NodeJsAdapter());
18
+ this.register(new ManualAdapter());
19
+ }
20
+ /**
21
+ * Registers a new adapter instance.
22
+ */
23
+ register(adapter) {
24
+ this.adapters.set(adapter.name.toLowerCase(), adapter);
25
+ }
26
+ /**
27
+ * Retrieves an adapter by name.
28
+ */
29
+ get(name) {
30
+ return this.adapters.get(name.toLowerCase());
31
+ }
32
+ /**
33
+ * Returns all registered adapters.
34
+ */
35
+ getAll() {
36
+ return Array.from(this.adapters.values());
37
+ }
38
+ /**
39
+ * Checks if an adapter is registered.
40
+ */
41
+ has(name) {
42
+ return this.adapters.has(name.toLowerCase());
43
+ }
44
+ }
45
+ export const defaultAdapterRegistry = new AdapterRegistry();
46
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,eAAe;IAClB,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;IAEvD;QACE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,OAAoB;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,MAAM;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,eAAe,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Fridayy - Generic REST Adapter
3
+ * Adapter for executing and declaring arbitrary REST endpoints.
4
+ */
5
+ import { BaseAdapter, AdapterScanContext, AdapterGenerationContext, AdapterExecutionContext } from '../base.js';
6
+ import { FridayyToolDefinition, ToolExecutionResult } from '../../core/schema/types.js';
7
+ export declare class RestAdapter extends BaseAdapter {
8
+ readonly name = "rest";
9
+ readonly description = "Adapter for REST APIs and custom HTTP endpoints";
10
+ private restExecutor;
11
+ detect(context: AdapterScanContext): Promise<{
12
+ detected: boolean;
13
+ details?: any;
14
+ }>;
15
+ generateTools(context: AdapterGenerationContext): Promise<FridayyToolDefinition[]>;
16
+ executeTool(tool: FridayyToolDefinition, input: Record<string, any>, context?: AdapterExecutionContext): Promise<ToolExecutionResult>;
17
+ }
18
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAMpC,qBAAa,WAAY,SAAQ,WAAW;IAC1C,SAAgB,IAAI,UAAU;IAC9B,SAAgB,WAAW,qDAAqD;IAEhF,OAAO,CAAC,YAAY,CAAuB;IAE9B,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAQlF,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAKlF,WAAW,CACtB,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,mBAAmB,CAAC;CAmBhC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Fridayy - Generic REST Adapter
3
+ * Adapter for executing and declaring arbitrary REST endpoints.
4
+ */
5
+ import { BaseAdapter } from '../base.js';
6
+ import { buildHttpRequest } from '../openapi/request-builder.js';
7
+ import { defaultRestExecutor } from './executor.js';
8
+ import { AuthenticationManager } from '../../core/authentication/manager.js';
9
+ import { defaultSecretResolver } from '../../core/authentication/secret-resolver.js';
10
+ export class RestAdapter extends BaseAdapter {
11
+ name = 'rest';
12
+ description = 'Adapter for REST APIs and custom HTTP endpoints';
13
+ restExecutor = defaultRestExecutor;
14
+ async detect(context) {
15
+ const hasBaseUrl = Boolean(context.config?.source?.baseUrl || context.config?.source?.url);
16
+ return {
17
+ detected: hasBaseUrl,
18
+ details: { baseUrl: context.config?.source?.baseUrl }
19
+ };
20
+ }
21
+ async generateTools(context) {
22
+ // REST adapter returns tools defined in config or manual definitions
23
+ return [];
24
+ }
25
+ async executeTool(tool, input, context = {}) {
26
+ const authManager = new AuthenticationManager(context.config);
27
+ const baseUrl = defaultSecretResolver.resolveBaseUrl(context.config?.source?.baseUrl);
28
+ const preparedReq = buildHttpRequest(tool, input, baseUrl);
29
+ if (context.headers) {
30
+ Object.assign(preparedReq.headers, context.headers);
31
+ }
32
+ authManager.applyAuth(tool.authentication, {
33
+ headers: preparedReq.headers,
34
+ queryParams: {}
35
+ });
36
+ return await this.restExecutor.execute(preparedReq, tool.name, {
37
+ timeoutMs: context.timeoutMs
38
+ });
39
+ }
40
+ }
41
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/rest/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EAIZ,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAErF,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1B,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,iDAAiD,CAAC;IAExE,YAAY,GAAG,mBAAmB,CAAC;IAEpC,KAAK,CAAC,MAAM,CAAC,OAA2B;QAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3F,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;SACtD,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAiC;QAC1D,qEAAqE;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,IAA2B,EAC3B,KAA0B,EAC1B,UAAmC,EAAE;QAErC,MAAM,WAAW,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEtF,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAE3D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QAED,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE;YACzC,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QAEH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;YAC7D,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Fridayy - REST API Executor
3
+ * Executes HTTP requests with timeout, error handling, and structured response parsing.
4
+ */
5
+ import { ToolExecutionResult } from '../../core/schema/types.js';
6
+ import { PreparedHttpRequest } from '../openapi/request-builder.js';
7
+ export interface RestExecutorOptions {
8
+ timeoutMs?: number;
9
+ }
10
+ export declare class RestExecutor {
11
+ private defaultTimeoutMs;
12
+ constructor(options?: RestExecutorOptions);
13
+ /**
14
+ * Executes a prepared HTTP request.
15
+ */
16
+ execute(request: PreparedHttpRequest, toolName: string, options?: RestExecutorOptions): Promise<ToolExecutionResult>;
17
+ }
18
+ export declare const defaultRestExecutor: RestExecutor;
19
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/adapters/rest/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAS;gBAErB,OAAO,GAAE,mBAAwB;IAI7C;;OAEG;IACU,OAAO,CAClB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC;CA2FhC;AAED,eAAO,MAAM,mBAAmB,cAAqB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Fridayy - REST API Executor
3
+ * Executes HTTP requests with timeout, error handling, and structured response parsing.
4
+ */
5
+ export class RestExecutor {
6
+ defaultTimeoutMs;
7
+ constructor(options = {}) {
8
+ this.defaultTimeoutMs = options.timeoutMs || 30000;
9
+ }
10
+ /**
11
+ * Executes a prepared HTTP request.
12
+ */
13
+ async execute(request, toolName, options = {}) {
14
+ const startTime = Date.now();
15
+ const timeoutMs = options.timeoutMs || this.defaultTimeoutMs;
16
+ const controller = new AbortController();
17
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
18
+ try {
19
+ const response = await fetch(request.url, {
20
+ method: request.method,
21
+ headers: request.headers,
22
+ body: request.body,
23
+ signal: controller.signal
24
+ });
25
+ clearTimeout(timeoutId);
26
+ const durationMs = Date.now() - startTime;
27
+ const contentType = response.headers.get('content-type') || '';
28
+ let responseData;
29
+ if (contentType.includes('application/json')) {
30
+ try {
31
+ responseData = await response.json();
32
+ }
33
+ catch {
34
+ responseData = await response.text();
35
+ }
36
+ }
37
+ else {
38
+ responseData = await response.text();
39
+ }
40
+ if (!response.ok) {
41
+ return {
42
+ success: false,
43
+ error: {
44
+ code: `HTTP_${response.status}`,
45
+ message: `API returned HTTP ${response.status} ${response.statusText}`,
46
+ details: responseData
47
+ },
48
+ metadata: {
49
+ statusCode: response.status,
50
+ durationMs,
51
+ timestamp: new Date().toISOString(),
52
+ toolName
53
+ }
54
+ };
55
+ }
56
+ return {
57
+ success: true,
58
+ data: responseData,
59
+ metadata: {
60
+ statusCode: response.status,
61
+ durationMs,
62
+ timestamp: new Date().toISOString(),
63
+ toolName
64
+ }
65
+ };
66
+ }
67
+ catch (err) {
68
+ clearTimeout(timeoutId);
69
+ const durationMs = Date.now() - startTime;
70
+ if (err.name === 'AbortError') {
71
+ return {
72
+ success: false,
73
+ error: {
74
+ code: 'REQUEST_TIMEOUT',
75
+ message: `Request timed out after ${timeoutMs}ms: ${request.method} ${request.url}`
76
+ },
77
+ metadata: {
78
+ durationMs,
79
+ timestamp: new Date().toISOString(),
80
+ toolName
81
+ }
82
+ };
83
+ }
84
+ return {
85
+ success: false,
86
+ error: {
87
+ code: 'NETWORK_ERROR',
88
+ message: `Network error invoking ${request.method} ${request.url}: ${err.message}`,
89
+ details: err.stack
90
+ },
91
+ metadata: {
92
+ durationMs,
93
+ timestamp: new Date().toISOString(),
94
+ toolName
95
+ }
96
+ };
97
+ }
98
+ }
99
+ }
100
+ export const defaultRestExecutor = new RestExecutor();
101
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/adapters/rest/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Config Command
3
+ * Views, gets, sets, and validates Fridayy configuration.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerConfigCommand(program: Command): void;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D5D"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Fridayy - Config Command
3
+ * Views, gets, sets, and validates Fridayy configuration.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { defaultConfigManager } from '../../config/config-manager.js';
7
+ import { printBanner } from '../ui/banner.js';
8
+ import { logger } from '../ui/logger.js';
9
+ export function registerConfigCommand(program) {
10
+ const configCmd = program
11
+ .command('config')
12
+ .description('View or modify Fridayy configuration')
13
+ .action(async () => {
14
+ printBanner();
15
+ const rootDir = process.cwd();
16
+ if (!defaultConfigManager.configExists(rootDir)) {
17
+ logger.error('No configuration found. Run `fridayy init` first.');
18
+ return;
19
+ }
20
+ const config = defaultConfigManager.loadConfig(rootDir);
21
+ console.log(chalk.bold('Active Configuration (fridayy.config.json):\n'));
22
+ console.log(JSON.stringify(config, null, 2) + '\n');
23
+ });
24
+ configCmd
25
+ .command('get <key>')
26
+ .description('Get a specific configuration property')
27
+ .action((key) => {
28
+ const rootDir = process.cwd();
29
+ if (!defaultConfigManager.configExists(rootDir)) {
30
+ logger.error('No configuration found.');
31
+ return;
32
+ }
33
+ const config = defaultConfigManager.loadConfig(rootDir);
34
+ const val = getNestedValue(config, key);
35
+ if (val === undefined) {
36
+ console.log(chalk.gray('undefined'));
37
+ }
38
+ else if (typeof val === 'object') {
39
+ console.log(JSON.stringify(val, null, 2));
40
+ }
41
+ else {
42
+ console.log(String(val));
43
+ }
44
+ });
45
+ configCmd
46
+ .command('set <key> <val>')
47
+ .description('Set a specific configuration property')
48
+ .action((key, val) => {
49
+ const rootDir = process.cwd();
50
+ if (!defaultConfigManager.configExists(rootDir)) {
51
+ logger.error('No configuration found.');
52
+ return;
53
+ }
54
+ const config = defaultConfigManager.loadConfig(rootDir);
55
+ let parsedVal = val;
56
+ if (val === 'true')
57
+ parsedVal = true;
58
+ else if (val === 'false')
59
+ parsedVal = false;
60
+ else if (!isNaN(Number(val)))
61
+ parsedVal = Number(val);
62
+ setNestedValue(config, key, parsedVal);
63
+ defaultConfigManager.saveConfig(config, rootDir);
64
+ logger.success(`Updated ${chalk.cyan(key)} = ${chalk.bold(String(parsedVal))}`);
65
+ });
66
+ }
67
+ function getNestedValue(obj, pathStr) {
68
+ const parts = pathStr.split('.');
69
+ let curr = obj;
70
+ for (const p of parts) {
71
+ if (curr && typeof curr === 'object' && p in curr) {
72
+ curr = curr[p];
73
+ }
74
+ else {
75
+ return undefined;
76
+ }
77
+ }
78
+ return curr;
79
+ }
80
+ function setNestedValue(obj, pathStr, value) {
81
+ const parts = pathStr.split('.');
82
+ let curr = obj;
83
+ for (let i = 0; i < parts.length - 1; i++) {
84
+ const p = parts[i];
85
+ if (!curr[p] || typeof curr[p] !== 'object') {
86
+ curr[p] = {};
87
+ }
88
+ curr = curr[p];
89
+ }
90
+ curr[parts[parts.length - 1]] = value;
91
+ }
92
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fridayy - Doctor Command
3
+ * Diagnoses project configuration, environment variables, target API connectivity, and permissions.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerDoctorCommand(program: Command): void;
7
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8H5D"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Fridayy - Doctor Command
3
+ * Diagnoses project configuration, environment variables, target API connectivity, and permissions.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { defaultConfigManager } from '../../config/config-manager.js';
7
+ import { defaultSecretResolver } from '../../core/authentication/secret-resolver.js';
8
+ import { printBanner } from '../ui/banner.js';
9
+ import { logger } from '../ui/logger.js';
10
+ export function registerDoctorCommand(program) {
11
+ program
12
+ .command('doctor')
13
+ .description('Check configuration, dependencies, secrets, and API connectivity')
14
+ .action(async () => {
15
+ printBanner();
16
+ const rootDir = process.cwd();
17
+ console.log(chalk.bold('Running Fridayy Health & Diagnostic Checks...\n'));
18
+ let passedCount = 0;
19
+ let warnCount = 0;
20
+ let errorCount = 0;
21
+ // 1. Check config file
22
+ let config;
23
+ if (defaultConfigManager.configExists(rootDir)) {
24
+ try {
25
+ config = defaultConfigManager.loadConfig(rootDir);
26
+ console.log(chalk.green('✓') + ' Configuration: fridayy.config.json is valid');
27
+ passedCount++;
28
+ }
29
+ catch (err) {
30
+ console.log(chalk.red('✖') + ` Configuration error: ${err.message}`);
31
+ errorCount++;
32
+ }
33
+ }
34
+ else {
35
+ console.log(chalk.red('✖') + ' Configuration: fridayy.config.json not found (run `fridayy init`)');
36
+ errorCount++;
37
+ }
38
+ // 2. Check tools file
39
+ const tools = defaultConfigManager.loadTools(rootDir);
40
+ if (tools.length > 0) {
41
+ console.log(chalk.green('✓') + ` Tools Definition: fridayy.tools.json found with ${tools.length} tools`);
42
+ passedCount++;
43
+ }
44
+ else {
45
+ console.log(chalk.yellow('⚠') + ' Tools Definition: fridayy.tools.json is empty or not generated (run `fridayy generate`)');
46
+ warnCount++;
47
+ }
48
+ // 3. Check Approval Breakdown & Destructive Safety
49
+ if (tools.length > 0) {
50
+ const approved = tools.filter(t => t.status === 'APPROVED').length;
51
+ const pending = tools.filter(t => t.status === 'PENDING').length;
52
+ const blocked = tools.filter(t => t.status === 'BLOCKED').length;
53
+ const destructive = tools.filter(t => t.permissions.type === 'DESTRUCTIVE');
54
+ const approvedDestructive = destructive.filter(t => t.status === 'APPROVED');
55
+ console.log(chalk.green('✓') + ` Tool Status Breakdown: ${approved} approved, ${pending} pending, ${blocked} blocked`);
56
+ passedCount++;
57
+ if (destructive.length > 0) {
58
+ if (approvedDestructive.length > 0) {
59
+ console.log(chalk.yellow('⚠') +
60
+ ` Security: ${approvedDestructive.length} DESTRUCTIVE tool(s) explicitly APPROVED for LLM invocation: [${approvedDestructive.map(t => t.name).join(', ')}]`);
61
+ warnCount++;
62
+ }
63
+ else {
64
+ console.log(chalk.green('✓') +
65
+ ` Security: All ${destructive.length} DESTRUCTIVE tool(s) are safely BLOCKED pending explicit review`);
66
+ passedCount++;
67
+ }
68
+ }
69
+ }
70
+ // 4. Check Environment Variables & Secrets
71
+ if (tools.length > 0) {
72
+ const authSchemes = tools
73
+ .filter(t => t.authentication?.required)
74
+ .map(t => t.authentication);
75
+ const requiredEnvVars = defaultSecretResolver.getRequiredEnvVars(authSchemes);
76
+ if (requiredEnvVars.length > 0) {
77
+ const missingVars = requiredEnvVars.filter(v => !process.env[v]);
78
+ if (missingVars.length === 0) {
79
+ console.log(chalk.green('✓') + ` Environment Secrets: All required auth variables present [${requiredEnvVars.join(', ')}]`);
80
+ passedCount++;
81
+ }
82
+ else {
83
+ console.log(chalk.yellow('⚠') +
84
+ ` Environment Secrets: Missing auth variable(s): [${chalk.bold(missingVars.join(', '))}]. Requests requiring authentication will fail until set.`);
85
+ warnCount++;
86
+ }
87
+ }
88
+ else {
89
+ console.log(chalk.green('✓') + ' Environment Secrets: No mandatory secrets required for active tools');
90
+ passedCount++;
91
+ }
92
+ }
93
+ // 5. Target API Connectivity Check
94
+ const baseUrl = defaultSecretResolver.resolveBaseUrl(config?.source?.baseUrl);
95
+ if (baseUrl) {
96
+ try {
97
+ const controller = new AbortController();
98
+ const timeoutId = setTimeout(() => controller.abort(), 3000);
99
+ const res = await fetch(baseUrl, { method: 'HEAD', signal: controller.signal }).catch(() => null);
100
+ clearTimeout(timeoutId);
101
+ if (res) {
102
+ console.log(chalk.green('✓') + ` Target API Connectivity: Successfully reached ${baseUrl} (HTTP ${res.status})`);
103
+ passedCount++;
104
+ }
105
+ else {
106
+ console.log(chalk.yellow('⚠') + ` Target API Connectivity: Could not reach ${baseUrl} (server may be offline or local dev server)`);
107
+ warnCount++;
108
+ }
109
+ }
110
+ catch {
111
+ console.log(chalk.yellow('⚠') + ` Target API Connectivity: Connection to ${baseUrl} timed out`);
112
+ warnCount++;
113
+ }
114
+ }
115
+ console.log('\n' + chalk.bold('Doctor Summary:'));
116
+ console.log(` ${chalk.green(`✓ ${passedCount} passed`)}, ${chalk.yellow(`⚠ ${warnCount} warnings`)}, ${chalk.red(`✖ ${errorCount} errors`)}\n`);
117
+ if (errorCount === 0) {
118
+ logger.success('Fridayy environment is healthy and ready for MCP clients!');
119
+ }
120
+ else {
121
+ logger.warn('Please address the error(s) above before starting the server.');
122
+ }
123
+ console.log('');
124
+ });
125
+ }
126
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,WAAW,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAE3E,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,uBAAuB;QACvB,IAAI,MAAW,CAAC;QAChB,IAAI,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,8CAA8C,CAAC,CAAC;gBAC/E,WAAW,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrE,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,oEAAoE,CAAC,CAAC;YACnG,UAAU,EAAE,CAAC;QACf,CAAC;QAED,sBAAsB;QACtB,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,oDAAoD,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YACzG,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,0FAA0F,CAAC,CAAC;YAC5H,SAAS,EAAE,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;YACnE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;YAC5E,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YAE7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,QAAQ,cAAc,OAAO,aAAa,OAAO,UAAU,CAAC,CAAC;YACvH,WAAW,EAAE,CAAC;YAEd,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;wBACf,cAAc,mBAAmB,CAAC,MAAM,iEAAiE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9J,CAAC;oBACF,SAAS,EAAE,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;wBACd,kBAAkB,WAAW,CAAC,MAAM,iEAAiE,CACxG,CAAC;oBACF,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,KAAK;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,QAAQ,CAAC;iBACvC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAe,CAAC,CAAC;YAE/B,MAAM,eAAe,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC9E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,8DAA8D,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC5H,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;wBACf,oDAAoD,KAAK,CAAC,IAAI,CAC5D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,2DAA2D,CAC/D,CAAC;oBACF,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sEAAsE,CAAC,CAAC;gBACvG,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClG,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kDAAkD,OAAO,UAAU,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;oBACjH,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,6CAA6C,OAAO,8CAA8C,CAAC,CAAC;oBACpI,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,2CAA2C,OAAO,YAAY,CAAC,CAAC;gBAChG,SAAS,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,WAAW,SAAS,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,WAAW,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,SAAS,CAAC,IAAI,CAAC,CAAC;QAEjJ,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}