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,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 @@
|
|
|
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":"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"}
|