@vess-id/vess 0.0.0-dev-20260902121045
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 +64 -0
- package/README.md +215 -0
- package/bin/vess.js +2 -0
- package/dist/__mocks__/@napi-rs/keyring.d.ts +9 -0
- package/dist/__mocks__/@napi-rs/keyring.d.ts.map +1 -0
- package/dist/__mocks__/@napi-rs/keyring.js +33 -0
- package/dist/__mocks__/@napi-rs/keyring.js.map +1 -0
- package/dist/__mocks__/node-mac-auth.d.ts +8 -0
- package/dist/__mocks__/node-mac-auth.d.ts.map +1 -0
- package/dist/__mocks__/node-mac-auth.js +29 -0
- package/dist/__mocks__/node-mac-auth.js.map +1 -0
- package/dist/adapter/mcp/http-transport.d.ts +40 -0
- package/dist/adapter/mcp/http-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/http-transport.js +228 -0
- package/dist/adapter/mcp/http-transport.js.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts +43 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.js +65 -0
- package/dist/adapter/mcp/mcp-adapter.js.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts +44 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.js +311 -0
- package/dist/adapter/mcp/mcp-server.factory.js.map +1 -0
- package/dist/adapter/mcp/stdio-transport.d.ts +7 -0
- package/dist/adapter/mcp/stdio-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/stdio-transport.js +13 -0
- package/dist/adapter/mcp/stdio-transport.js.map +1 -0
- package/dist/adapter/mcp/transport.d.ts +10 -0
- package/dist/adapter/mcp/transport.d.ts.map +1 -0
- package/dist/adapter/mcp/transport.js +14 -0
- package/dist/adapter/mcp/transport.js.map +1 -0
- package/dist/approval/approval-token.d.ts +23 -0
- package/dist/approval/approval-token.d.ts.map +1 -0
- package/dist/approval/approval-token.js +81 -0
- package/dist/approval/approval-token.js.map +1 -0
- package/dist/audit/audit-dto-mapper.d.ts +29 -0
- package/dist/audit/audit-dto-mapper.d.ts.map +1 -0
- package/dist/audit/audit-dto-mapper.js +61 -0
- package/dist/audit/audit-dto-mapper.js.map +1 -0
- package/dist/audit/audit-logger.d.ts +35 -0
- package/dist/audit/audit-logger.d.ts.map +1 -0
- package/dist/audit/audit-logger.js +67 -0
- package/dist/audit/audit-logger.js.map +1 -0
- package/dist/audit/audit-sync.d.ts +12 -0
- package/dist/audit/audit-sync.d.ts.map +1 -0
- package/dist/audit/audit-sync.js +65 -0
- package/dist/audit/audit-sync.js.map +1 -0
- package/dist/auth/user-authenticator.d.ts +51 -0
- package/dist/auth/user-authenticator.d.ts.map +1 -0
- package/dist/auth/user-authenticator.js +155 -0
- package/dist/auth/user-authenticator.js.map +1 -0
- package/dist/bootstrap/sdk-precheck.d.ts +9 -0
- package/dist/bootstrap/sdk-precheck.d.ts.map +1 -0
- package/dist/bootstrap/sdk-precheck.js +103 -0
- package/dist/bootstrap/sdk-precheck.js.map +1 -0
- package/dist/cli/claude-config-path.d.ts +17 -0
- package/dist/cli/claude-config-path.d.ts.map +1 -0
- package/dist/cli/claude-config-path.js +59 -0
- package/dist/cli/claude-config-path.js.map +1 -0
- package/dist/cli/cli-db.d.ts +12 -0
- package/dist/cli/cli-db.d.ts.map +1 -0
- package/dist/cli/cli-db.js +20 -0
- package/dist/cli/cli-db.js.map +1 -0
- package/dist/cli/cli-utils.d.ts +14 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +57 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/daemon-utils.d.ts +30 -0
- package/dist/cli/daemon-utils.d.ts.map +1 -0
- package/dist/cli/daemon-utils.js +131 -0
- package/dist/cli/daemon-utils.js.map +1 -0
- package/dist/cli/daemon.d.ts +13 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +207 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +6 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +136 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/env-delete.d.ts +6 -0
- package/dist/cli/env-delete.d.ts.map +1 -0
- package/dist/cli/env-delete.js +80 -0
- package/dist/cli/env-delete.js.map +1 -0
- package/dist/cli/env-list.d.ts +5 -0
- package/dist/cli/env-list.d.ts.map +1 -0
- package/dist/cli/env-list.js +42 -0
- package/dist/cli/env-list.js.map +1 -0
- package/dist/cli/env-post-integration.d.ts +21 -0
- package/dist/cli/env-post-integration.d.ts.map +1 -0
- package/dist/cli/env-post-integration.js +300 -0
- package/dist/cli/env-post-integration.js.map +1 -0
- package/dist/cli/env-restore.d.ts +15 -0
- package/dist/cli/env-restore.d.ts.map +1 -0
- package/dist/cli/env-restore.js +130 -0
- package/dist/cli/env-restore.js.map +1 -0
- package/dist/cli/env.d.ts +14 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +182 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/error-handlers.d.ts +13 -0
- package/dist/cli/error-handlers.d.ts.map +1 -0
- package/dist/cli/error-handlers.js +32 -0
- package/dist/cli/error-handlers.js.map +1 -0
- package/dist/cli/hook-check-env.d.ts +12 -0
- package/dist/cli/hook-check-env.d.ts.map +1 -0
- package/dist/cli/hook-check-env.js +117 -0
- package/dist/cli/hook-check-env.js.map +1 -0
- package/dist/cli/hook-session-project.d.ts +10 -0
- package/dist/cli/hook-session-project.d.ts.map +1 -0
- package/dist/cli/hook-session-project.js +206 -0
- package/dist/cli/hook-session-project.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +361 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-guard.d.ts +13 -0
- package/dist/cli/init-guard.d.ts.map +1 -0
- package/dist/cli/init-guard.js +62 -0
- package/dist/cli/init-guard.js.map +1 -0
- package/dist/cli/init.d.ts +19 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +440 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.d.ts +14 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +183 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/login.d.ts +6 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +76 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logs.d.ts +32 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +147 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/otel-headers.d.ts +12 -0
- package/dist/cli/otel-headers.d.ts.map +1 -0
- package/dist/cli/otel-headers.js +38 -0
- package/dist/cli/otel-headers.js.map +1 -0
- package/dist/cli/project.d.ts +8 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +102 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/reset.d.ts +8 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +137 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +103 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +2 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +29 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +12 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +131 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/telemetry-setup.d.ts +27 -0
- package/dist/cli/telemetry-setup.d.ts.map +1 -0
- package/dist/cli/telemetry-setup.js +157 -0
- package/dist/cli/telemetry-setup.js.map +1 -0
- package/dist/cli/uninstall.d.ts +8 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +110 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +10 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +64 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/constants.d.ts +11 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +14 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +58 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/version.d.ts +3 -0
- package/dist/config/version.d.ts.map +1 -0
- package/dist/config/version.js +80 -0
- package/dist/config/version.js.map +1 -0
- package/dist/core/execution-engine.d.ts +289 -0
- package/dist/core/execution-engine.d.ts.map +1 -0
- package/dist/core/execution-engine.js +1931 -0
- package/dist/core/execution-engine.js.map +1 -0
- package/dist/core/runtime.d.ts +43 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +147 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/sync-scheduler.d.ts +42 -0
- package/dist/core/sync-scheduler.d.ts.map +1 -0
- package/dist/core/sync-scheduler.js +131 -0
- package/dist/core/sync-scheduler.js.map +1 -0
- package/dist/core/types.d.ts +106 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/daemon/service-manager.d.ts +68 -0
- package/dist/daemon/service-manager.d.ts.map +1 -0
- package/dist/daemon/service-manager.js +303 -0
- package/dist/daemon/service-manager.js.map +1 -0
- package/dist/env/env-classifier.d.ts +14 -0
- package/dist/env/env-classifier.d.ts.map +1 -0
- package/dist/env/env-classifier.js +94 -0
- package/dist/env/env-classifier.js.map +1 -0
- package/dist/env/env-parser.d.ts +13 -0
- package/dist/env/env-parser.d.ts.map +1 -0
- package/dist/env/env-parser.js +33 -0
- package/dist/env/env-parser.js.map +1 -0
- package/dist/env/env-profile-store.d.ts +15 -0
- package/dist/env/env-profile-store.d.ts.map +1 -0
- package/dist/env/env-profile-store.js +35 -0
- package/dist/env/env-profile-store.js.map +1 -0
- package/dist/env/env-reference.d.ts +10 -0
- package/dist/env/env-reference.d.ts.map +1 -0
- package/dist/env/env-reference.js +33 -0
- package/dist/env/env-reference.js.map +1 -0
- package/dist/env/env-resolver.d.ts +18 -0
- package/dist/env/env-resolver.d.ts.map +1 -0
- package/dist/env/env-resolver.js +48 -0
- package/dist/env/env-resolver.js.map +1 -0
- package/dist/env/fs-utils.d.ts +9 -0
- package/dist/env/fs-utils.d.ts.map +1 -0
- package/dist/env/fs-utils.js +59 -0
- package/dist/env/fs-utils.js.map +1 -0
- package/dist/env/secret-backend.d.ts +15 -0
- package/dist/env/secret-backend.d.ts.map +1 -0
- package/dist/env/secret-backend.js +24 -0
- package/dist/env/secret-backend.js.map +1 -0
- package/dist/executor/executor-registry.d.ts +22 -0
- package/dist/executor/executor-registry.d.ts.map +1 -0
- package/dist/executor/executor-registry.js +42 -0
- package/dist/executor/executor-registry.js.map +1 -0
- package/dist/executor/process-launcher.d.ts +26 -0
- package/dist/executor/process-launcher.d.ts.map +1 -0
- package/dist/executor/process-launcher.js +98 -0
- package/dist/executor/process-launcher.js.map +1 -0
- package/dist/executor/secret-file.d.ts +28 -0
- package/dist/executor/secret-file.d.ts.map +1 -0
- package/dist/executor/secret-file.js +127 -0
- package/dist/executor/secret-file.js.map +1 -0
- package/dist/gateway/auth.d.ts +26 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +66 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/gateway-client.d.ts +363 -0
- package/dist/gateway/gateway-client.d.ts.map +1 -0
- package/dist/gateway/gateway-client.js +611 -0
- package/dist/gateway/gateway-client.js.map +1 -0
- package/dist/identity/agent-identity.d.ts +29 -0
- package/dist/identity/agent-identity.d.ts.map +1 -0
- package/dist/identity/agent-identity.js +54 -0
- package/dist/identity/agent-identity.js.map +1 -0
- package/dist/identity/did-manager.d.ts +17 -0
- package/dist/identity/did-manager.d.ts.map +1 -0
- package/dist/identity/did-manager.js +29 -0
- package/dist/identity/did-manager.js.map +1 -0
- package/dist/identity/key-manager.d.ts +21 -0
- package/dist/identity/key-manager.d.ts.map +1 -0
- package/dist/identity/key-manager.js +126 -0
- package/dist/identity/key-manager.js.map +1 -0
- package/dist/identity/session-key.d.ts +13 -0
- package/dist/identity/session-key.d.ts.map +1 -0
- package/dist/identity/session-key.js +17 -0
- package/dist/identity/session-key.js.map +1 -0
- package/dist/policy/policy-evaluator.d.ts +63 -0
- package/dist/policy/policy-evaluator.d.ts.map +1 -0
- package/dist/policy/policy-evaluator.js +266 -0
- package/dist/policy/policy-evaluator.js.map +1 -0
- package/dist/policy/policy-loader.d.ts +10 -0
- package/dist/policy/policy-loader.d.ts.map +1 -0
- package/dist/policy/policy-loader.js +71 -0
- package/dist/policy/policy-loader.js.map +1 -0
- package/dist/policy/types.d.ts +21 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +3 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/telemetry/claude-settings.d.ts +67 -0
- package/dist/telemetry/claude-settings.d.ts.map +1 -0
- package/dist/telemetry/claude-settings.js +191 -0
- package/dist/telemetry/claude-settings.js.map +1 -0
- package/dist/telemetry/otel-headers.d.ts +27 -0
- package/dist/telemetry/otel-headers.d.ts.map +1 -0
- package/dist/telemetry/otel-headers.js +33 -0
- package/dist/telemetry/otel-headers.js.map +1 -0
- package/dist/telemetry/project-key.d.ts +12 -0
- package/dist/telemetry/project-key.d.ts.map +1 -0
- package/dist/telemetry/project-key.js +113 -0
- package/dist/telemetry/project-key.js.map +1 -0
- package/dist/utils/credential-errors.d.ts +73 -0
- package/dist/utils/credential-errors.d.ts.map +1 -0
- package/dist/utils/credential-errors.js +90 -0
- package/dist/utils/credential-errors.js.map +1 -0
- package/dist/utils/resource-canonicalizer.d.ts +19 -0
- package/dist/utils/resource-canonicalizer.d.ts.map +1 -0
- package/dist/utils/resource-canonicalizer.js +100 -0
- package/dist/utils/resource-canonicalizer.js.map +1 -0
- package/dist/utils/vc-utils.d.ts +23 -0
- package/dist/utils/vc-utils.d.ts.map +1 -0
- package/dist/utils/vc-utils.js +53 -0
- package/dist/utils/vc-utils.js.map +1 -0
- package/dist/wallet/sqlite.d.ts +4 -0
- package/dist/wallet/sqlite.d.ts.map +1 -0
- package/dist/wallet/sqlite.js +158 -0
- package/dist/wallet/sqlite.js.map +1 -0
- package/dist/wallet/vp-builder.d.ts +26 -0
- package/dist/wallet/vp-builder.d.ts.map +1 -0
- package/dist/wallet/vp-builder.js +55 -0
- package/dist/wallet/vp-builder.js.map +1 -0
- package/dist/wallet/wallet.d.ts +64 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +179 -0
- package/dist/wallet/wallet.js.map +1 -0
- package/package.json +71 -0
- package/required-sdk-symbols.json +15 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startHttpTransport = exports.connectStdioTransport = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Transport layer re-exports.
|
|
6
|
+
*
|
|
7
|
+
* - stdio: for single-client mode (used internally by MCP)
|
|
8
|
+
* - http: for multi-client daemon mode (vess daemon start)
|
|
9
|
+
*/
|
|
10
|
+
var stdio_transport_1 = require("./stdio-transport");
|
|
11
|
+
Object.defineProperty(exports, "connectStdioTransport", { enumerable: true, get: function () { return stdio_transport_1.connectStdioTransport; } });
|
|
12
|
+
var http_transport_1 = require("./http-transport");
|
|
13
|
+
Object.defineProperty(exports, "startHttpTransport", { enumerable: true, get: function () { return http_transport_1.startHttpTransport; } });
|
|
14
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/adapter/mcp/transport.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,qDAAyD;AAAhD,wHAAA,qBAAqB,OAAA;AAC9B,mDAAqD;AAA5C,oHAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface GenerateParams {
|
|
2
|
+
action: string;
|
|
3
|
+
scope: string;
|
|
4
|
+
resource?: string;
|
|
5
|
+
context: 'new_approval' | 'reconfirmation';
|
|
6
|
+
}
|
|
7
|
+
interface VerifyResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
nonce?: string;
|
|
10
|
+
context?: 'new_approval' | 'reconfirmation';
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class ApprovalTokenService {
|
|
14
|
+
private static readonly MAX_NONCES;
|
|
15
|
+
private readonly secret;
|
|
16
|
+
private readonly ttlSeconds;
|
|
17
|
+
private readonly usedNonces;
|
|
18
|
+
constructor(ttlSeconds?: number);
|
|
19
|
+
generate(params: GenerateParams): string;
|
|
20
|
+
verify(token: string, expectedAction: string, expectedResource?: string): VerifyResult;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=approval-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-token.d.ts","sourceRoot":"","sources":["../../src/approval/approval-token.ts"],"names":[],"mappings":"AAEA,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,cAAc,GAAG,gBAAgB,CAAA;CAC3C;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAID,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAS;IAE3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;gBAE3C,UAAU,GAAE,MAA4B;IAKpD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAkBxC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,YAAY;CAyDvF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApprovalTokenService = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const DEFAULT_TTL_SECONDS = 300;
|
|
6
|
+
class ApprovalTokenService {
|
|
7
|
+
static MAX_NONCES = 10_000;
|
|
8
|
+
secret;
|
|
9
|
+
ttlSeconds;
|
|
10
|
+
usedNonces = new Map();
|
|
11
|
+
constructor(ttlSeconds = DEFAULT_TTL_SECONDS) {
|
|
12
|
+
this.secret = (0, crypto_1.randomBytes)(32);
|
|
13
|
+
this.ttlSeconds = ttlSeconds;
|
|
14
|
+
}
|
|
15
|
+
generate(params) {
|
|
16
|
+
const now = Math.floor(Date.now() / 1000);
|
|
17
|
+
const payload = {
|
|
18
|
+
v: 1,
|
|
19
|
+
action: params.action,
|
|
20
|
+
scope: params.scope,
|
|
21
|
+
resource: params.resource,
|
|
22
|
+
nonce: (0, crypto_1.randomUUID)(),
|
|
23
|
+
iat: now,
|
|
24
|
+
exp: now + this.ttlSeconds,
|
|
25
|
+
ctx: params.context,
|
|
26
|
+
};
|
|
27
|
+
const payloadB64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
28
|
+
const signature = (0, crypto_1.createHmac)('sha256', this.secret).update(payloadB64).digest('base64url');
|
|
29
|
+
return `${payloadB64}.${signature}`;
|
|
30
|
+
}
|
|
31
|
+
verify(token, expectedAction, expectedResource) {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
for (const [nonce, expiry] of this.usedNonces) {
|
|
34
|
+
if (expiry < now)
|
|
35
|
+
this.usedNonces.delete(nonce);
|
|
36
|
+
}
|
|
37
|
+
const parts = token.split('.');
|
|
38
|
+
if (parts.length !== 2) {
|
|
39
|
+
return { valid: false, error: 'Malformed token: expected payload.signature' };
|
|
40
|
+
}
|
|
41
|
+
const [payloadB64, signatureB64] = parts;
|
|
42
|
+
const expectedSig = (0, crypto_1.createHmac)('sha256', this.secret).update(payloadB64).digest('base64url');
|
|
43
|
+
const expectedBuf = Buffer.from(expectedSig);
|
|
44
|
+
const actualBuf = Buffer.from(signatureB64);
|
|
45
|
+
if (expectedBuf.length !== actualBuf.length || !(0, crypto_1.timingSafeEqual)(expectedBuf, actualBuf)) {
|
|
46
|
+
return { valid: false, error: 'Invalid token signature' };
|
|
47
|
+
}
|
|
48
|
+
let payload;
|
|
49
|
+
try {
|
|
50
|
+
payload = JSON.parse(Buffer.from(payloadB64, 'base64url').toString());
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return { valid: false, error: 'Invalid token payload' };
|
|
54
|
+
}
|
|
55
|
+
const nowSec = Math.floor(Date.now() / 1000);
|
|
56
|
+
if (payload.exp <= nowSec) {
|
|
57
|
+
return { valid: false, error: 'Token expired' };
|
|
58
|
+
}
|
|
59
|
+
if (payload.action !== expectedAction) {
|
|
60
|
+
return { valid: false, error: `Token action mismatch: expected ${expectedAction}, got ${payload.action}` };
|
|
61
|
+
}
|
|
62
|
+
// Check resource binding
|
|
63
|
+
if (expectedResource !== undefined && payload.resource !== expectedResource) {
|
|
64
|
+
return { valid: false, error: `Token resource mismatch: expected ${expectedResource}, got ${payload.resource}` };
|
|
65
|
+
}
|
|
66
|
+
if (this.usedNonces.has(payload.nonce)) {
|
|
67
|
+
return { valid: false, error: 'Token nonce already used (replay detected)' };
|
|
68
|
+
}
|
|
69
|
+
if (this.usedNonces.size >= ApprovalTokenService.MAX_NONCES) {
|
|
70
|
+
return { valid: false, error: 'Nonce store capacity exceeded — try again shortly' };
|
|
71
|
+
}
|
|
72
|
+
this.usedNonces.set(payload.nonce, payload.exp * 1000);
|
|
73
|
+
return {
|
|
74
|
+
valid: true,
|
|
75
|
+
nonce: payload.nonce,
|
|
76
|
+
context: payload.ctx,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.ApprovalTokenService = ApprovalTokenService;
|
|
81
|
+
//# sourceMappingURL=approval-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-token.js","sourceRoot":"","sources":["../../src/approval/approval-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AuditEntry } from './audit-logger';
|
|
2
|
+
/**
|
|
3
|
+
* Event type constants matching API's AuditEventType enum.
|
|
4
|
+
* Defined locally to avoid cross-package dependency.
|
|
5
|
+
* @see packages/api/src/audit/entities/audit-event.entity.ts
|
|
6
|
+
*/
|
|
7
|
+
export declare const AUDIT_EVENT_TYPE: {
|
|
8
|
+
readonly TOOL_INVOCATION: "tool_invocation";
|
|
9
|
+
readonly GATEWAY_EXECUTE: "gateway_execute";
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Severity constants matching API's AuditEventSeverity enum.
|
|
13
|
+
*/
|
|
14
|
+
export declare const AUDIT_SEVERITY: {
|
|
15
|
+
readonly LOW: "low";
|
|
16
|
+
readonly MEDIUM: "medium";
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Transform agentd's AuditEntry into the API's CreateAuditEventDto format.
|
|
20
|
+
*
|
|
21
|
+
* Key mappings:
|
|
22
|
+
* - enforcementType/decisionSource → metadata (agentd-specific context)
|
|
23
|
+
* - agentDid → namespace (required by API DTO)
|
|
24
|
+
* - (derived) → eventType (TOOL_INVOCATION for agentd events)
|
|
25
|
+
*/
|
|
26
|
+
export declare function auditEntryToApiDto(e: AuditEntry & {
|
|
27
|
+
id: string;
|
|
28
|
+
}): Record<string, unknown>;
|
|
29
|
+
//# sourceMappingURL=audit-dto-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-dto-mapper.d.ts","sourceRoot":"","sources":["../../src/audit/audit-dto-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;CAGnB,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAGjB,CAAA;AAEV;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkC1F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUDIT_SEVERITY = exports.AUDIT_EVENT_TYPE = void 0;
|
|
4
|
+
exports.auditEntryToApiDto = auditEntryToApiDto;
|
|
5
|
+
/**
|
|
6
|
+
* Event type constants matching API's AuditEventType enum.
|
|
7
|
+
* Defined locally to avoid cross-package dependency.
|
|
8
|
+
* @see packages/api/src/audit/entities/audit-event.entity.ts
|
|
9
|
+
*/
|
|
10
|
+
exports.AUDIT_EVENT_TYPE = {
|
|
11
|
+
TOOL_INVOCATION: 'tool_invocation',
|
|
12
|
+
GATEWAY_EXECUTE: 'gateway_execute',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Severity constants matching API's AuditEventSeverity enum.
|
|
16
|
+
*/
|
|
17
|
+
exports.AUDIT_SEVERITY = {
|
|
18
|
+
LOW: 'low',
|
|
19
|
+
MEDIUM: 'medium',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Transform agentd's AuditEntry into the API's CreateAuditEventDto format.
|
|
23
|
+
*
|
|
24
|
+
* Key mappings:
|
|
25
|
+
* - enforcementType/decisionSource → metadata (agentd-specific context)
|
|
26
|
+
* - agentDid → namespace (required by API DTO)
|
|
27
|
+
* - (derived) → eventType (TOOL_INVOCATION for agentd events)
|
|
28
|
+
*/
|
|
29
|
+
function auditEntryToApiDto(e) {
|
|
30
|
+
if (!e.agentDid) {
|
|
31
|
+
console.warn(`[AuditSync] Audit event missing agentDid, using fallback namespace: action=${e.action}`);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
eventType: exports.AUDIT_EVENT_TYPE.TOOL_INVOCATION,
|
|
35
|
+
namespace: e.agentDid || e.rootDid || 'unknown',
|
|
36
|
+
action: e.action,
|
|
37
|
+
decision: e.decision,
|
|
38
|
+
severity: e.decision === 'deny' ? exports.AUDIT_SEVERITY.MEDIUM : exports.AUDIT_SEVERITY.LOW,
|
|
39
|
+
agentDid: e.agentDid,
|
|
40
|
+
ownerDid: e.rootDid,
|
|
41
|
+
projectId: e.projectId,
|
|
42
|
+
provider: e.provider,
|
|
43
|
+
executionType: e.executionType,
|
|
44
|
+
reason: e.decisionReason,
|
|
45
|
+
correlationId: e.id,
|
|
46
|
+
credentialIds: e.credentialId ? [e.credentialId] : undefined,
|
|
47
|
+
resource: e.normalizedResource || e.requestedResource,
|
|
48
|
+
resourceType: e.provider ? `${e.provider}:*` : undefined,
|
|
49
|
+
metadata: Object.fromEntries(Object.entries({
|
|
50
|
+
enforcementType: e.enforcementType,
|
|
51
|
+
decisionSource: e.decisionSource,
|
|
52
|
+
grantId: e.grantId,
|
|
53
|
+
approvalMode: e.approvalMode,
|
|
54
|
+
approvalNonce: e.approvalNonce,
|
|
55
|
+
resourceFingerprint: e.resourceFingerprint,
|
|
56
|
+
presenterDid: e.presenterDid,
|
|
57
|
+
...(e.metadata || {}),
|
|
58
|
+
}).filter(([, v]) => v !== undefined)),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=audit-dto-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-dto-mapper.js","sourceRoot":"","sources":["../../src/audit/audit-dto-mapper.ts"],"names":[],"mappings":";;;AA4BA,gDAkCC;AA5DD;;;;GAIG;AACU,QAAA,gBAAgB,GAAG;IAC9B,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;CAC1B,CAAA;AAEV;;GAEG;AACU,QAAA,cAAc,GAAG;IAC5B,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;CACR,CAAA;AAEV;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,CAA8B;IAC/D,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IACxG,CAAC;IAED,OAAO;QACL,SAAS,EAAE,wBAAgB,CAAC,eAAe;QAC3C,SAAS,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,SAAS;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,sBAAc,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAc,CAAC,GAAG;QAC5E,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,OAAO;QACnB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,MAAM,EAAE,CAAC,CAAC,cAAc;QACxB,aAAa,EAAE,CAAC,CAAC,EAAE;QACnB,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5D,QAAQ,EAAE,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,iBAAiB;QACrD,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS;QACxD,QAAQ,EAAE,MAAM,CAAC,WAAW,CAC1B,MAAM,CAAC,OAAO,CAAC;YACb,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,mBAAmB,EAAE,CAAC,CAAC,mBAAmB;YAC1C,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;SACtB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACtC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export interface AuditEntry {
|
|
3
|
+
id?: string;
|
|
4
|
+
timestamp?: number;
|
|
5
|
+
projectId?: string;
|
|
6
|
+
rootDid?: string;
|
|
7
|
+
agentDid?: string;
|
|
8
|
+
presenterDid?: string;
|
|
9
|
+
action: string;
|
|
10
|
+
provider?: string;
|
|
11
|
+
enforcementType?: 'local' | 'gateway_verified_local' | 'cached_verified_local' | 'gateway';
|
|
12
|
+
decisionSource?: 'local_policy' | 'org_policy' | 'cached_vc' | 'new_vc_from_quick_approve' | 'claimed_from_approval' | 'gateway_execution';
|
|
13
|
+
executionType: 'gateway' | 'local';
|
|
14
|
+
decision: 'allow' | 'deny';
|
|
15
|
+
decisionReason?: string;
|
|
16
|
+
requestedResource?: string;
|
|
17
|
+
normalizedResource?: string;
|
|
18
|
+
resourceFingerprint?: string;
|
|
19
|
+
grantId?: string;
|
|
20
|
+
credentialId?: string;
|
|
21
|
+
approvalMode?: 'one_time' | 'persistent';
|
|
22
|
+
approvalNonce?: string;
|
|
23
|
+
metadata?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export declare class AuditLogger {
|
|
26
|
+
private readonly db;
|
|
27
|
+
constructor(db: Database.Database);
|
|
28
|
+
logEvent(entry: AuditEntry): string;
|
|
29
|
+
getPendingEvents(limit?: number): (AuditEntry & {
|
|
30
|
+
id: string;
|
|
31
|
+
})[];
|
|
32
|
+
markSynced(ids: string[]): void;
|
|
33
|
+
private rowToEntry;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=audit-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAGrC,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,GAAG,wBAAwB,GAAG,uBAAuB,GAAG,SAAS,CAAA;IAC1F,cAAc,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,2BAA2B,GAAG,uBAAuB,GAAG,mBAAmB,CAAA;IAC1I,aAAa,EAAE,SAAS,GAAG,OAAO,CAAA;IAClC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IACxC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IAwCnC,gBAAgB,CAAC,KAAK,GAAE,MAAY,GAAG,CAAC,UAAU,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE;IAQtE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAW/B,OAAO,CAAC,UAAU;CAyBnB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuditLogger = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
class AuditLogger {
|
|
6
|
+
db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
logEvent(entry) {
|
|
11
|
+
const id = entry.id || (0, crypto_1.randomUUID)();
|
|
12
|
+
const timestamp = entry.timestamp || Date.now();
|
|
13
|
+
this.db.prepare(`
|
|
14
|
+
INSERT INTO audit_log (
|
|
15
|
+
id, timestamp, project_id, root_did, agent_did, presenter_did,
|
|
16
|
+
action, provider, enforcement_type, decision_source,
|
|
17
|
+
execution_type, decision, decision_reason,
|
|
18
|
+
requested_resource, normalized_resource, resource_fingerprint,
|
|
19
|
+
grant_id, credential_id, approval_mode, approval_nonce,
|
|
20
|
+
metadata, synced_at
|
|
21
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
22
|
+
`).run(id, timestamp, entry.projectId ?? null, entry.rootDid ?? null, entry.agentDid ?? null, entry.presenterDid ?? null, entry.action, entry.provider ?? null, entry.enforcementType ?? null, entry.decisionSource ?? null, entry.executionType, entry.decision, entry.decisionReason ?? null, entry.requestedResource ?? null, entry.normalizedResource ?? null, entry.resourceFingerprint ?? null, entry.grantId ?? null, entry.credentialId ?? null, entry.approvalMode ?? null, entry.approvalNonce ?? null, entry.metadata ? JSON.stringify(entry.metadata) : null, null // synced_at = NULL (not yet synced)
|
|
23
|
+
);
|
|
24
|
+
return id;
|
|
25
|
+
}
|
|
26
|
+
getPendingEvents(limit = 100) {
|
|
27
|
+
const rows = this.db.prepare('SELECT * FROM audit_log WHERE synced_at IS NULL ORDER BY timestamp ASC LIMIT ?').all(limit);
|
|
28
|
+
return rows.map(r => this.rowToEntry(r));
|
|
29
|
+
}
|
|
30
|
+
markSynced(ids) {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const stmt = this.db.prepare('UPDATE audit_log SET synced_at = ? WHERE id = ?');
|
|
33
|
+
const transaction = this.db.transaction((eventIds) => {
|
|
34
|
+
for (const id of eventIds) {
|
|
35
|
+
stmt.run(now, id);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
transaction(ids);
|
|
39
|
+
}
|
|
40
|
+
rowToEntry(row) {
|
|
41
|
+
return {
|
|
42
|
+
id: row.id,
|
|
43
|
+
timestamp: row.timestamp,
|
|
44
|
+
projectId: row.project_id ?? undefined,
|
|
45
|
+
rootDid: row.root_did ?? undefined,
|
|
46
|
+
agentDid: row.agent_did ?? undefined,
|
|
47
|
+
presenterDid: row.presenter_did ?? undefined,
|
|
48
|
+
action: row.action,
|
|
49
|
+
provider: row.provider ?? undefined,
|
|
50
|
+
enforcementType: row.enforcement_type ?? undefined,
|
|
51
|
+
decisionSource: row.decision_source ?? undefined,
|
|
52
|
+
executionType: row.execution_type,
|
|
53
|
+
decision: row.decision,
|
|
54
|
+
decisionReason: row.decision_reason ?? undefined,
|
|
55
|
+
requestedResource: row.requested_resource ?? undefined,
|
|
56
|
+
normalizedResource: row.normalized_resource ?? undefined,
|
|
57
|
+
resourceFingerprint: row.resource_fingerprint ?? undefined,
|
|
58
|
+
grantId: row.grant_id ?? undefined,
|
|
59
|
+
credentialId: row.credential_id ?? undefined,
|
|
60
|
+
approvalMode: row.approval_mode ?? undefined,
|
|
61
|
+
approvalNonce: row.approval_nonce ?? undefined,
|
|
62
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.AuditLogger = AuditLogger;
|
|
67
|
+
//# sourceMappingURL=audit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuditLogger } from './audit-logger';
|
|
2
|
+
export declare class AuditSync {
|
|
3
|
+
private readonly auditLogger;
|
|
4
|
+
private readonly gatewayUrl;
|
|
5
|
+
private readonly sessionToken;
|
|
6
|
+
constructor(auditLogger: AuditLogger, gatewayUrl: string, sessionToken: string);
|
|
7
|
+
syncPendingEvents(batchSize?: number): Promise<{
|
|
8
|
+
synced: number;
|
|
9
|
+
failed: number;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=audit-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sync.d.ts","sourceRoot":"","sources":["../../src/audit/audit-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAY5C,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM;IAGjC,iBAAiB,CAAC,SAAS,GAAE,MAAsC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CA+CxH"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuditSync = void 0;
|
|
4
|
+
const audit_dto_mapper_1 = require("./audit-dto-mapper");
|
|
5
|
+
/**
|
|
6
|
+
* Async batch sync of audit events to Gateway (spec §9.2).
|
|
7
|
+
*
|
|
8
|
+
* Transforms agentd's AuditEntry format into the API's CreateAuditEventDto
|
|
9
|
+
* format before sending.
|
|
10
|
+
*/
|
|
11
|
+
/** Default batch size for audit sync */
|
|
12
|
+
const AUDIT_SYNC_DEFAULT_BATCH_SIZE = 100;
|
|
13
|
+
class AuditSync {
|
|
14
|
+
auditLogger;
|
|
15
|
+
gatewayUrl;
|
|
16
|
+
sessionToken;
|
|
17
|
+
constructor(auditLogger, gatewayUrl, sessionToken) {
|
|
18
|
+
this.auditLogger = auditLogger;
|
|
19
|
+
this.gatewayUrl = gatewayUrl;
|
|
20
|
+
this.sessionToken = sessionToken;
|
|
21
|
+
}
|
|
22
|
+
async syncPendingEvents(batchSize = AUDIT_SYNC_DEFAULT_BATCH_SIZE) {
|
|
23
|
+
const pending = this.auditLogger.getPendingEvents(batchSize);
|
|
24
|
+
if (pending.length === 0) {
|
|
25
|
+
return { synced: 0, failed: 0 };
|
|
26
|
+
}
|
|
27
|
+
// Filter out gateway-executed events — they are already recorded server-side
|
|
28
|
+
const gatewayEvents = pending.filter(e => e.executionType === 'gateway');
|
|
29
|
+
const localEvents = pending.filter(e => e.executionType !== 'gateway');
|
|
30
|
+
// Mark gateway events as synced immediately to prevent re-processing
|
|
31
|
+
if (gatewayEvents.length > 0) {
|
|
32
|
+
this.auditLogger.markSynced(gatewayEvents.map(e => e.id));
|
|
33
|
+
console.info(`[AuditSync] Skipped ${gatewayEvents.length} gateway-executed event(s) (already recorded server-side)`);
|
|
34
|
+
}
|
|
35
|
+
if (localEvents.length === 0) {
|
|
36
|
+
return { synced: 0, failed: 0 };
|
|
37
|
+
}
|
|
38
|
+
const events = localEvents.map(e => (0, audit_dto_mapper_1.auditEntryToApiDto)(e));
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(`${this.gatewayUrl}/api/v1/audit/batch`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: {
|
|
43
|
+
'Content-Type': 'application/json',
|
|
44
|
+
'X-Device-Session-Token': this.sessionToken,
|
|
45
|
+
},
|
|
46
|
+
body: JSON.stringify({ events }),
|
|
47
|
+
signal: AbortSignal.timeout(10000),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
const body = await response.text().catch(() => '');
|
|
51
|
+
console.warn(`[AuditSync] Audit sync failed: ${response.status} - ${body}`);
|
|
52
|
+
return { synced: 0, failed: localEvents.length };
|
|
53
|
+
}
|
|
54
|
+
const ids = localEvents.map(e => e.id);
|
|
55
|
+
this.auditLogger.markSynced(ids);
|
|
56
|
+
return { synced: localEvents.length, failed: 0 };
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
console.warn(`[AuditSync] Audit sync network error: ${err instanceof Error ? err.message : String(err)}`);
|
|
60
|
+
return { synced: 0, failed: localEvents.length };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.AuditSync = AuditSync;
|
|
65
|
+
//# sourceMappingURL=audit-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sync.js","sourceRoot":"","sources":["../../src/audit/audit-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { execFileSync as _execFileSync } from 'child_process';
|
|
2
|
+
/** @internal Test-only: override execFileSync for mocking */
|
|
3
|
+
export declare function _setExecFileSync(fn: typeof _execFileSync): void;
|
|
4
|
+
/** Platform-agnostic user-authentication contract. */
|
|
5
|
+
export interface UserAuthenticator {
|
|
6
|
+
/** Check if authentication is available on this platform */
|
|
7
|
+
isAvailable(): Promise<boolean>;
|
|
8
|
+
/** Request user authentication. Throws if denied or unavailable. */
|
|
9
|
+
authenticate(reason: string): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare class AuthenticationDeniedError extends Error {
|
|
12
|
+
constructor(message?: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class AuthenticationUnavailableError extends Error {
|
|
15
|
+
constructor(message?: string);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* macOS authenticator with Touch ID → system password fallback.
|
|
19
|
+
*
|
|
20
|
+
* 1. If Touch ID hardware is available, uses node-mac-auth (biometric prompt)
|
|
21
|
+
* 2. If not (Mac mini, old MacBook, lid closed), falls back to osascript
|
|
22
|
+
* confirmation dialog (no admin privileges required)
|
|
23
|
+
*
|
|
24
|
+
* Security note (Phase 1): Both Touch ID and password dialog serve as UX
|
|
25
|
+
* gates — they prevent accidental secret exposure by requiring physical
|
|
26
|
+
* user presence. The authentication and Keychain read are separate
|
|
27
|
+
* operations. Phase 2 will merge these into a single native call using
|
|
28
|
+
* Security.framework's kSecAccessControlUserPresence for OS-level protection.
|
|
29
|
+
*/
|
|
30
|
+
export declare class MacOSAuthenticator implements UserAuthenticator {
|
|
31
|
+
isAvailable(): Promise<boolean>;
|
|
32
|
+
authenticate(reason: string): Promise<void>;
|
|
33
|
+
private tryTouchId;
|
|
34
|
+
private promptSystemPassword;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fallback authenticator for platforms without supported authentication.
|
|
38
|
+
* Always reports unavailable and throws on authenticate().
|
|
39
|
+
*/
|
|
40
|
+
export declare class NoopAuthenticator implements UserAuthenticator {
|
|
41
|
+
isAvailable(): Promise<boolean>;
|
|
42
|
+
authenticate(_reason: string): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a platform-appropriate authenticator.
|
|
46
|
+
* - macOS: Touch ID with system password fallback
|
|
47
|
+
* - Others: NoopAuthenticator (restore not available)
|
|
48
|
+
* @param platform - Override for testing (defaults to process.platform)
|
|
49
|
+
*/
|
|
50
|
+
export declare function createAuthenticator(platform?: string): UserAuthenticator;
|
|
51
|
+
//# sourceMappingURL=user-authenticator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-authenticator.d.ts","sourceRoot":"","sources":["../../src/auth/user-authenticator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,eAAe,CAAA;AAK7D,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,aAAa,GAAG,IAAI,CAE/D;AAMD,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/B,oEAAoE;IACpE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAMD,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,SAAkC;CAItD;AAED,qBAAa,8BAA+B,SAAQ,KAAK;gBAC3C,OAAO,SAA0D;CAI9E;AAMD;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;IACpD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQnC,UAAU;IAWxB,OAAO,CAAC,oBAAoB;CAqB7B;AAMD;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IACnD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGnD;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAAyB,GAAG,iBAAiB,CAK1F"}
|