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.
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/bin/fridayy.js +12 -0
- package/dist/adapters/base.d.ts +40 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +7 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/manual/adapter.d.ts +18 -0
- package/dist/adapters/manual/adapter.d.ts.map +1 -0
- package/dist/adapters/manual/adapter.js +52 -0
- package/dist/adapters/manual/adapter.js.map +1 -0
- package/dist/adapters/nodejs/adapter.d.ts +19 -0
- package/dist/adapters/nodejs/adapter.d.ts.map +1 -0
- package/dist/adapters/nodejs/adapter.js +135 -0
- package/dist/adapters/nodejs/adapter.js.map +1 -0
- package/dist/adapters/nodejs/ast-scanner.d.ts +21 -0
- package/dist/adapters/nodejs/ast-scanner.d.ts.map +1 -0
- package/dist/adapters/nodejs/ast-scanner.js +102 -0
- package/dist/adapters/nodejs/ast-scanner.js.map +1 -0
- package/dist/adapters/openapi/adapter.d.ts +22 -0
- package/dist/adapters/openapi/adapter.d.ts.map +1 -0
- package/dist/adapters/openapi/adapter.js +271 -0
- package/dist/adapters/openapi/adapter.js.map +1 -0
- package/dist/adapters/openapi/parser.d.ts +30 -0
- package/dist/adapters/openapi/parser.d.ts.map +1 -0
- package/dist/adapters/openapi/parser.js +136 -0
- package/dist/adapters/openapi/parser.js.map +1 -0
- package/dist/adapters/openapi/request-builder.d.ts +13 -0
- package/dist/adapters/openapi/request-builder.d.ts.map +1 -0
- package/dist/adapters/openapi/request-builder.js +83 -0
- package/dist/adapters/openapi/request-builder.js.map +1 -0
- package/dist/adapters/registry.d.ts +28 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +46 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/rest/adapter.d.ts +18 -0
- package/dist/adapters/rest/adapter.d.ts.map +1 -0
- package/dist/adapters/rest/adapter.js +41 -0
- package/dist/adapters/rest/adapter.js.map +1 -0
- package/dist/adapters/rest/executor.d.ts +19 -0
- package/dist/adapters/rest/executor.d.ts.map +1 -0
- package/dist/adapters/rest/executor.js +101 -0
- package/dist/adapters/rest/executor.js.map +1 -0
- package/dist/cli/commands/config.d.ts +7 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +92 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +7 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +126 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +7 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +58 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +54 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/review.d.ts +7 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +151 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +7 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +77 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +54 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/tools.d.ts +7 -0
- package/dist/cli/commands/tools.d.ts.map +1 -0
- package/dist/cli/commands/tools.js +48 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +42 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/banner.d.ts +6 -0
- package/dist/cli/ui/banner.d.ts.map +1 -0
- package/dist/cli/ui/banner.js +20 -0
- package/dist/cli/ui/banner.js.map +1 -0
- package/dist/cli/ui/logger.d.ts +12 -0
- package/dist/cli/ui/logger.d.ts.map +1 -0
- package/dist/cli/ui/logger.js +13 -0
- package/dist/cli/ui/logger.js.map +1 -0
- package/dist/cli/ui/tables.d.ts +9 -0
- package/dist/cli/ui/tables.d.ts.map +1 -0
- package/dist/cli/ui/tables.js +72 -0
- package/dist/cli/ui/tables.js.map +1 -0
- package/dist/config/config-manager.d.ts +37 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +129 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/defaults.d.ts +8 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +37 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/core/authentication/manager.d.ts +20 -0
- package/dist/core/authentication/manager.d.ts.map +1 -0
- package/dist/core/authentication/manager.js +71 -0
- package/dist/core/authentication/manager.js.map +1 -0
- package/dist/core/authentication/secret-resolver.d.ts +39 -0
- package/dist/core/authentication/secret-resolver.d.ts.map +1 -0
- package/dist/core/authentication/secret-resolver.js +89 -0
- package/dist/core/authentication/secret-resolver.js.map +1 -0
- package/dist/core/discovery/index.d.ts +5 -0
- package/dist/core/discovery/index.d.ts.map +1 -0
- package/dist/core/discovery/index.js +5 -0
- package/dist/core/discovery/index.js.map +1 -0
- package/dist/core/discovery/project-scanner.d.ts +20 -0
- package/dist/core/discovery/project-scanner.d.ts.map +1 -0
- package/dist/core/discovery/project-scanner.js +174 -0
- package/dist/core/discovery/project-scanner.js.map +1 -0
- package/dist/core/permissions/classifier.d.ts +25 -0
- package/dist/core/permissions/classifier.d.ts.map +1 -0
- package/dist/core/permissions/classifier.js +92 -0
- package/dist/core/permissions/classifier.js.map +1 -0
- package/dist/core/permissions/enforcer.d.ts +24 -0
- package/dist/core/permissions/enforcer.d.ts.map +1 -0
- package/dist/core/permissions/enforcer.js +71 -0
- package/dist/core/permissions/enforcer.js.map +1 -0
- package/dist/core/schema/json-schema.d.ts +29 -0
- package/dist/core/schema/json-schema.d.ts.map +1 -0
- package/dist/core/schema/json-schema.js +129 -0
- package/dist/core/schema/json-schema.js.map +1 -0
- package/dist/core/schema/types.d.ts +187 -0
- package/dist/core/schema/types.d.ts.map +1 -0
- package/dist/core/schema/types.js +6 -0
- package/dist/core/schema/types.js.map +1 -0
- package/dist/core/tool-generator/description-builder.d.ts +15 -0
- package/dist/core/tool-generator/description-builder.d.ts.map +1 -0
- package/dist/core/tool-generator/description-builder.js +32 -0
- package/dist/core/tool-generator/description-builder.js.map +1 -0
- package/dist/core/tool-generator/generator.d.ts +21 -0
- package/dist/core/tool-generator/generator.d.ts.map +1 -0
- package/dist/core/tool-generator/generator.js +61 -0
- package/dist/core/tool-generator/generator.js.map +1 -0
- package/dist/core/tool-generator/name-sanitizer.d.ts +21 -0
- package/dist/core/tool-generator/name-sanitizer.d.ts.map +1 -0
- package/dist/core/tool-generator/name-sanitizer.js +84 -0
- package/dist/core/tool-generator/name-sanitizer.js.map +1 -0
- package/dist/core/validation/config-schema.d.ts +1458 -0
- package/dist/core/validation/config-schema.d.ts.map +1 -0
- package/dist/core/validation/config-schema.js +137 -0
- package/dist/core/validation/config-schema.js.map +1 -0
- package/dist/core/validation/validator.d.ts +28 -0
- package/dist/core/validation/validator.d.ts.map +1 -0
- package/dist/core/validation/validator.js +108 -0
- package/dist/core/validation/validator.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/prompts/prompt-registry.d.ts +28 -0
- package/dist/mcp/prompts/prompt-registry.d.ts.map +1 -0
- package/dist/mcp/prompts/prompt-registry.js +65 -0
- package/dist/mcp/prompts/prompt-registry.js.map +1 -0
- package/dist/mcp/resources/resource-registry.d.ts +26 -0
- package/dist/mcp/resources/resource-registry.d.ts.map +1 -0
- package/dist/mcp/resources/resource-registry.js +87 -0
- package/dist/mcp/resources/resource-registry.js.map +1 -0
- package/dist/mcp/server/fridayy-server.d.ts +38 -0
- package/dist/mcp/server/fridayy-server.d.ts.map +1 -0
- package/dist/mcp/server/fridayy-server.js +143 -0
- package/dist/mcp/server/fridayy-server.js.map +1 -0
- package/dist/mcp/tools/tool-handler.d.ts +29 -0
- package/dist/mcp/tools/tool-handler.d.ts.map +1 -0
- package/dist/mcp/tools/tool-handler.js +206 -0
- package/dist/mcp/tools/tool-handler.js.map +1 -0
- package/dist/mcp/tools/tool-registry.d.ts +20 -0
- package/dist/mcp/tools/tool-registry.d.ts.map +1 -0
- package/dist/mcp/tools/tool-registry.js +38 -0
- package/dist/mcp/tools/tool-registry.js.map +1 -0
- package/dist/security/allowlist.d.ts +10 -0
- package/dist/security/allowlist.d.ts.map +1 -0
- package/dist/security/allowlist.js +30 -0
- package/dist/security/allowlist.js.map +1 -0
- package/dist/security/audit-logger.d.ts +35 -0
- package/dist/security/audit-logger.d.ts.map +1 -0
- package/dist/security/audit-logger.js +52 -0
- package/dist/security/audit-logger.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +28 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +64 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/sanitizer.d.ts +17 -0
- package/dist/security/sanitizer.d.ts.map +1 -0
- package/dist/security/sanitizer.js +70 -0
- package/dist/security/sanitizer.js.map +1 -0
- 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"}
|