fridayy 1.2.1 → 1.3.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/README.md +61 -3
- package/dist/adapters/laravel/adapter.d.ts +21 -0
- package/dist/adapters/laravel/adapter.d.ts.map +1 -0
- package/dist/adapters/laravel/adapter.js +133 -0
- package/dist/adapters/laravel/adapter.js.map +1 -0
- package/dist/adapters/laravel/route-scanner.d.ts +39 -0
- package/dist/adapters/laravel/route-scanner.d.ts.map +1 -0
- package/dist/adapters/laravel/route-scanner.js +238 -0
- package/dist/adapters/laravel/route-scanner.js.map +1 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +2 -0
- package/dist/adapters/registry.js.map +1 -1
- package/dist/adapters/rest/adapter.d.ts.map +1 -1
- package/dist/adapters/rest/adapter.js +7 -1
- package/dist/adapters/rest/adapter.js.map +1 -1
- package/dist/adapters/rest/executor.d.ts.map +1 -1
- package/dist/adapters/rest/executor.js +1 -2
- package/dist/adapters/rest/executor.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +27 -3
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +61 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +8 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/secrets.d.ts +9 -0
- package/dist/cli/commands/secrets.d.ts.map +1 -0
- package/dist/cli/commands/secrets.js +50 -0
- package/dist/cli/commands/secrets.js.map +1 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +14 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +26 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui/banner.d.ts.map +1 -1
- package/dist/cli/ui/banner.js +2 -1
- package/dist/cli/ui/banner.js.map +1 -1
- package/dist/config/credentials-store.d.ts +24 -0
- package/dist/config/credentials-store.d.ts.map +1 -0
- package/dist/config/credentials-store.js +73 -0
- package/dist/config/credentials-store.js.map +1 -0
- package/dist/config/global-dir.d.ts +21 -0
- package/dist/config/global-dir.d.ts.map +1 -0
- package/dist/config/global-dir.js +34 -0
- package/dist/config/global-dir.js.map +1 -0
- package/dist/config/package-info.d.ts +8 -0
- package/dist/config/package-info.d.ts.map +1 -0
- package/dist/config/package-info.js +27 -0
- package/dist/config/package-info.js.map +1 -0
- package/dist/core/authentication/secret-resolver.d.ts +11 -2
- package/dist/core/authentication/secret-resolver.d.ts.map +1 -1
- package/dist/core/authentication/secret-resolver.js +18 -3
- package/dist/core/authentication/secret-resolver.js.map +1 -1
- package/dist/core/discovery/project-scanner.d.ts +1 -0
- package/dist/core/discovery/project-scanner.d.ts.map +1 -1
- package/dist/core/discovery/project-scanner.js +31 -1
- package/dist/core/discovery/project-scanner.js.map +1 -1
- package/dist/core/permissions/classifier.js +3 -3
- package/dist/core/permissions/classifier.js.map +1 -1
- package/dist/core/permissions/enforcer.d.ts +10 -0
- package/dist/core/permissions/enforcer.d.ts.map +1 -1
- package/dist/core/permissions/enforcer.js +16 -0
- package/dist/core/permissions/enforcer.js.map +1 -1
- package/dist/core/schema/types.d.ts +5 -2
- package/dist/core/schema/types.d.ts.map +1 -1
- package/dist/core/validation/config-schema.d.ts +10 -5
- package/dist/core/validation/config-schema.d.ts.map +1 -1
- package/dist/core/validation/config-schema.js +3 -2
- package/dist/core/validation/config-schema.js.map +1 -1
- package/dist/mcp/server/fridayy-server.d.ts +8 -1
- package/dist/mcp/server/fridayy-server.d.ts.map +1 -1
- package/dist/mcp/server/fridayy-server.js +29 -1
- package/dist/mcp/server/fridayy-server.js.map +1 -1
- package/dist/mcp/tools/tool-handler.d.ts.map +1 -1
- package/dist/mcp/tools/tool-handler.js +35 -0
- package/dist/mcp/tools/tool-handler.js.map +1 -1
- package/dist/security/audit-logger.d.ts.map +1 -1
- package/dist/security/audit-logger.js +4 -1
- package/dist/security/audit-logger.js.map +1 -1
- package/dist/security/sanitizer.d.ts.map +1 -1
- package/dist/security/sanitizer.js +26 -5
- package/dist/security/sanitizer.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fridayy - Global Credentials Store
|
|
3
|
+
* Reads/writes a per-user credentials file (see global-dir.ts) so secrets can be
|
|
4
|
+
* configured once per device and reused across every Fridayy project, instead of
|
|
5
|
+
* being duplicated in plaintext inside per-project fridayy.config.json files.
|
|
6
|
+
*
|
|
7
|
+
* This is a plain JSON file, not an OS keychain — it is restricted to the
|
|
8
|
+
* current user via filesystem permissions (chmod 600 on POSIX) but is not
|
|
9
|
+
* encrypted at rest. Prefer real environment variables / a secrets manager for
|
|
10
|
+
* production deployments.
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { getGlobalCredentialsPath } from './global-dir.js';
|
|
15
|
+
export class CredentialsStore {
|
|
16
|
+
filePath;
|
|
17
|
+
constructor(filePath = getGlobalCredentialsPath()) {
|
|
18
|
+
this.filePath = filePath;
|
|
19
|
+
}
|
|
20
|
+
getPath() {
|
|
21
|
+
return this.filePath;
|
|
22
|
+
}
|
|
23
|
+
load() {
|
|
24
|
+
if (!fs.existsSync(this.filePath)) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const raw = fs.readFileSync(this.filePath, 'utf-8');
|
|
29
|
+
const parsed = JSON.parse(raw);
|
|
30
|
+
return parsed && typeof parsed === 'object' ? parsed : {};
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// A corrupt or unreadable credentials file must never crash secret
|
|
34
|
+
// resolution; treat it as empty and let env vars / config still work.
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
get(key) {
|
|
39
|
+
return this.load()[key];
|
|
40
|
+
}
|
|
41
|
+
set(key, value) {
|
|
42
|
+
const dir = path.dirname(this.filePath);
|
|
43
|
+
if (!fs.existsSync(dir)) {
|
|
44
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
const store = this.load();
|
|
47
|
+
store[key] = value;
|
|
48
|
+
fs.writeFileSync(this.filePath, JSON.stringify(store, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
49
|
+
// Ensure permissions are tightened even if the file already existed with
|
|
50
|
+
// looser permissions (writeFileSync's `mode` only applies when creating).
|
|
51
|
+
try {
|
|
52
|
+
fs.chmodSync(this.filePath, 0o600);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Best-effort on platforms (e.g. Windows) where POSIX chmod semantics
|
|
56
|
+
// don't apply; the directory/file are still user-scoped by their location.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
remove(key) {
|
|
60
|
+
const store = this.load();
|
|
61
|
+
if (!(key in store)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
delete store[key];
|
|
65
|
+
fs.writeFileSync(this.filePath, JSON.stringify(store, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
list() {
|
|
69
|
+
return Object.keys(this.load());
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export const defaultCredentialsStore = new CredentialsStore();
|
|
73
|
+
//# sourceMappingURL=credentials-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../src/config/credentials-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAI3D,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,WAAmB,wBAAwB,EAAE;QAA7C,aAAQ,GAAR,QAAQ,CAAqC;IAAG,CAAC;IAEvE,OAAO;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,sEAAsE;YACtE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,KAAa;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpG,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,2EAA2E;QAC7E,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,GAAW;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,IAAI;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fridayy - Cross-Platform Global Directory Resolver
|
|
3
|
+
* Resolves an OS-appropriate, per-user directory for Fridayy state that should
|
|
4
|
+
* be shared across projects on the same machine (e.g. credentials), following
|
|
5
|
+
* each platform's own convention instead of assuming a POSIX-style home layout.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Returns the OS-appropriate root directory for per-user application config:
|
|
9
|
+
* - Windows: %APPDATA% (falls back to <home>/AppData/Roaming)
|
|
10
|
+
* - macOS: <home>/Library/Application Support
|
|
11
|
+
* - Linux/other: $XDG_CONFIG_HOME (falls back to <home>/.config)
|
|
12
|
+
*/
|
|
13
|
+
export declare function getGlobalConfigDir(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Path to the global credentials store shared across every Fridayy project on
|
|
16
|
+
* this device. Intended as a safer alternative to embedding `auth.*.value`
|
|
17
|
+
* secrets directly inside a per-project fridayy.config.json (which is easy to
|
|
18
|
+
* accidentally commit to source control).
|
|
19
|
+
*/
|
|
20
|
+
export declare function getGlobalCredentialsPath(): string;
|
|
21
|
+
//# sourceMappingURL=global-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-dir.d.ts","sourceRoot":"","sources":["../../src/config/global-dir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fridayy - Cross-Platform Global Directory Resolver
|
|
3
|
+
* Resolves an OS-appropriate, per-user directory for Fridayy state that should
|
|
4
|
+
* be shared across projects on the same machine (e.g. credentials), following
|
|
5
|
+
* each platform's own convention instead of assuming a POSIX-style home layout.
|
|
6
|
+
*/
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
/**
|
|
10
|
+
* Returns the OS-appropriate root directory for per-user application config:
|
|
11
|
+
* - Windows: %APPDATA% (falls back to <home>/AppData/Roaming)
|
|
12
|
+
* - macOS: <home>/Library/Application Support
|
|
13
|
+
* - Linux/other: $XDG_CONFIG_HOME (falls back to <home>/.config)
|
|
14
|
+
*/
|
|
15
|
+
export function getGlobalConfigDir() {
|
|
16
|
+
const home = os.homedir();
|
|
17
|
+
if (process.platform === 'win32') {
|
|
18
|
+
return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), 'fridayy');
|
|
19
|
+
}
|
|
20
|
+
if (process.platform === 'darwin') {
|
|
21
|
+
return path.join(home, 'Library', 'Application Support', 'fridayy');
|
|
22
|
+
}
|
|
23
|
+
return path.join(process.env.XDG_CONFIG_HOME || path.join(home, '.config'), 'fridayy');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Path to the global credentials store shared across every Fridayy project on
|
|
27
|
+
* this device. Intended as a safer alternative to embedding `auth.*.value`
|
|
28
|
+
* secrets directly inside a per-project fridayy.config.json (which is easy to
|
|
29
|
+
* accidentally commit to source control).
|
|
30
|
+
*/
|
|
31
|
+
export function getGlobalCredentialsPath() {
|
|
32
|
+
return path.join(getGlobalConfigDir(), 'credentials.json');
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=global-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-dir.js","sourceRoot":"","sources":["../../src/config/global-dir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AACzF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fridayy - Package Metadata Reader
|
|
3
|
+
* Reads the CLI's own version from package.json at runtime, so the version
|
|
4
|
+
* displayed by `--version` and the banner can never drift out of sync with a
|
|
5
|
+
* hardcoded string left behind after a release bump.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getPackageVersion(): string;
|
|
8
|
+
//# sourceMappingURL=package-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../../src/config/package-info.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,iBAAiB,IAAI,MAAM,CAgB1C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fridayy - Package Metadata Reader
|
|
3
|
+
* Reads the CLI's own version from package.json at runtime, so the version
|
|
4
|
+
* displayed by `--version` and the banner can never drift out of sync with a
|
|
5
|
+
* hardcoded string left behind after a release bump.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
let cachedVersion;
|
|
11
|
+
export function getPackageVersion() {
|
|
12
|
+
if (cachedVersion)
|
|
13
|
+
return cachedVersion;
|
|
14
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
// This file lives at src/config/ (or dist/config/ once built), two levels
|
|
16
|
+
// below the repository/package root in both cases.
|
|
17
|
+
const pkgPath = path.resolve(moduleDir, '../../package.json');
|
|
18
|
+
try {
|
|
19
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
20
|
+
cachedVersion = pkg.version || '0.0.0';
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
cachedVersion = '0.0.0';
|
|
24
|
+
}
|
|
25
|
+
return cachedVersion;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=package-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-info.js","sourceRoot":"","sources":["../../src/config/package-info.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,aAAiC,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,0EAA0E;IAC1E,mDAAmD;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,aAAa,GAAI,GAAG,CAAC,OAAkB,IAAI,OAAO,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Fridayy - Secret Resolver & Isolation Engine
|
|
3
3
|
* Manages secret extraction from environment variables with zero leakage to LLM prompts/schemas.
|
|
4
4
|
*/
|
|
5
|
+
import { CredentialsStore } from '../../config/credentials-store.js';
|
|
5
6
|
export interface SecretResolutionOptions {
|
|
6
7
|
envKey?: string;
|
|
7
8
|
prefix?: string;
|
|
@@ -9,13 +10,21 @@ export interface SecretResolutionOptions {
|
|
|
9
10
|
}
|
|
10
11
|
export declare class SecretResolver {
|
|
11
12
|
private customEnv;
|
|
12
|
-
|
|
13
|
+
private credentialsStore;
|
|
14
|
+
constructor(customEnv?: Record<string, string>, credentialsStore?: CredentialsStore);
|
|
13
15
|
/**
|
|
14
|
-
* Resolves a secret value from process.env or
|
|
16
|
+
* Resolves a secret value from process.env, custom config, or the global
|
|
17
|
+
* per-device credentials store.
|
|
15
18
|
* Priority:
|
|
16
19
|
* 1. Direct envKey if specified in tool/auth definition
|
|
17
20
|
* 2. Standard FRIDAYY_<SCHEME>_KEY or FRIDAYY_<NAME>
|
|
18
21
|
* 3. customEnv lookup
|
|
22
|
+
* 4. Global credentials store (~/.config/fridayy/credentials.json or the
|
|
23
|
+
* OS-appropriate equivalent — see config/global-dir.ts), keyed by the same
|
|
24
|
+
* candidate env-var-shaped names. This lets a secret be configured once per
|
|
25
|
+
* device (`fridayy secrets set <NAME> <value>`) and reused by every project
|
|
26
|
+
* on that machine, instead of being duplicated in plaintext per-project
|
|
27
|
+
* config files.
|
|
19
28
|
*/
|
|
20
29
|
resolveSecret(keyOrScheme: string, options?: SecretResolutionOptions): string | undefined;
|
|
21
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/authentication/secret-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"secret-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/authentication/secret-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA2B,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAK9F,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,gBAAgB,GAAE,gBAA0C;IAKhH;;;;;;;;;;;;;OAaG;IACI,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,MAAM,GAAG,SAAS;IAwCpG;;;;;;OAMG;IACI,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAWjE;;OAEG;IACI,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,MAAM,EAAE;CAkBjH;AAED,eAAO,MAAM,qBAAqB,gBAAuB,CAAC"}
|
|
@@ -3,24 +3,34 @@
|
|
|
3
3
|
* Manages secret extraction from environment variables with zero leakage to LLM prompts/schemas.
|
|
4
4
|
*/
|
|
5
5
|
import dotenv from 'dotenv';
|
|
6
|
+
import { defaultCredentialsStore } from '../../config/credentials-store.js';
|
|
6
7
|
// Load .env if present
|
|
7
8
|
dotenv.config();
|
|
8
9
|
export class SecretResolver {
|
|
9
10
|
customEnv;
|
|
10
|
-
|
|
11
|
+
credentialsStore;
|
|
12
|
+
constructor(customEnv = {}, credentialsStore = defaultCredentialsStore) {
|
|
11
13
|
this.customEnv = customEnv;
|
|
14
|
+
this.credentialsStore = credentialsStore;
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
|
-
* Resolves a secret value from process.env or
|
|
17
|
+
* Resolves a secret value from process.env, custom config, or the global
|
|
18
|
+
* per-device credentials store.
|
|
15
19
|
* Priority:
|
|
16
20
|
* 1. Direct envKey if specified in tool/auth definition
|
|
17
21
|
* 2. Standard FRIDAYY_<SCHEME>_KEY or FRIDAYY_<NAME>
|
|
18
22
|
* 3. customEnv lookup
|
|
23
|
+
* 4. Global credentials store (~/.config/fridayy/credentials.json or the
|
|
24
|
+
* OS-appropriate equivalent — see config/global-dir.ts), keyed by the same
|
|
25
|
+
* candidate env-var-shaped names. This lets a secret be configured once per
|
|
26
|
+
* device (`fridayy secrets set <NAME> <value>`) and reused by every project
|
|
27
|
+
* on that machine, instead of being duplicated in plaintext per-project
|
|
28
|
+
* config files.
|
|
19
29
|
*/
|
|
20
30
|
resolveSecret(keyOrScheme, options = {}) {
|
|
21
31
|
// 1. Check explicit envKey
|
|
22
32
|
if (options.envKey) {
|
|
23
|
-
const explicitVal = process.env[options.envKey] || this.customEnv[options.envKey];
|
|
33
|
+
const explicitVal = process.env[options.envKey] || this.customEnv[options.envKey] || this.credentialsStore.get(options.envKey);
|
|
24
34
|
if (explicitVal)
|
|
25
35
|
return explicitVal;
|
|
26
36
|
}
|
|
@@ -45,6 +55,11 @@ export class SecretResolver {
|
|
|
45
55
|
return this.customEnv[cand];
|
|
46
56
|
}
|
|
47
57
|
}
|
|
58
|
+
for (const cand of candidates) {
|
|
59
|
+
const stored = this.credentialsStore.get(cand);
|
|
60
|
+
if (stored)
|
|
61
|
+
return stored;
|
|
62
|
+
}
|
|
48
63
|
return options.fallbackValue;
|
|
49
64
|
}
|
|
50
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-resolver.js","sourceRoot":"","sources":["../../../src/core/authentication/secret-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"secret-resolver.js","sourceRoot":"","sources":["../../../src/core/authentication/secret-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export declare class ProjectScanner {
|
|
|
8
8
|
private adapterRegistry;
|
|
9
9
|
private openApiParser;
|
|
10
10
|
private nodeJsScanner;
|
|
11
|
+
private laravelScanner;
|
|
11
12
|
constructor(adapterRegistry?: AdapterRegistry);
|
|
12
13
|
/**
|
|
13
14
|
* Scans a root directory and returns comprehensive capability detection results.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-scanner.d.ts","sourceRoot":"","sources":["../../../src/core/discovery/project-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAA0B,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-scanner.d.ts","sourceRoot":"","sources":["../../../src/core/discovery/project-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AAKrF,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,cAAc,CAA6B;gBAEvC,eAAe,GAAE,eAAwC;IAIrE;;OAEG;IACU,IAAI,CAAC,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IA2IvE,OAAO,CAAC,gBAAgB;IAyCxB,OAAO,CAAC,cAAc;CAcvB;AAED,eAAO,MAAM,qBAAqB,gBAAuB,CAAC"}
|
|
@@ -7,10 +7,12 @@ import path from 'node:path';
|
|
|
7
7
|
import { defaultAdapterRegistry } from '../../adapters/registry.js';
|
|
8
8
|
import { OpenApiParser } from '../../adapters/openapi/parser.js';
|
|
9
9
|
import { NodeJsScanner } from '../../adapters/nodejs/ast-scanner.js';
|
|
10
|
+
import { LaravelRouteScanner } from '../../adapters/laravel/route-scanner.js';
|
|
10
11
|
export class ProjectScanner {
|
|
11
12
|
adapterRegistry;
|
|
12
13
|
openApiParser = new OpenApiParser();
|
|
13
14
|
nodeJsScanner = new NodeJsScanner();
|
|
15
|
+
laravelScanner = new LaravelRouteScanner();
|
|
14
16
|
constructor(adapterRegistry = defaultAdapterRegistry) {
|
|
15
17
|
this.adapterRegistry = adapterRegistry;
|
|
16
18
|
}
|
|
@@ -77,6 +79,26 @@ export class ProjectScanner {
|
|
|
77
79
|
if (!hasOpenApi && discoveredRoutes.length > 0) {
|
|
78
80
|
totalEndpoints += discoveredRoutes.length;
|
|
79
81
|
}
|
|
82
|
+
// 2b. Scan for a Laravel project (artisan CLI, laravel/framework composer
|
|
83
|
+
// dependency, or an actual routes/*.php with Route:: declarations).
|
|
84
|
+
const hasArtisanFile = fs.existsSync(path.join(absRoot, 'artisan'));
|
|
85
|
+
let hasLaravelComposerDep = false;
|
|
86
|
+
const composerJsonPath = path.join(absRoot, 'composer.json');
|
|
87
|
+
if (fs.existsSync(composerJsonPath)) {
|
|
88
|
+
try {
|
|
89
|
+
const composer = JSON.parse(fs.readFileSync(composerJsonPath, 'utf-8'));
|
|
90
|
+
const allPhpDeps = { ...composer.require, ...composer['require-dev'] };
|
|
91
|
+
hasLaravelComposerDep = Boolean(allPhpDeps['laravel/framework'] || allPhpDeps['laravel/lumen-framework']);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// ignore malformed composer.json
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const laravelRoutes = hasArtisanFile || hasLaravelComposerDep ? await this.laravelScanner.scanDirectory(absRoot) : [];
|
|
98
|
+
const hasLaravel = hasArtisanFile || hasLaravelComposerDep || laravelRoutes.length > 0;
|
|
99
|
+
if (!hasOpenApi && !hasNodeJs && laravelRoutes.length > 0) {
|
|
100
|
+
totalEndpoints += laravelRoutes.length;
|
|
101
|
+
}
|
|
80
102
|
// 3. Formulate recommended configuration
|
|
81
103
|
const projectName = path.basename(absRoot);
|
|
82
104
|
let recommendedSource;
|
|
@@ -86,6 +108,13 @@ export class ProjectScanner {
|
|
|
86
108
|
path: openApiFiles[0]
|
|
87
109
|
};
|
|
88
110
|
}
|
|
111
|
+
else if (hasLaravel) {
|
|
112
|
+
recommendedSource = {
|
|
113
|
+
type: 'laravel',
|
|
114
|
+
rootDir: './',
|
|
115
|
+
baseUrl: 'http://localhost:8000'
|
|
116
|
+
};
|
|
117
|
+
}
|
|
89
118
|
else if (hasNodeJs) {
|
|
90
119
|
recommendedSource = {
|
|
91
120
|
type: 'nodejs',
|
|
@@ -118,12 +147,13 @@ export class ProjectScanner {
|
|
|
118
147
|
openApiFiles,
|
|
119
148
|
hasNodeJs,
|
|
120
149
|
nodeJsFramework,
|
|
150
|
+
hasLaravel,
|
|
121
151
|
discoveredEndpointsCount: totalEndpoints,
|
|
122
152
|
authSchemesDetected: Array.from(authSchemesDetected),
|
|
123
153
|
recommendedConfig,
|
|
124
154
|
details: {
|
|
125
155
|
openApiSpecs: openApiSpecsDetails,
|
|
126
|
-
routes: discoveredRoutes
|
|
156
|
+
routes: hasLaravel && !hasOpenApi && !hasNodeJs ? laravelRoutes : discoveredRoutes
|
|
127
157
|
}
|
|
128
158
|
};
|
|
129
159
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-scanner.js","sourceRoot":"","sources":["../../../src/core/discovery/project-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAmB,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-scanner.js","sourceRoot":"","sources":["../../../src/core/discovery/project-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAmB,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAE9E,MAAM,OAAO,cAAc;IACjB,eAAe,CAAkB;IACjC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IACpC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IACpC,cAAc,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAEnD,YAAY,kBAAmC,sBAAsB;QACnE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAAC,UAAkB,OAAO,CAAC,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtC,4BAA4B;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,MAAM,mBAAmB,GAAoF,EAAE,CAAC;QAChH,MAAM,mBAAmB,GAAgB,IAAI,GAAG,EAAE,CAAC;QACnD,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClD,cAAc,IAAI,OAAO,CAAC;gBAE1B,mBAAmB,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,cAAc,EAAE,OAAO;iBACxB,CAAC,CAAC;gBAEH,2BAA2B;gBAC3B,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;oBAC/B,KAAK,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;wBACtE,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACvD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,eAAe,GAAiE,MAAM,CAAC;QAE3F,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;gBAChE,IAAI,OAAO,CAAC,OAAO;oBAAE,eAAe,GAAG,SAAS,CAAC;qBAC5C,IAAI,OAAO,CAAC,OAAO;oBAAE,eAAe,GAAG,SAAS,CAAC;qBACjD,IAAI,OAAO,CAAC,GAAG;oBAAE,eAAe,GAAG,KAAK,CAAC;qBACzC,IAAI,OAAO,CAAC,cAAc,CAAC;oBAAE,eAAe,GAAG,QAAQ,CAAC;qBACxD,IAAI,OAAO,CAAC,IAAI;oBAAE,eAAe,GAAG,QAAQ,CAAC;;oBAC7C,eAAe,GAAG,QAAQ,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe,GAAG,QAAQ,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,cAAc,IAAI,gBAAgB,CAAC,MAAM,CAAC;QAC5C,CAAC;QAED,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBACvE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC5G,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;YACnC,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,cAAc,IAAI,qBAAqB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtH,MAAM,UAAU,GAAG,cAAc,IAAI,qBAAqB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QACvF,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,cAAc,IAAI,aAAa,CAAC,MAAM,CAAC;QACzC,CAAC;QAED,yCAAyC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,iBAA0C,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,GAAG;gBAClB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;aACtB,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,iBAAiB,GAAG;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,uBAAuB;aACjC,CAAC;QACJ,CAAC;aAAM,IAAI,SAAS,EAAE,CAAC;YACrB,iBAAiB,GAAG;gBAClB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,iBAAiB,GAAG;gBAClB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,uBAAuB;aACjC,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAA2B;YAChD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE;gBACN,IAAI,EAAE,GAAG,WAAW,MAAM;gBAC1B,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,OAAO;aACnB;YACD,QAAQ,EAAE;gBACR,6BAA6B,EAAE,IAAI;gBACnC,eAAe,EAAE,IAAI;gBACrB,gBAAgB,EAAE,KAAK;aACxB;SACF,CAAC;QAEF,OAAO;YACL,UAAU;YACV,YAAY;YACZ,SAAS;YACT,eAAe;YACf,UAAU;YACV,wBAAwB,EAAE,cAAc;YACxC,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;YACpD,iBAAiB;YACjB,OAAO,EAAE;gBACP,YAAY,EAAE,mBAAmB;gBACjC,MAAM,EAAE,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB;aACnF;SACF,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,OAAe;QACtC,MAAM,UAAU,GAAG;YACjB,cAAc;YACd,aAAa;YACb,cAAc;YACd,cAAc;YACd,aAAa;YACb,cAAc;YACd,kBAAkB;YAClB,kBAAkB;YAClB,mBAAmB;YACnB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;SACnB,CAAC;QAEF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC7C,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,cAAc,CAAC,KAA0B;QAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7E,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAK,QAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,KAAK,EAAE,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -36,12 +36,12 @@ export function classifyOperation(ctx, config) {
|
|
|
36
36
|
.toLowerCase();
|
|
37
37
|
// 1. Check for DESTRUCTIVE operations
|
|
38
38
|
const isDeleteMethod = method === 'DELETE';
|
|
39
|
-
const
|
|
39
|
+
const matchedDestructiveKeyword = DESTRUCTIVE_KEYWORDS.find(kw => {
|
|
40
40
|
// Word boundary or underscore boundary check
|
|
41
41
|
const regex = new RegExp(`\\b${kw}\\b|_${kw}_|^${kw}_|_${kw}$`, 'i');
|
|
42
42
|
return regex.test(fullText);
|
|
43
43
|
});
|
|
44
|
-
if (isDeleteMethod ||
|
|
44
|
+
if (isDeleteMethod || matchedDestructiveKeyword) {
|
|
45
45
|
const isExplicitlyApproved = false;
|
|
46
46
|
return {
|
|
47
47
|
permissions: {
|
|
@@ -55,7 +55,7 @@ export function classifyOperation(ctx, config) {
|
|
|
55
55
|
status: isExplicitlyApproved ? 'APPROVED' : 'BLOCKED',
|
|
56
56
|
reason: isDeleteMethod
|
|
57
57
|
? 'DELETE HTTP method carries destructive risk.'
|
|
58
|
-
: `Operation contains destructive action keyword: "${
|
|
58
|
+
: `Operation contains destructive action keyword: "${matchedDestructiveKeyword}".`
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
// 2. Check for READ operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../../src/core/permissions/classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,oBAAoB,GAAG;IAC3B,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;IACV,MAAM;IACN,WAAW;IACX,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,OAAO;CACR,CAAC;AAmBF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAA0B,EAC1B,MAAsB;IAEtB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,IAAI,IAAI,EAAE;QACd,GAAG,CAAC,WAAW,IAAI,EAAE;QACrB,GAAG,CAAC,IAAI,IAAI,EAAE;QACd,GAAG,CAAC,OAAO,IAAI,EAAE;QACjB,GAAG,CAAC,WAAW,IAAI,EAAE;KACtB;SACE,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;IAEjB,sCAAsC;IACtC,MAAM,cAAc,GAAG,MAAM,KAAK,QAAQ,CAAC;IAC3C,MAAM,
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../../src/core/permissions/classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Enforces permission gates, status checks, and access rules for MCP tool invocation.
|
|
4
4
|
*/
|
|
5
5
|
import { FridayyToolDefinition, FridayyConfig } from '../schema/types.js';
|
|
6
|
+
import { ClassificationContext } from './classifier.js';
|
|
6
7
|
export declare class PermissionDeniedError extends Error {
|
|
7
8
|
readonly code: string;
|
|
8
9
|
readonly toolName: string;
|
|
@@ -20,5 +21,14 @@ export declare class PermissionEnforcer {
|
|
|
20
21
|
* Enforces permissions before executing a tool. Throws PermissionDeniedError if execution is not allowed.
|
|
21
22
|
*/
|
|
22
23
|
validateExecution(tool: FridayyToolDefinition): void;
|
|
24
|
+
/**
|
|
25
|
+
* Re-validates a tool whose actual HTTP method/path is decided at call time
|
|
26
|
+
* (e.g. a generic "call_api_endpoint"-style tool) rather than fixed at generation
|
|
27
|
+
* time. Without this, a tool statically classified as READ/WRITE could be invoked
|
|
28
|
+
* with a runtime method/path that is actually destructive (e.g. DELETE), bypassing
|
|
29
|
+
* the classifier's BLOCKED-by-default protection for destructive operations.
|
|
30
|
+
* Throws PermissionDeniedError if the effective operation is not APPROVED.
|
|
31
|
+
*/
|
|
32
|
+
validateDynamicOperation(tool: FridayyToolDefinition, ctx: ClassificationContext): void;
|
|
23
33
|
}
|
|
24
34
|
//# sourceMappingURL=enforcer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../../src/core/permissions/enforcer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../../src/core/permissions/enforcer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAqB,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,OAAO,CAAC,EAAE,GAAG,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,SAAsB,EAAE,OAAO,CAAC,EAAE,GAAG;CAOzF;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAgB;gBAEnB,MAAM,CAAC,EAAE,aAAa;IAIlC;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO;IAsB1D;;OAEG;IACI,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IA0D3D;;;;;;;OAOG;IACI,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,qBAAqB,GAAG,IAAI;CAa/F"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Fridayy - Permission & Security Enforcer
|
|
3
3
|
* Enforces permission gates, status checks, and access rules for MCP tool invocation.
|
|
4
4
|
*/
|
|
5
|
+
import { classifyOperation } from './classifier.js';
|
|
5
6
|
export class PermissionDeniedError extends Error {
|
|
6
7
|
code;
|
|
7
8
|
toolName;
|
|
@@ -67,5 +68,20 @@ export class PermissionEnforcer {
|
|
|
67
68
|
throw new PermissionDeniedError(`Tool "${tool.name}" is not included in the security allowlist.`, tool.name, 'TOOL_NOT_ALLOWLISTED');
|
|
68
69
|
}
|
|
69
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Re-validates a tool whose actual HTTP method/path is decided at call time
|
|
73
|
+
* (e.g. a generic "call_api_endpoint"-style tool) rather than fixed at generation
|
|
74
|
+
* time. Without this, a tool statically classified as READ/WRITE could be invoked
|
|
75
|
+
* with a runtime method/path that is actually destructive (e.g. DELETE), bypassing
|
|
76
|
+
* the classifier's BLOCKED-by-default protection for destructive operations.
|
|
77
|
+
* Throws PermissionDeniedError if the effective operation is not APPROVED.
|
|
78
|
+
*/
|
|
79
|
+
validateDynamicOperation(tool, ctx) {
|
|
80
|
+
const classification = classifyOperation(ctx, this.config);
|
|
81
|
+
if (classification.status !== 'APPROVED') {
|
|
82
|
+
throw new PermissionDeniedError(`Tool "${tool.name}" was invoked with an operation (${ctx.method || 'GET'} ${ctx.path || ''}) ` +
|
|
83
|
+
`that is classified as ${classification.permissions.type} and is not approved for execution. ${classification.reason}`, tool.name, classification.status === 'BLOCKED' ? 'DYNAMIC_OPERATION_BLOCKED' : 'DYNAMIC_OPERATION_NOT_APPROVED', { classification });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
70
86
|
}
|
|
71
87
|
//# sourceMappingURL=enforcer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcer.js","sourceRoot":"","sources":["../../../src/core/permissions/enforcer.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"enforcer.js","sourceRoot":"","sources":["../../../src/core/permissions/enforcer.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
export type ToolPermissionType = 'READ' | 'WRITE' | 'DESTRUCTIVE';
|
|
6
6
|
export type ToolRiskLevel = 'low' | 'medium' | 'high';
|
|
7
7
|
export type ToolApprovalStatus = 'APPROVED' | 'PENDING' | 'BLOCKED' | 'REJECTED';
|
|
8
|
-
export type SourceType = 'openapi' | 'rest' | 'nodejs' | 'manual' | 'graphql' | string;
|
|
8
|
+
export type SourceType = 'openapi' | 'rest' | 'nodejs' | 'laravel' | 'manual' | 'graphql' | string;
|
|
9
9
|
export type AuthType = 'apiKey' | 'bearer' | 'basic' | 'customHeader' | 'oauth2' | 'none';
|
|
10
10
|
export interface ParameterDefinition {
|
|
11
11
|
name: string;
|
|
@@ -93,7 +93,7 @@ export interface FridayyConfig {
|
|
|
93
93
|
version?: string;
|
|
94
94
|
description?: string;
|
|
95
95
|
source: {
|
|
96
|
-
type: 'openapi' | 'rest' | 'nodejs' | 'manual' | 'auto';
|
|
96
|
+
type: 'openapi' | 'rest' | 'nodejs' | 'laravel' | 'manual' | 'auto';
|
|
97
97
|
path?: string;
|
|
98
98
|
url?: string;
|
|
99
99
|
baseUrl?: string;
|
|
@@ -107,6 +107,8 @@ export interface FridayyConfig {
|
|
|
107
107
|
port?: number;
|
|
108
108
|
host?: string;
|
|
109
109
|
maxRequestsPerMinute?: number;
|
|
110
|
+
/** Name of the environment variable holding the API key required to access the SSE/HTTP transport. */
|
|
111
|
+
apiKeyEnvVar?: string;
|
|
110
112
|
};
|
|
111
113
|
security?: {
|
|
112
114
|
requireApprovalForDestructive?: boolean;
|
|
@@ -166,6 +168,7 @@ export interface ScanResult {
|
|
|
166
168
|
openApiFiles: string[];
|
|
167
169
|
hasNodeJs: boolean;
|
|
168
170
|
nodeJsFramework?: 'express' | 'fastify' | 'koa' | 'nestjs' | 'custom' | 'none';
|
|
171
|
+
hasLaravel: boolean;
|
|
169
172
|
discoveredEndpointsCount: number;
|
|
170
173
|
authSchemesDetected: string[];
|
|
171
174
|
recommendedConfig: Partial<FridayyConfig>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/schema/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/schema/types.ts"],"names":[],"mappings":"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"}
|