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,102 @@
1
+ /**
2
+ * Fridayy - Node.js Route Scanner
3
+ * Scans JavaScript and TypeScript files for Express/Fastify/Koa route declarations.
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ const ROUTE_PATTERN = /(?:app|router|fastify|server)\.(get|post|put|patch|delete|options|head)\s*\(\s*(['"`])([^'"`]+)\2/g;
8
+ export class NodeJsScanner {
9
+ /**
10
+ * Scans a directory recursively for Express/Fastify routes.
11
+ */
12
+ async scanDirectory(rootDir, maxFiles = 200) {
13
+ const discovered = [];
14
+ const files = this.collectSourceFiles(rootDir, maxFiles);
15
+ for (const file of files) {
16
+ try {
17
+ const content = fs.readFileSync(file, 'utf-8');
18
+ const fileRoutes = this.scanFileContent(content, file);
19
+ discovered.push(...fileRoutes);
20
+ }
21
+ catch {
22
+ // Skip unreadable files
23
+ }
24
+ }
25
+ return discovered;
26
+ }
27
+ scanFileContent(content, filePath) {
28
+ const routes = [];
29
+ const lines = content.split('\n');
30
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
31
+ const line = lines[lineIndex];
32
+ ROUTE_PATTERN.lastIndex = 0;
33
+ let match;
34
+ while ((match = ROUTE_PATTERN.exec(line)) !== null) {
35
+ const method = match[1].toUpperCase();
36
+ const routePath = match[3];
37
+ // Extract comment from previous lines
38
+ let comment;
39
+ if (lineIndex > 0) {
40
+ const prevLine = lines[lineIndex - 1].trim();
41
+ if (prevLine.startsWith('//')) {
42
+ comment = prevLine.replace(/^\/\/\s*/, '');
43
+ }
44
+ else if (prevLine.endsWith('*/')) {
45
+ // Find start of JSDoc block
46
+ let jsDocStart = lineIndex - 1;
47
+ while (jsDocStart > 0 && !lines[jsDocStart].includes('/**')) {
48
+ jsDocStart--;
49
+ }
50
+ const block = lines.slice(jsDocStart, lineIndex).join('\n');
51
+ const summaryMatch = block.match(/@summary\s+([^\n*]+)/i) || block.match(/\*\s*([^*@\n/]+)/);
52
+ if (summaryMatch) {
53
+ comment = summaryMatch[1].trim();
54
+ }
55
+ }
56
+ }
57
+ // Extract path parameters like :id or :userId
58
+ const pathParams = (routePath.match(/:[a-zA-Z0-9_]+/g) || []).map(p => p.slice(1));
59
+ routes.push({
60
+ method,
61
+ path: routePath,
62
+ file: filePath,
63
+ line: lineIndex + 1,
64
+ description: comment,
65
+ pathParams
66
+ });
67
+ }
68
+ }
69
+ return routes;
70
+ }
71
+ collectSourceFiles(dir, maxFiles, collected = []) {
72
+ if (!fs.existsSync(dir))
73
+ return collected;
74
+ if (collected.length >= maxFiles)
75
+ return collected;
76
+ try {
77
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
78
+ for (const entry of entries) {
79
+ if (collected.length >= maxFiles)
80
+ break;
81
+ const fullPath = path.join(dir, entry.name);
82
+ if (entry.isDirectory()) {
83
+ // Ignore heavy or irrelevant folders
84
+ if (!['node_modules', 'dist', '.git', '.gemini', 'coverage', 'build', '.next'].includes(entry.name)) {
85
+ this.collectSourceFiles(fullPath, maxFiles, collected);
86
+ }
87
+ }
88
+ else if (entry.isFile()) {
89
+ const ext = path.extname(entry.name).toLowerCase();
90
+ if (['.js', '.ts', '.mjs', '.cjs'].includes(ext) && !entry.name.endsWith('.d.ts') && !entry.name.includes('.test.')) {
91
+ collected.push(fullPath);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ catch {
97
+ // Ignore permission errors
98
+ }
99
+ return collected;
100
+ }
101
+ }
102
+ //# sourceMappingURL=ast-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-scanner.js","sourceRoot":"","sources":["../../../src/adapters/nodejs/ast-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Fridayy - OpenAPI Adapter
3
+ * Converts OpenAPI/Swagger specifications into standard Fridayy tool definitions and executes them.
4
+ */
5
+ import { BaseAdapter, AdapterScanContext, AdapterGenerationContext, AdapterExecutionContext } from '../base.js';
6
+ import { FridayyToolDefinition, ToolExecutionResult } from '../../core/schema/types.js';
7
+ export declare class OpenApiAdapter extends BaseAdapter {
8
+ readonly name = "openapi";
9
+ readonly description = "Adapter for OpenAPI 3.0, 3.1, and Swagger 2.0 specifications";
10
+ private parser;
11
+ private restExecutor;
12
+ detect(context: AdapterScanContext): Promise<{
13
+ detected: boolean;
14
+ details?: any;
15
+ }>;
16
+ generateTools(context: AdapterGenerationContext): Promise<FridayyToolDefinition[]>;
17
+ executeTool(tool: FridayyToolDefinition, input: Record<string, any>, context?: AdapterExecutionContext): Promise<ToolExecutionResult>;
18
+ private extractParameters;
19
+ private extractRequestBody;
20
+ private extractSecurity;
21
+ }
22
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/openapi/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EAIrB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAWpC,qBAAa,cAAe,SAAQ,WAAW;IAC7C,SAAgB,IAAI,aAAa;IACjC,SAAgB,WAAW,kEAAkE;IAE7F,OAAO,CAAC,MAAM,CAAuB;IACrC,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;IA6BlF,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAgIlF,WAAW,CACtB,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,mBAAmB,CAAC;IAwB/B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,eAAe;CA2DxB"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Fridayy - OpenAPI Adapter
3
+ * Converts OpenAPI/Swagger specifications into standard Fridayy tool definitions and executes them.
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { BaseAdapter } from '../base.js';
8
+ import { OpenApiParser } from './parser.js';
9
+ import { buildUnifiedInputSchema } from '../../core/schema/json-schema.js';
10
+ import { sanitizeToolName, generateToolNameFromRoute } from '../../core/tool-generator/name-sanitizer.js';
11
+ import { buildToolDescription } from '../../core/tool-generator/description-builder.js';
12
+ import { classifyOperation } from '../../core/permissions/classifier.js';
13
+ import { buildHttpRequest } from './request-builder.js';
14
+ import { defaultRestExecutor } from '../rest/executor.js';
15
+ import { AuthenticationManager } from '../../core/authentication/manager.js';
16
+ import { defaultSecretResolver } from '../../core/authentication/secret-resolver.js';
17
+ export class OpenApiAdapter extends BaseAdapter {
18
+ name = 'openapi';
19
+ description = 'Adapter for OpenAPI 3.0, 3.1, and Swagger 2.0 specifications';
20
+ parser = new OpenApiParser();
21
+ restExecutor = defaultRestExecutor;
22
+ async detect(context) {
23
+ const rootDir = context.rootDir;
24
+ const candidates = [
25
+ 'openapi.yaml',
26
+ 'openapi.yml',
27
+ 'openapi.json',
28
+ 'swagger.yaml',
29
+ 'swagger.yml',
30
+ 'swagger.json',
31
+ 'api/openapi.yaml',
32
+ 'api/openapi.json',
33
+ 'docs/openapi.yaml',
34
+ 'docs/openapi.json'
35
+ ];
36
+ const foundFiles = [];
37
+ for (const rel of candidates) {
38
+ const full = path.resolve(rootDir, rel);
39
+ if (fs.existsSync(full)) {
40
+ foundFiles.push(rel);
41
+ }
42
+ }
43
+ return {
44
+ detected: foundFiles.length > 0,
45
+ details: { foundFiles }
46
+ };
47
+ }
48
+ async generateTools(context) {
49
+ const rootDir = context.rootDir || process.cwd();
50
+ let specSource = context.sourcePath || context.config?.source?.path || 'openapi.yaml';
51
+ const spec = await this.parser.parse(specSource, rootDir);
52
+ const tools = [];
53
+ const serverBaseUrl = defaultSecretResolver.resolveBaseUrl(context.config?.source?.baseUrl) ||
54
+ spec.servers[0]?.url ||
55
+ 'http://localhost:3000';
56
+ const usedToolNames = new Set();
57
+ for (const [routePath, pathItem] of Object.entries(spec.paths)) {
58
+ if (!pathItem || typeof pathItem !== 'object')
59
+ continue;
60
+ const httpMethods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
61
+ const pathLevelParams = this.extractParameters(pathItem.parameters);
62
+ for (const method of httpMethods) {
63
+ const operation = pathItem[method];
64
+ if (!operation || typeof operation !== 'object')
65
+ continue;
66
+ // Extract parameters
67
+ const opParams = this.extractParameters(operation.parameters);
68
+ const allParams = [...pathLevelParams, ...opParams];
69
+ const pathParams = allParams.filter(p => p.in === 'path');
70
+ const queryParams = allParams.filter(p => p.in === 'query');
71
+ const headerParams = allParams.filter(p => p.in === 'header');
72
+ const cookieParams = allParams.filter(p => p.in === 'cookie');
73
+ // Extract request body
74
+ const requestBody = this.extractRequestBody(operation.requestBody, operation);
75
+ // Generate tool name
76
+ let toolName = operation.operationId
77
+ ? sanitizeToolName(operation.operationId)
78
+ : generateToolNameFromRoute(method, routePath);
79
+ // Ensure unique tool names
80
+ if (usedToolNames.has(toolName)) {
81
+ let suffix = 2;
82
+ while (usedToolNames.has(`${toolName}_${suffix}`)) {
83
+ suffix++;
84
+ }
85
+ toolName = `${toolName}_${suffix}`;
86
+ }
87
+ usedToolNames.add(toolName);
88
+ // Classify permissions
89
+ const classification = classifyOperation({
90
+ method,
91
+ path: routePath,
92
+ operationId: operation.operationId,
93
+ name: toolName,
94
+ summary: operation.summary,
95
+ description: operation.description,
96
+ tags: operation.tags
97
+ }, context.config);
98
+ // Build description
99
+ const description = buildToolDescription({
100
+ summary: operation.summary,
101
+ description: operation.description,
102
+ method,
103
+ path: routePath,
104
+ tags: operation.tags,
105
+ permissionType: classification.permissions.type,
106
+ risk: classification.risk
107
+ });
108
+ // Build unified input schema
109
+ const inputSchema = buildUnifiedInputSchema({
110
+ parameters: {
111
+ path: pathParams,
112
+ query: queryParams,
113
+ header: headerParams,
114
+ cookie: cookieParams
115
+ },
116
+ requestBody
117
+ });
118
+ // Determine authentication requirement
119
+ const auth = this.extractSecurity(operation.security || spec.rawDoc.security, spec.securityDefinitions);
120
+ const tool = {
121
+ id: `tool_${toolName}`,
122
+ name: toolName,
123
+ description,
124
+ inputSchema,
125
+ source: {
126
+ type: 'openapi',
127
+ method: method.toUpperCase(),
128
+ path: routePath,
129
+ baseUrl: serverBaseUrl,
130
+ operationId: operation.operationId,
131
+ tags: operation.tags,
132
+ summary: operation.summary
133
+ },
134
+ parameters: {
135
+ path: pathParams,
136
+ query: queryParams,
137
+ header: headerParams,
138
+ cookie: cookieParams
139
+ },
140
+ requestBody,
141
+ authentication: auth,
142
+ permissions: classification.permissions,
143
+ risk: classification.risk,
144
+ status: classification.status,
145
+ metadata: {
146
+ createdAt: new Date().toISOString(),
147
+ autoGenerated: true,
148
+ sourceFile: specSource
149
+ }
150
+ };
151
+ tools.push(tool);
152
+ }
153
+ }
154
+ return tools;
155
+ }
156
+ async executeTool(tool, input, context = {}) {
157
+ const authManager = new AuthenticationManager(context.config);
158
+ const baseUrl = defaultSecretResolver.resolveBaseUrl(context.config?.source?.baseUrl);
159
+ // Build base request
160
+ const preparedReq = buildHttpRequest(tool, input, baseUrl);
161
+ // Apply custom execution context headers
162
+ if (context.headers) {
163
+ Object.assign(preparedReq.headers, context.headers);
164
+ }
165
+ // Apply authentication
166
+ authManager.applyAuth(tool.authentication, {
167
+ headers: preparedReq.headers,
168
+ queryParams: {}
169
+ });
170
+ // Execute via REST executor
171
+ return await this.restExecutor.execute(preparedReq, tool.name, {
172
+ timeoutMs: context.timeoutMs
173
+ });
174
+ }
175
+ extractParameters(rawParams) {
176
+ if (!rawParams || !Array.isArray(rawParams))
177
+ return [];
178
+ return rawParams.map((p) => ({
179
+ name: p.name,
180
+ in: p.in || 'query',
181
+ required: p.required ?? p.in === 'path',
182
+ description: p.description,
183
+ schema: p.schema || { type: p.type || 'string' },
184
+ example: p.example
185
+ }));
186
+ }
187
+ extractRequestBody(rawBody, operation) {
188
+ // OpenAPI 3.x
189
+ if (rawBody && rawBody.content) {
190
+ const contentTypes = Object.keys(rawBody.content);
191
+ const primaryType = contentTypes.find(t => t.includes('json')) || contentTypes[0] || 'application/json';
192
+ const contentDef = rawBody.content[primaryType];
193
+ return {
194
+ contentType: primaryType,
195
+ required: rawBody.required ?? false,
196
+ description: rawBody.description,
197
+ schema: contentDef?.schema || { type: 'object' },
198
+ example: contentDef?.example
199
+ };
200
+ }
201
+ // Swagger 2.0 (body parameter)
202
+ if (operation && operation.parameters && Array.isArray(operation.parameters)) {
203
+ const bodyParam = operation.parameters.find((p) => p.in === 'body');
204
+ if (bodyParam) {
205
+ return {
206
+ contentType: 'application/json',
207
+ required: bodyParam.required ?? false,
208
+ description: bodyParam.description,
209
+ schema: bodyParam.schema || { type: 'object' },
210
+ example: bodyParam.example
211
+ };
212
+ }
213
+ }
214
+ return undefined;
215
+ }
216
+ extractSecurity(opSecurity, securityDefinitions) {
217
+ if (!opSecurity || !Array.isArray(opSecurity) || opSecurity.length === 0) {
218
+ return undefined;
219
+ }
220
+ const firstSec = opSecurity[0];
221
+ const schemeName = Object.keys(firstSec)[0];
222
+ if (!schemeName)
223
+ return undefined;
224
+ const schemeDef = securityDefinitions?.[schemeName];
225
+ if (!schemeDef) {
226
+ return {
227
+ required: true,
228
+ schemeName,
229
+ type: 'apiKey'
230
+ };
231
+ }
232
+ if (schemeDef.type === 'http') {
233
+ if (schemeDef.scheme === 'bearer') {
234
+ return {
235
+ required: true,
236
+ type: 'bearer',
237
+ schemeName
238
+ };
239
+ }
240
+ if (schemeDef.scheme === 'basic') {
241
+ return {
242
+ required: true,
243
+ type: 'basic',
244
+ schemeName
245
+ };
246
+ }
247
+ }
248
+ if (schemeDef.type === 'apiKey') {
249
+ return {
250
+ required: true,
251
+ type: 'apiKey',
252
+ schemeName,
253
+ headerName: schemeDef.in === 'header' ? schemeDef.name : undefined,
254
+ queryParam: schemeDef.in === 'query' ? schemeDef.name : undefined
255
+ };
256
+ }
257
+ if (schemeDef.type === 'oauth2') {
258
+ return {
259
+ required: true,
260
+ type: 'oauth2',
261
+ schemeName
262
+ };
263
+ }
264
+ return {
265
+ required: true,
266
+ schemeName,
267
+ type: 'apiKey'
268
+ };
269
+ }
270
+ }
271
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/openapi/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Fridayy - OpenAPI / Swagger Specification Parser & $ref Resolver
3
+ * Supports OpenAPI 3.0.x, 3.1.x, and Swagger 2.0 (YAML & JSON).
4
+ */
5
+ export interface ParsedOpenApiSpec {
6
+ version: string;
7
+ title: string;
8
+ description?: string;
9
+ servers: Array<{
10
+ url: string;
11
+ description?: string;
12
+ }>;
13
+ paths: Record<string, any>;
14
+ components?: Record<string, any>;
15
+ securityDefinitions?: Record<string, any>;
16
+ rawDoc: any;
17
+ }
18
+ export declare class OpenApiParser {
19
+ /**
20
+ * Loads and parses an OpenAPI document from a file path, URL, or raw string.
21
+ */
22
+ parse(sourcePathOrContent: string, rootDir?: string): Promise<ParsedOpenApiSpec>;
23
+ /**
24
+ * Resolves internal $ref pointers (e.g., #/components/schemas/User)
25
+ */
26
+ resolveRefs(current: any, root: any, visited?: Set<string>): any;
27
+ private lookupRef;
28
+ private normalizeSpec;
29
+ }
30
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/adapters/openapi/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,CAAC;CACb;AAED,qBAAa,aAAa;IACxB;;OAEG;IACU,KAAK,CAAC,mBAAmB,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgD5G;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,cAAoB,GAAG,GAAG;IAmC7E,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,aAAa;CAqCtB"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Fridayy - OpenAPI / Swagger Specification Parser & $ref Resolver
3
+ * Supports OpenAPI 3.0.x, 3.1.x, and Swagger 2.0 (YAML & JSON).
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import YAML from 'yaml';
8
+ export class OpenApiParser {
9
+ /**
10
+ * Loads and parses an OpenAPI document from a file path, URL, or raw string.
11
+ */
12
+ async parse(sourcePathOrContent, rootDir = process.cwd()) {
13
+ let rawContent;
14
+ let filePath;
15
+ if (sourcePathOrContent.startsWith('http://') || sourcePathOrContent.startsWith('https://')) {
16
+ const res = await fetch(sourcePathOrContent);
17
+ if (!res.ok) {
18
+ throw new Error(`Failed to fetch OpenAPI spec from ${sourcePathOrContent}: ${res.status} ${res.statusText}`);
19
+ }
20
+ rawContent = await res.text();
21
+ }
22
+ else if (sourcePathOrContent.trim().startsWith('{') ||
23
+ sourcePathOrContent.trim().startsWith('openapi:') ||
24
+ sourcePathOrContent.trim().startsWith('swagger:')) {
25
+ rawContent = sourcePathOrContent;
26
+ }
27
+ else {
28
+ filePath = path.isAbsolute(sourcePathOrContent)
29
+ ? sourcePathOrContent
30
+ : path.resolve(rootDir, sourcePathOrContent);
31
+ if (!fs.existsSync(filePath)) {
32
+ throw new Error(`OpenAPI specification file not found: ${filePath}`);
33
+ }
34
+ rawContent = fs.readFileSync(filePath, 'utf-8');
35
+ }
36
+ let parsed;
37
+ try {
38
+ if (rawContent.trim().startsWith('{')) {
39
+ parsed = JSON.parse(rawContent);
40
+ }
41
+ else {
42
+ parsed = YAML.parse(rawContent);
43
+ }
44
+ }
45
+ catch (err) {
46
+ throw new Error(`Failed to parse OpenAPI file as JSON/YAML: ${err.message}`);
47
+ }
48
+ if (!parsed || typeof parsed !== 'object') {
49
+ throw new Error('Invalid OpenAPI document: document must be an object.');
50
+ }
51
+ // Resolve all internal $ref references
52
+ const resolvedDoc = this.resolveRefs(parsed, parsed);
53
+ return this.normalizeSpec(resolvedDoc);
54
+ }
55
+ /**
56
+ * Resolves internal $ref pointers (e.g., #/components/schemas/User)
57
+ */
58
+ resolveRefs(current, root, visited = new Set()) {
59
+ if (current === null || current === undefined) {
60
+ return current;
61
+ }
62
+ if (Array.isArray(current)) {
63
+ return current.map(item => this.resolveRefs(item, root, visited));
64
+ }
65
+ if (typeof current === 'object') {
66
+ if (current.$ref && typeof current.$ref === 'string') {
67
+ const ref = current.$ref;
68
+ if (ref.startsWith('#/')) {
69
+ if (visited.has(ref)) {
70
+ // Circular reference detected; return placeholder or shallow copy to prevent infinite loop
71
+ return { type: 'object', description: `[Circular Ref: ${ref}]` };
72
+ }
73
+ visited.add(ref);
74
+ const resolved = this.lookupRef(ref, root);
75
+ const deepResolved = this.resolveRefs(resolved, root, new Set(visited));
76
+ visited.delete(ref);
77
+ return deepResolved;
78
+ }
79
+ }
80
+ const result = {};
81
+ for (const [key, val] of Object.entries(current)) {
82
+ result[key] = this.resolveRefs(val, root, visited);
83
+ }
84
+ return result;
85
+ }
86
+ return current;
87
+ }
88
+ lookupRef(ref, root) {
89
+ const parts = ref.replace(/^#\//, '').split('/');
90
+ let current = root;
91
+ for (const part of parts) {
92
+ const unescaped = part.replace(/~1/g, '/').replace(/~0/g, '~');
93
+ if (current && typeof current === 'object' && unescaped in current) {
94
+ current = current[unescaped];
95
+ }
96
+ else {
97
+ return { type: 'object', description: `[Unresolved Ref: ${ref}]` };
98
+ }
99
+ }
100
+ return current;
101
+ }
102
+ normalizeSpec(doc) {
103
+ const isSwagger2 = doc.swagger && doc.swagger.startsWith('2.');
104
+ const version = doc.openapi || doc.swagger || '3.0.0';
105
+ const title = doc.info?.title || 'API Specification';
106
+ const description = doc.info?.description;
107
+ const servers = [];
108
+ if (doc.servers && Array.isArray(doc.servers)) {
109
+ servers.push(...doc.servers);
110
+ }
111
+ else if (isSwagger2) {
112
+ const scheme = doc.schemes?.[0] || 'http';
113
+ const host = doc.host || 'localhost';
114
+ const basePath = doc.basePath || '';
115
+ servers.push({ url: `${scheme}://${host}${basePath}` });
116
+ }
117
+ if (servers.length === 0) {
118
+ servers.push({ url: 'http://localhost:3000' });
119
+ }
120
+ const components = doc.components || {
121
+ schemas: doc.definitions || {},
122
+ securitySchemes: doc.securityDefinitions || {}
123
+ };
124
+ return {
125
+ version,
126
+ title,
127
+ description,
128
+ servers,
129
+ paths: doc.paths || {},
130
+ components,
131
+ securityDefinitions: doc.securityDefinitions || doc.components?.securitySchemes,
132
+ rawDoc: doc
133
+ };
134
+ }
135
+ }
136
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/adapters/openapi/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Fridayy - HTTP Request Builder
3
+ * Interpolates URL path params, serializes query strings, and packages payloads for REST execution.
4
+ */
5
+ import { FridayyToolDefinition } from '../../core/schema/types.js';
6
+ export interface PreparedHttpRequest {
7
+ url: string;
8
+ method: string;
9
+ headers: Record<string, string>;
10
+ body?: string;
11
+ }
12
+ export declare function buildHttpRequest(tool: FridayyToolDefinition, input?: Record<string, any>, baseUrlOverride?: string): PreparedHttpRequest;
13
+ //# sourceMappingURL=request-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-builder.d.ts","sourceRoot":"","sources":["../../../src/adapters/openapi/request-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,qBAAqB,EAC3B,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC/B,eAAe,CAAC,EAAE,MAAM,GACvB,mBAAmB,CA0FrB"}