@getaegis/cli 0.8.0 → 0.9.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 +43 -14
- package/dist/agent/agent.d.ts +98 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +212 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/cli/auth.d.ts +19 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +44 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +6 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +241 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/config.d.ts +6 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +125 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +6 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +195 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/db.d.ts +6 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +139 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +6 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +39 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gate.d.ts +6 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +202 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +175 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/key.d.ts +6 -0
- package/dist/cli/commands/key.d.ts.map +1 -0
- package/dist/cli/commands/key.js +49 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/ledger.d.ts +6 -0
- package/dist/cli/commands/ledger.d.ts.map +1 -0
- package/dist/cli/commands/ledger.js +140 -0
- package/dist/cli/commands/ledger.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +224 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/policy.d.ts +6 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +126 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/commands/user.d.ts +6 -0
- package/dist/cli/commands/user.d.ts.map +1 -0
- package/dist/cli/commands/user.js +150 -0
- package/dist/cli/commands/user.js.map +1 -0
- package/dist/cli/commands/vault-manager.d.ts +6 -0
- package/dist/cli/commands/vault-manager.d.ts.map +1 -0
- package/dist/cli/commands/vault-manager.js +240 -0
- package/dist/cli/commands/vault-manager.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +6 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +265 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/commands/webhook.d.ts +6 -0
- package/dist/cli/commands/webhook.d.ts.map +1 -0
- package/dist/cli/commands/webhook.js +151 -0
- package/dist/cli/commands/webhook.js.map +1 -0
- package/dist/cli/helpers.d.ts +12 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +61 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/validation.d.ts +37 -0
- package/dist/cli/validation.d.ts.map +1 -0
- package/dist/cli/validation.js +104 -0
- package/dist/cli/validation.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +120 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +401 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/dashboard-server.d.ts +95 -0
- package/dist/dashboard/dashboard-server.d.ts.map +1 -0
- package/dist/dashboard/dashboard-server.js +329 -0
- package/dist/dashboard/dashboard-server.js.map +1 -0
- package/dist/dashboard/index.d.ts +3 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +2 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/public/assets/index-Cah0_BKk.js +148 -0
- package/dist/dashboard/public/assets/index-CpMruPNh.css +1 -0
- package/dist/dashboard/public/favicon.svg +6 -0
- package/dist/dashboard/public/index.html +14 -0
- package/dist/db.d.ts +27 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +209 -0
- package/dist/db.js.map +1 -0
- package/dist/doctor.d.ts +37 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +216 -0
- package/dist/doctor.js.map +1 -0
- package/dist/gate/body-inspector.d.ts +31 -0
- package/dist/gate/body-inspector.d.ts.map +1 -0
- package/dist/gate/body-inspector.js +193 -0
- package/dist/gate/body-inspector.js.map +1 -0
- package/dist/gate/gate.d.ts +190 -0
- package/dist/gate/gate.d.ts.map +1 -0
- package/dist/gate/gate.js +1243 -0
- package/dist/gate/gate.js.map +1 -0
- package/dist/gate/index.d.ts +7 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +4 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/rate-limiter.d.ts +59 -0
- package/dist/gate/rate-limiter.d.ts.map +1 -0
- package/dist/gate/rate-limiter.js +120 -0
- package/dist/gate/rate-limiter.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/key-storage/credential-manager-windows.d.ts +19 -0
- package/dist/key-storage/credential-manager-windows.d.ts.map +1 -0
- package/dist/key-storage/credential-manager-windows.js +87 -0
- package/dist/key-storage/credential-manager-windows.js.map +1 -0
- package/dist/key-storage/file-fallback.d.ts +21 -0
- package/dist/key-storage/file-fallback.d.ts.map +1 -0
- package/dist/key-storage/file-fallback.js +62 -0
- package/dist/key-storage/file-fallback.js.map +1 -0
- package/dist/key-storage/index.d.ts +6 -0
- package/dist/key-storage/index.d.ts.map +1 -0
- package/dist/key-storage/index.js +6 -0
- package/dist/key-storage/index.js.map +1 -0
- package/dist/key-storage/key-storage.d.ts +41 -0
- package/dist/key-storage/key-storage.d.ts.map +1 -0
- package/dist/key-storage/key-storage.js +70 -0
- package/dist/key-storage/key-storage.js.map +1 -0
- package/dist/key-storage/keychain-macos.d.ts +19 -0
- package/dist/key-storage/keychain-macos.d.ts.map +1 -0
- package/dist/key-storage/keychain-macos.js +51 -0
- package/dist/key-storage/keychain-macos.js.map +1 -0
- package/dist/key-storage/secret-service-linux.d.ts +19 -0
- package/dist/key-storage/secret-service-linux.d.ts.map +1 -0
- package/dist/key-storage/secret-service-linux.js +55 -0
- package/dist/key-storage/secret-service-linux.js.map +1 -0
- package/dist/ledger/index.d.ts +3 -0
- package/dist/ledger/index.d.ts.map +1 -0
- package/dist/ledger/index.js +2 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/ledger.d.ts +98 -0
- package/dist/ledger/ledger.d.ts.map +1 -0
- package/dist/ledger/ledger.js +145 -0
- package/dist/ledger/ledger.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +2 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +58 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +201 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +130 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -0
- package/dist/mcp/mcp-server.js +775 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +88 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +179 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy.d.ts +119 -0
- package/dist/policy/policy.d.ts.map +1 -0
- package/dist/policy/policy.js +426 -0
- package/dist/policy/policy.js.map +1 -0
- package/dist/user/index.d.ts +3 -0
- package/dist/user/index.d.ts.map +1 -0
- package/dist/user/index.js +2 -0
- package/dist/user/index.js.map +1 -0
- package/dist/user/user.d.ts +102 -0
- package/dist/user/user.d.ts.map +1 -0
- package/dist/user/user.js +216 -0
- package/dist/user/user.js.map +1 -0
- package/dist/vault/crypto.d.ts +28 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +44 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +10 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +6 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/seal.d.ts +68 -0
- package/dist/vault/seal.d.ts.map +1 -0
- package/dist/vault/seal.js +110 -0
- package/dist/vault/seal.js.map +1 -0
- package/dist/vault/shamir.d.ts +33 -0
- package/dist/vault/shamir.d.ts.map +1 -0
- package/dist/vault/shamir.js +174 -0
- package/dist/vault/shamir.js.map +1 -0
- package/dist/vault/vault-manager.d.ts +62 -0
- package/dist/vault/vault-manager.d.ts.map +1 -0
- package/dist/vault/vault-manager.js +151 -0
- package/dist/vault/vault-manager.js.map +1 -0
- package/dist/vault/vault.d.ts +104 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +259 -0
- package/dist/vault/vault.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/dist/webhook/index.d.ts +3 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +2 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/webhook.d.ts +114 -0
- package/dist/webhook/webhook.d.ts.map +1 -0
- package/dist/webhook/webhook.js +269 -0
- package/dist/webhook/webhook.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform key storage abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for storing the Aegis master key in
|
|
5
|
+
* OS-managed credential stores, keeping it out of plaintext files.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order (auto-detect):
|
|
8
|
+
* macOS → Keychain (`security` CLI)
|
|
9
|
+
* Windows → Credential Manager (`cmdkey` + PowerShell)
|
|
10
|
+
* Linux → Secret Service (`secret-tool` / libsecret)
|
|
11
|
+
* Fallback → File (.aegis/.master-key, mode 0600)
|
|
12
|
+
*/
|
|
13
|
+
/** Backend identifier for display and diagnostics. */
|
|
14
|
+
export type KeyStorageBackend = 'macos-keychain' | 'windows-credential-manager' | 'linux-secret-service' | 'file';
|
|
15
|
+
/** Abstract key storage interface. All methods are synchronous to keep config loading simple. */
|
|
16
|
+
export interface KeyStorage {
|
|
17
|
+
/** Human-readable backend name (e.g. "macOS Keychain"). */
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/** Machine-readable backend identifier. */
|
|
20
|
+
readonly backend: KeyStorageBackend;
|
|
21
|
+
/** Check whether this backend is available on the current system. */
|
|
22
|
+
isAvailable(): boolean;
|
|
23
|
+
/** Retrieve the master key. Returns undefined if not stored. */
|
|
24
|
+
getKey(): string | undefined;
|
|
25
|
+
/** Store the master key (creates or replaces). */
|
|
26
|
+
setKey(key: string): void;
|
|
27
|
+
/** Delete the stored master key. No-op if not present. */
|
|
28
|
+
deleteKey(): void;
|
|
29
|
+
}
|
|
30
|
+
/** Check whether a CLI tool exists on PATH. Results are cached per process. */
|
|
31
|
+
export declare function commandExists(command: string): boolean;
|
|
32
|
+
/** Clear the commandExists cache (for testing). */
|
|
33
|
+
export declare function clearCommandExistsCache(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Auto-detect the best available key storage backend for the current platform.
|
|
36
|
+
*
|
|
37
|
+
* @param dataDir Path to the .aegis data directory (used by file fallback).
|
|
38
|
+
* @returns A KeyStorage implementation.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getKeyStorage(dataDir: string): KeyStorage;
|
|
41
|
+
//# sourceMappingURL=key-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-storage.d.ts","sourceRoot":"","sources":["../../src/key-storage/key-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,sDAAsD;AACtD,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,4BAA4B,GAC5B,sBAAsB,GACtB,MAAM,CAAC;AAEX,iGAAiG;AACjG,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IAEpC,qEAAqE;IACrE,WAAW,IAAI,OAAO,CAAC;IAEvB,gEAAgE;IAChE,MAAM,IAAI,MAAM,GAAG,SAAS,CAAC;IAE7B,kDAAkD;IAClD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,0DAA0D;IAC1D,SAAS,IAAI,IAAI,CAAC;CACnB;AAOD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAetD;AAED,mDAAmD;AACnD,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAID;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAoBzD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform key storage abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for storing the Aegis master key in
|
|
5
|
+
* OS-managed credential stores, keeping it out of plaintext files.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order (auto-detect):
|
|
8
|
+
* macOS → Keychain (`security` CLI)
|
|
9
|
+
* Windows → Credential Manager (`cmdkey` + PowerShell)
|
|
10
|
+
* Linux → Secret Service (`secret-tool` / libsecret)
|
|
11
|
+
* Fallback → File (.aegis/.master-key, mode 0600)
|
|
12
|
+
*/
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import { WindowsCredentialStorage } from './credential-manager-windows.js';
|
|
16
|
+
import { FileFallbackStorage } from './file-fallback.js';
|
|
17
|
+
import { MacOSKeychainStorage } from './keychain-macos.js';
|
|
18
|
+
import { LinuxSecretServiceStorage } from './secret-service-linux.js';
|
|
19
|
+
// ─── Helpers ──────────────────────────────────────────────────────
|
|
20
|
+
/** Cache for commandExists results — avoids redundant subprocess calls. */
|
|
21
|
+
const commandExistsCache = new Map();
|
|
22
|
+
/** Check whether a CLI tool exists on PATH. Results are cached per process. */
|
|
23
|
+
export function commandExists(command) {
|
|
24
|
+
const cached = commandExistsCache.get(command);
|
|
25
|
+
if (cached !== undefined)
|
|
26
|
+
return cached;
|
|
27
|
+
let exists;
|
|
28
|
+
try {
|
|
29
|
+
const which = os.platform() === 'win32' ? 'where' : 'which';
|
|
30
|
+
execFileSync(which, [command], { stdio: 'pipe' });
|
|
31
|
+
exists = true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
exists = false;
|
|
35
|
+
}
|
|
36
|
+
commandExistsCache.set(command, exists);
|
|
37
|
+
return exists;
|
|
38
|
+
}
|
|
39
|
+
/** Clear the commandExists cache (for testing). */
|
|
40
|
+
export function clearCommandExistsCache() {
|
|
41
|
+
commandExistsCache.clear();
|
|
42
|
+
}
|
|
43
|
+
// ─── Factory ──────────────────────────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Auto-detect the best available key storage backend for the current platform.
|
|
46
|
+
*
|
|
47
|
+
* @param dataDir Path to the .aegis data directory (used by file fallback).
|
|
48
|
+
* @returns A KeyStorage implementation.
|
|
49
|
+
*/
|
|
50
|
+
export function getKeyStorage(dataDir) {
|
|
51
|
+
const platform = os.platform();
|
|
52
|
+
if (platform === 'darwin') {
|
|
53
|
+
const backend = new MacOSKeychainStorage();
|
|
54
|
+
if (backend.isAvailable())
|
|
55
|
+
return backend;
|
|
56
|
+
}
|
|
57
|
+
if (platform === 'win32') {
|
|
58
|
+
const backend = new WindowsCredentialStorage();
|
|
59
|
+
if (backend.isAvailable())
|
|
60
|
+
return backend;
|
|
61
|
+
}
|
|
62
|
+
if (platform === 'linux') {
|
|
63
|
+
const backend = new LinuxSecretServiceStorage();
|
|
64
|
+
if (backend.isAvailable())
|
|
65
|
+
return backend;
|
|
66
|
+
}
|
|
67
|
+
// Fallback: file-based storage
|
|
68
|
+
return new FileFallbackStorage(dataDir);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=key-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-storage.js","sourceRoot":"","sources":["../../src/key-storage/key-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAgCtE,qEAAqE;AAErE,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEtD,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,uBAAuB;IACrC,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,qEAAqE;AAErE;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,WAAW,EAAE;YAAE,OAAO,OAAO,CAAC;IAC5C,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,WAAW,EAAE;YAAE,OAAO,OAAO,CAAC;IAC5C,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,WAAW,EAAE;YAAE,OAAO,OAAO,CAAC;IAC5C,CAAC;IAED,+BAA+B;IAC/B,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS Keychain backend via the `security` CLI.
|
|
3
|
+
*
|
|
4
|
+
* Uses `security add-generic-password` / `find-generic-password` /
|
|
5
|
+
* `delete-generic-password` which ship with every macOS install.
|
|
6
|
+
*
|
|
7
|
+
* The key is stored in the user's login keychain under:
|
|
8
|
+
* service: "aegis" account: "master-key"
|
|
9
|
+
*/
|
|
10
|
+
import type { KeyStorage, KeyStorageBackend } from './key-storage.js';
|
|
11
|
+
export declare class MacOSKeychainStorage implements KeyStorage {
|
|
12
|
+
readonly name = "macOS Keychain";
|
|
13
|
+
readonly backend: KeyStorageBackend;
|
|
14
|
+
isAvailable(): boolean;
|
|
15
|
+
getKey(): string | undefined;
|
|
16
|
+
setKey(key: string): void;
|
|
17
|
+
deleteKey(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=keychain-macos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain-macos.d.ts","sourceRoot":"","sources":["../../src/key-storage/keychain-macos.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMtE,qBAAa,oBAAqB,YAAW,UAAU;IACrD,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAoB;IAEvD,WAAW,IAAI,OAAO;IAItB,MAAM,IAAI,MAAM,GAAG,SAAS;IAe5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAazB,SAAS,IAAI,IAAI;CASlB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS Keychain backend via the `security` CLI.
|
|
3
|
+
*
|
|
4
|
+
* Uses `security add-generic-password` / `find-generic-password` /
|
|
5
|
+
* `delete-generic-password` which ship with every macOS install.
|
|
6
|
+
*
|
|
7
|
+
* The key is stored in the user's login keychain under:
|
|
8
|
+
* service: "aegis" account: "master-key"
|
|
9
|
+
*/
|
|
10
|
+
import { execFileSync } from 'node:child_process';
|
|
11
|
+
import { commandExists } from './key-storage.js';
|
|
12
|
+
const SERVICE = 'aegis';
|
|
13
|
+
const ACCOUNT = 'master-key';
|
|
14
|
+
export class MacOSKeychainStorage {
|
|
15
|
+
name = 'macOS Keychain';
|
|
16
|
+
backend = 'macos-keychain';
|
|
17
|
+
isAvailable() {
|
|
18
|
+
return process.platform === 'darwin' && commandExists('security');
|
|
19
|
+
}
|
|
20
|
+
getKey() {
|
|
21
|
+
try {
|
|
22
|
+
const result = execFileSync('security', ['find-generic-password', '-a', ACCOUNT, '-s', SERVICE, '-w'], { stdio: ['pipe', 'pipe', 'pipe'], encoding: 'utf-8' });
|
|
23
|
+
const key = result.trim();
|
|
24
|
+
return key || undefined;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Item not found (exit code 44) or other error
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
setKey(key) {
|
|
32
|
+
// -U flag updates if the item already exists (prevents "already exists" error)
|
|
33
|
+
try {
|
|
34
|
+
execFileSync('security', ['add-generic-password', '-a', ACCOUNT, '-s', SERVICE, '-w', key, '-U'], { stdio: 'pipe' });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
throw new Error(`Failed to store key in macOS Keychain: ${err.message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
deleteKey() {
|
|
41
|
+
try {
|
|
42
|
+
execFileSync('security', ['delete-generic-password', '-a', ACCOUNT, '-s', SERVICE], {
|
|
43
|
+
stdio: 'pipe',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Item not found — nothing to delete
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=keychain-macos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain-macos.js","sourceRoot":"","sources":["../../src/key-storage/keychain-macos.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,OAAO,GAAG,OAAO,CAAC;AACxB,MAAM,OAAO,GAAG,YAAY,CAAC;AAE7B,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,gBAAgB,CAAC;IACxB,OAAO,GAAsB,gBAAgB,CAAC;IAEvD,WAAW;QACT,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,MAAM;QACJ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CACzB,UAAU,EACV,CAAC,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAC7D,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CACvD,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,GAAG,IAAI,SAAS,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,+EAA+E;QAC/E,IAAI,CAAC;YACH,YAAY,CACV,UAAU,EACV,CAAC,sBAAsB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EACvE,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA2C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,EAAE,CAAC,yBAAyB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;gBAClF,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux Secret Service backend via `secret-tool` (libsecret).
|
|
3
|
+
*
|
|
4
|
+
* Works with GNOME Keyring, KDE Wallet, KeePassXC, or any implementation
|
|
5
|
+
* of the freedesktop.org Secret Service D-Bus API.
|
|
6
|
+
*
|
|
7
|
+
* The key is stored with attributes:
|
|
8
|
+
* application=aegis type=master-key
|
|
9
|
+
*/
|
|
10
|
+
import type { KeyStorage, KeyStorageBackend } from './key-storage.js';
|
|
11
|
+
export declare class LinuxSecretServiceStorage implements KeyStorage {
|
|
12
|
+
readonly name = "Linux Secret Service";
|
|
13
|
+
readonly backend: KeyStorageBackend;
|
|
14
|
+
isAvailable(): boolean;
|
|
15
|
+
getKey(): string | undefined;
|
|
16
|
+
setKey(key: string): void;
|
|
17
|
+
deleteKey(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=secret-service-linux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-service-linux.d.ts","sourceRoot":"","sources":["../../src/key-storage/secret-service-linux.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMtE,qBAAa,yBAA0B,YAAW,UAAU;IAC1D,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAA0B;IAE7D,WAAW,IAAI,OAAO;IAItB,MAAM,IAAI,MAAM,GAAG,SAAS;IAc5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAYzB,SAAS,IAAI,IAAI;CAOlB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux Secret Service backend via `secret-tool` (libsecret).
|
|
3
|
+
*
|
|
4
|
+
* Works with GNOME Keyring, KDE Wallet, KeePassXC, or any implementation
|
|
5
|
+
* of the freedesktop.org Secret Service D-Bus API.
|
|
6
|
+
*
|
|
7
|
+
* The key is stored with attributes:
|
|
8
|
+
* application=aegis type=master-key
|
|
9
|
+
*/
|
|
10
|
+
import { execFileSync } from 'node:child_process';
|
|
11
|
+
import { commandExists } from './key-storage.js';
|
|
12
|
+
const ATTRS = ['application', 'aegis', 'type', 'master-key'];
|
|
13
|
+
const LABEL = 'Aegis Master Key';
|
|
14
|
+
export class LinuxSecretServiceStorage {
|
|
15
|
+
name = 'Linux Secret Service';
|
|
16
|
+
backend = 'linux-secret-service';
|
|
17
|
+
isAvailable() {
|
|
18
|
+
return process.platform === 'linux' && commandExists('secret-tool');
|
|
19
|
+
}
|
|
20
|
+
getKey() {
|
|
21
|
+
try {
|
|
22
|
+
const result = execFileSync('secret-tool', ['lookup', ...ATTRS], {
|
|
23
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
24
|
+
encoding: 'utf-8',
|
|
25
|
+
});
|
|
26
|
+
const key = result.trim();
|
|
27
|
+
return key || undefined;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Secret not found or D-Bus not available
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
setKey(key) {
|
|
35
|
+
try {
|
|
36
|
+
// secret-tool reads the password from stdin
|
|
37
|
+
execFileSync('secret-tool', ['store', '--label', LABEL, ...ATTRS], {
|
|
38
|
+
input: key,
|
|
39
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new Error(`Failed to store key in Secret Service: ${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
deleteKey() {
|
|
47
|
+
try {
|
|
48
|
+
execFileSync('secret-tool', ['clear', ...ATTRS], { stdio: 'pipe' });
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Secret not found — nothing to delete
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=secret-service-linux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-service-linux.js","sourceRoot":"","sources":["../../src/key-storage/secret-service-linux.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAC7D,MAAM,KAAK,GAAG,kBAAkB,CAAC;AAEjC,MAAM,OAAO,yBAAyB;IAC3B,IAAI,GAAG,sBAAsB,CAAC;IAC9B,OAAO,GAAsB,sBAAsB,CAAC;IAE7D,WAAW;QACT,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,aAAa,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC;IAED,MAAM;QACJ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE;gBAC/D,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,GAAG,IAAI,SAAS,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC;YACH,4CAA4C;YAC5C,YAAY,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE;gBACjE,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA2C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC;YACH,YAAY,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ledger/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ledger/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3-multiple-ciphers';
|
|
2
|
+
export type AuditChannel = 'gate' | 'mcp';
|
|
3
|
+
export interface AuditEntry {
|
|
4
|
+
id: number;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
credentialId: string | null;
|
|
7
|
+
credentialName: string | null;
|
|
8
|
+
service: string;
|
|
9
|
+
targetDomain: string;
|
|
10
|
+
method: string;
|
|
11
|
+
path: string;
|
|
12
|
+
status: 'allowed' | 'blocked' | 'system';
|
|
13
|
+
blockedReason: string | null;
|
|
14
|
+
responseCode: number | null;
|
|
15
|
+
agentName: string | null;
|
|
16
|
+
agentTokenPrefix: string | null;
|
|
17
|
+
channel: AuditChannel;
|
|
18
|
+
}
|
|
19
|
+
export interface LedgerQuery {
|
|
20
|
+
service?: string;
|
|
21
|
+
credentialName?: string;
|
|
22
|
+
status?: 'allowed' | 'blocked' | 'system';
|
|
23
|
+
since?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
agentName?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class Ledger {
|
|
28
|
+
private db;
|
|
29
|
+
constructor(db: Database.Database);
|
|
30
|
+
/**
|
|
31
|
+
* Record an allowed request.
|
|
32
|
+
*/
|
|
33
|
+
logAllowed(params: {
|
|
34
|
+
credentialId: string;
|
|
35
|
+
credentialName: string;
|
|
36
|
+
service: string;
|
|
37
|
+
targetDomain: string;
|
|
38
|
+
method: string;
|
|
39
|
+
path: string;
|
|
40
|
+
responseCode?: number;
|
|
41
|
+
agentName?: string;
|
|
42
|
+
agentTokenPrefix?: string;
|
|
43
|
+
channel?: AuditChannel;
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Record a blocked request.
|
|
47
|
+
*/
|
|
48
|
+
logBlocked(params: {
|
|
49
|
+
service: string;
|
|
50
|
+
targetDomain: string;
|
|
51
|
+
method: string;
|
|
52
|
+
path: string;
|
|
53
|
+
reason: string;
|
|
54
|
+
agentName?: string;
|
|
55
|
+
agentTokenPrefix?: string;
|
|
56
|
+
channel?: AuditChannel;
|
|
57
|
+
}): void;
|
|
58
|
+
/**
|
|
59
|
+
* Record a system lifecycle event (startup, shutdown, seal/unseal).
|
|
60
|
+
*/
|
|
61
|
+
logSystem(params: {
|
|
62
|
+
service: string;
|
|
63
|
+
targetDomain: string;
|
|
64
|
+
method: string;
|
|
65
|
+
path: string;
|
|
66
|
+
reason: string;
|
|
67
|
+
channel?: AuditChannel;
|
|
68
|
+
}): void;
|
|
69
|
+
/**
|
|
70
|
+
* Query the audit log with optional filters.
|
|
71
|
+
*/
|
|
72
|
+
query(params?: LedgerQuery): AuditEntry[];
|
|
73
|
+
/**
|
|
74
|
+
* Get summary stats for a time period, optionally filtered by agent.
|
|
75
|
+
*/
|
|
76
|
+
stats(since?: string, agentName?: string): {
|
|
77
|
+
total: number;
|
|
78
|
+
allowed: number;
|
|
79
|
+
blocked: number;
|
|
80
|
+
system: number;
|
|
81
|
+
byService: Record<string, number>;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Export audit log as CSV.
|
|
85
|
+
*/
|
|
86
|
+
exportCsv(params?: LedgerQuery): string;
|
|
87
|
+
/**
|
|
88
|
+
* Export audit log as a JSON array string.
|
|
89
|
+
*/
|
|
90
|
+
exportJson(params?: LedgerQuery): string;
|
|
91
|
+
/**
|
|
92
|
+
* Export audit log as streaming JSON Lines (one JSON object per line).
|
|
93
|
+
* Each line is a self-contained JSON object — ideal for piping into
|
|
94
|
+
* SIEM systems, log aggregators, or processing with tools like jq.
|
|
95
|
+
*/
|
|
96
|
+
exportJsonLines(params?: LedgerQuery): string;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
export class Ledger {
|
|
2
|
+
db;
|
|
3
|
+
constructor(db) {
|
|
4
|
+
this.db = db;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Record an allowed request.
|
|
8
|
+
*/
|
|
9
|
+
logAllowed(params) {
|
|
10
|
+
this.db
|
|
11
|
+
.prepare(`INSERT INTO audit_log (credential_id, credential_name, service, target_domain, method, path, status, response_code, agent_name, agent_token_prefix, channel)
|
|
12
|
+
VALUES (?, ?, ?, ?, ?, ?, 'allowed', ?, ?, ?, ?)`)
|
|
13
|
+
.run(params.credentialId, params.credentialName, params.service, params.targetDomain, params.method, params.path, params.responseCode ?? null, params.agentName ?? null, params.agentTokenPrefix ?? null, params.channel ?? 'gate');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Record a blocked request.
|
|
17
|
+
*/
|
|
18
|
+
logBlocked(params) {
|
|
19
|
+
this.db
|
|
20
|
+
.prepare(`INSERT INTO audit_log (service, target_domain, method, path, status, blocked_reason, agent_name, agent_token_prefix, channel)
|
|
21
|
+
VALUES (?, ?, ?, ?, 'blocked', ?, ?, ?, ?)`)
|
|
22
|
+
.run(params.service, params.targetDomain, params.method, params.path, params.reason, params.agentName ?? null, params.agentTokenPrefix ?? null, params.channel ?? 'gate');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record a system lifecycle event (startup, shutdown, seal/unseal).
|
|
26
|
+
*/
|
|
27
|
+
logSystem(params) {
|
|
28
|
+
this.db
|
|
29
|
+
.prepare(`INSERT INTO audit_log (service, target_domain, method, path, status, blocked_reason, channel)
|
|
30
|
+
VALUES (?, ?, ?, ?, 'system', ?, ?)`)
|
|
31
|
+
.run(params.service, params.targetDomain, params.method, params.path, params.reason, params.channel ?? 'gate');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Query the audit log with optional filters.
|
|
35
|
+
*/
|
|
36
|
+
query(params = {}) {
|
|
37
|
+
const conditions = [];
|
|
38
|
+
const values = [];
|
|
39
|
+
if (params.service) {
|
|
40
|
+
conditions.push('service = ?');
|
|
41
|
+
values.push(params.service);
|
|
42
|
+
}
|
|
43
|
+
if (params.credentialName) {
|
|
44
|
+
conditions.push('credential_name = ?');
|
|
45
|
+
values.push(params.credentialName);
|
|
46
|
+
}
|
|
47
|
+
if (params.status) {
|
|
48
|
+
conditions.push('status = ?');
|
|
49
|
+
values.push(params.status);
|
|
50
|
+
}
|
|
51
|
+
if (params.since) {
|
|
52
|
+
conditions.push('timestamp >= ?');
|
|
53
|
+
values.push(params.since);
|
|
54
|
+
}
|
|
55
|
+
if (params.agentName) {
|
|
56
|
+
conditions.push('agent_name = ?');
|
|
57
|
+
values.push(params.agentName);
|
|
58
|
+
}
|
|
59
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
60
|
+
const limit = params.limit ?? 50;
|
|
61
|
+
const rows = this.db
|
|
62
|
+
.prepare(`SELECT * FROM audit_log ${where} ORDER BY timestamp DESC LIMIT ?`)
|
|
63
|
+
.all(...values, limit);
|
|
64
|
+
return rows.map((row) => ({
|
|
65
|
+
id: row.id,
|
|
66
|
+
timestamp: row.timestamp,
|
|
67
|
+
credentialId: row.credential_id,
|
|
68
|
+
credentialName: row.credential_name,
|
|
69
|
+
service: row.service,
|
|
70
|
+
targetDomain: row.target_domain,
|
|
71
|
+
method: row.method,
|
|
72
|
+
path: row.path,
|
|
73
|
+
status: row.status,
|
|
74
|
+
blockedReason: row.blocked_reason,
|
|
75
|
+
responseCode: row.response_code,
|
|
76
|
+
agentName: row.agent_name,
|
|
77
|
+
agentTokenPrefix: row.agent_token_prefix,
|
|
78
|
+
channel: (row.channel ?? 'gate'),
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get summary stats for a time period, optionally filtered by agent.
|
|
83
|
+
*/
|
|
84
|
+
stats(since, agentName) {
|
|
85
|
+
const conditions = [];
|
|
86
|
+
const params = [];
|
|
87
|
+
if (since) {
|
|
88
|
+
conditions.push('timestamp >= ?');
|
|
89
|
+
params.push(since);
|
|
90
|
+
}
|
|
91
|
+
if (agentName) {
|
|
92
|
+
conditions.push('agent_name = ?');
|
|
93
|
+
params.push(agentName);
|
|
94
|
+
}
|
|
95
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
96
|
+
const totals = this.db
|
|
97
|
+
.prepare(`SELECT
|
|
98
|
+
COUNT(*) as total,
|
|
99
|
+
SUM(CASE WHEN status = 'allowed' THEN 1 ELSE 0 END) as allowed,
|
|
100
|
+
SUM(CASE WHEN status = 'blocked' THEN 1 ELSE 0 END) as blocked,
|
|
101
|
+
SUM(CASE WHEN status = 'system' THEN 1 ELSE 0 END) as system
|
|
102
|
+
FROM audit_log ${whereClause}`)
|
|
103
|
+
.get(...params);
|
|
104
|
+
const services = this.db
|
|
105
|
+
.prepare(`SELECT service, COUNT(*) as count FROM audit_log ${whereClause} GROUP BY service`)
|
|
106
|
+
.all(...params);
|
|
107
|
+
const byService = {};
|
|
108
|
+
for (const row of services) {
|
|
109
|
+
byService[row.service] = row.count;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
total: totals.total ?? 0,
|
|
113
|
+
allowed: totals.allowed ?? 0,
|
|
114
|
+
blocked: totals.blocked ?? 0,
|
|
115
|
+
system: totals.system ?? 0,
|
|
116
|
+
byService,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Export audit log as CSV.
|
|
121
|
+
*/
|
|
122
|
+
exportCsv(params = {}) {
|
|
123
|
+
const entries = this.query({ ...params, limit: params.limit ?? Number.MAX_SAFE_INTEGER });
|
|
124
|
+
const header = 'timestamp,credential,service,domain,method,path,status,reason,response_code,channel';
|
|
125
|
+
const rows = entries.map((e) => `${e.timestamp},${e.credentialName ?? ''},${e.service},${e.targetDomain},${e.method},${e.path},${e.status},${e.blockedReason ?? ''},${e.responseCode ?? ''},${e.channel}`);
|
|
126
|
+
return [header, ...rows].join('\n');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Export audit log as a JSON array string.
|
|
130
|
+
*/
|
|
131
|
+
exportJson(params = {}) {
|
|
132
|
+
const entries = this.query({ ...params, limit: params.limit ?? Number.MAX_SAFE_INTEGER });
|
|
133
|
+
return JSON.stringify(entries, null, 2);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Export audit log as streaming JSON Lines (one JSON object per line).
|
|
137
|
+
* Each line is a self-contained JSON object — ideal for piping into
|
|
138
|
+
* SIEM systems, log aggregators, or processing with tools like jq.
|
|
139
|
+
*/
|
|
140
|
+
exportJsonLines(params = {}) {
|
|
141
|
+
const entries = this.query({ ...params, limit: params.limit ?? Number.MAX_SAFE_INTEGER });
|
|
142
|
+
return entries.map((e) => JSON.stringify(e)).join('\n');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/ledger/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aegis Logger — structured logging with pino.
|
|
3
|
+
*
|
|
4
|
+
* Central logger factory for all Aegis modules. Provides:
|
|
5
|
+
* - Structured JSON output in production, pretty-print in development
|
|
6
|
+
* - Declarative field-level redaction (secrets, tokens, passwords)
|
|
7
|
+
* - Pattern-based scrubbing for credential-like strings in log values
|
|
8
|
+
* - Request correlation IDs via child loggers
|
|
9
|
+
* - stderr output support (required for MCP stdio transport)
|
|
10
|
+
*
|
|
11
|
+
* SECURITY: This is a security product — secrets must NEVER appear in logs.
|
|
12
|
+
* The logger enforces this through three layers:
|
|
13
|
+
* 1. Pino's `redact` option censors known sensitive field paths
|
|
14
|
+
* 2. Custom serializers scrub credential-like patterns from string values
|
|
15
|
+
* 3. The `safeMeta()` helper strips sensitive fields from ad-hoc objects
|
|
16
|
+
*/
|
|
17
|
+
import pino from 'pino';
|
|
18
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent';
|
|
19
|
+
export interface LoggerOptions {
|
|
20
|
+
/** Minimum log level (default: 'info') */
|
|
21
|
+
level?: LogLevel;
|
|
22
|
+
/** Module name — appears as `module` field in every log entry (e.g. 'gate', 'mcp', 'vault') */
|
|
23
|
+
module?: string;
|
|
24
|
+
/** Use pretty-print instead of JSON (default: auto-detect from NODE_ENV) */
|
|
25
|
+
pretty?: boolean;
|
|
26
|
+
/** Write to stderr instead of stdout (required for MCP stdio transport) */
|
|
27
|
+
stderr?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Scrub credential-like patterns from a string value.
|
|
31
|
+
* Replaces matches with [REDACTED] to prevent accidental exposure.
|
|
32
|
+
*/
|
|
33
|
+
export declare function scrubString(value: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Strip sensitive fields from an arbitrary object before logging.
|
|
36
|
+
* Use this for ad-hoc metadata objects that aren't covered by pino's redact paths.
|
|
37
|
+
*/
|
|
38
|
+
export declare function safeMeta(obj: Record<string, unknown>): Record<string, unknown>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a pino logger instance for an Aegis module.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const logger = createLogger({ module: 'gate', level: 'debug' });
|
|
45
|
+
* logger.info({ service: 'slack', method: 'GET' }, 'Request proxied');
|
|
46
|
+
*
|
|
47
|
+
* // Child logger with request correlation ID
|
|
48
|
+
* const reqLogger = logger.child({ requestId: generateRequestId() });
|
|
49
|
+
* reqLogger.info({ status: 200 }, 'Response sent');
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function createLogger(options?: LoggerOptions): pino.Logger;
|
|
53
|
+
/**
|
|
54
|
+
* Generate a unique request correlation ID.
|
|
55
|
+
* Included in all log entries for a given request, and stored in Ledger records.
|
|
56
|
+
*/
|
|
57
|
+
export declare function generateRequestId(): string;
|
|
58
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA8ED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgC9E;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CAAC,MAAM,CA2CrE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|