@vess-id/vess 0.2.0-alpha.1
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 +223 -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 +34 -0
- package/dist/adapter/mcp/http-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/http-transport.js +158 -0
- package/dist/adapter/mcp/http-transport.js.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts +37 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.js +48 -0
- package/dist/adapter/mcp/mcp-adapter.js.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts +35 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.js +114 -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/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 +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +135 -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/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +294 -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 +186 -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/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/uninstall.d.ts +8 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +111 -0
- package/dist/cli/uninstall.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 +3 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +6 -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/core/execution-engine.d.ts +119 -0
- package/dist/core/execution-engine.d.ts.map +1 -0
- package/dist/core/execution-engine.js +1291 -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 +143 -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 +77 -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 +298 -0
- package/dist/gateway/gateway-client.d.ts.map +1 -0
- package/dist/gateway/gateway-client.js +501 -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 +18 -0
- package/dist/identity/key-manager.d.ts.map +1 -0
- package/dist/identity/key-manager.js +101 -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/utils/credential-errors.d.ts +3 -0
- package/dist/utils/credential-errors.d.ts.map +1 -0
- package/dist/utils/credential-errors.js +23 -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 +18 -0
- package/dist/wallet/vp-builder.d.ts.map +1 -0
- package/dist/wallet/vp-builder.js +46 -0
- package/dist/wallet/vp-builder.js.map +1 -0
- package/dist/wallet/wallet.d.ts +58 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +170 -0
- package/dist/wallet/wallet.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentdGatewayClient = exports.GatewayNetworkError = void 0;
|
|
4
|
+
const credential_errors_1 = require("../utils/credential-errors");
|
|
5
|
+
/**
|
|
6
|
+
* Custom error for network-level failures (connection refused, DNS, timeout).
|
|
7
|
+
* Used by ExecutionEngine to distinguish network issues from code bugs.
|
|
8
|
+
*/
|
|
9
|
+
class GatewayNetworkError extends Error {
|
|
10
|
+
cause;
|
|
11
|
+
constructor(message, cause) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
this.name = 'GatewayNetworkError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.GatewayNetworkError = GatewayNetworkError;
|
|
18
|
+
class AgentdGatewayClient {
|
|
19
|
+
baseUrl;
|
|
20
|
+
getSessionToken;
|
|
21
|
+
onTokenRefreshed;
|
|
22
|
+
/** Shared promise for deduplicating concurrent token refresh attempts */
|
|
23
|
+
refreshPromise = null;
|
|
24
|
+
constructor(baseUrl, getSessionToken, onTokenRefreshed) {
|
|
25
|
+
this.baseUrl = baseUrl;
|
|
26
|
+
this.getSessionToken = getSessionToken;
|
|
27
|
+
this.onTokenRefreshed = onTokenRefreshed;
|
|
28
|
+
}
|
|
29
|
+
buildHeaders() {
|
|
30
|
+
return {
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
'X-Device-Session-Token': this.getSessionToken(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wrap fetch calls to convert network errors into GatewayNetworkError.
|
|
37
|
+
*/
|
|
38
|
+
async fetchWithNetworkError(url, init) {
|
|
39
|
+
try {
|
|
40
|
+
return await fetch(url, init);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new GatewayNetworkError(`Network error calling ${url}: ${err instanceof Error ? err.message : String(err)}`, err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Wrap fetch calls with automatic retry on 401 (token expired).
|
|
48
|
+
* On 401, attempts to refresh the token and retry the original request.
|
|
49
|
+
* Does NOT apply to refreshToken itself (to avoid infinite loops).
|
|
50
|
+
*/
|
|
51
|
+
async fetchWithAuthRetry(url, options) {
|
|
52
|
+
const response = await this.fetchWithNetworkError(url, options);
|
|
53
|
+
if (response.status === 401 && this.onTokenRefreshed) {
|
|
54
|
+
try {
|
|
55
|
+
// Deduplicate concurrent refreshes — only one refresh in flight at a time
|
|
56
|
+
if (!this.refreshPromise) {
|
|
57
|
+
this.refreshPromise = this.refreshToken().finally(() => {
|
|
58
|
+
this.refreshPromise = null;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const result = await this.refreshPromise;
|
|
62
|
+
try {
|
|
63
|
+
this.onTokenRefreshed(result.deviceSessionToken);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// onTokenRefreshed failed (e.g. Keychain write error) — continue with retry anyway
|
|
67
|
+
}
|
|
68
|
+
// Retry with new token
|
|
69
|
+
const retryOptions = {
|
|
70
|
+
...options,
|
|
71
|
+
headers: {
|
|
72
|
+
...options.headers,
|
|
73
|
+
'X-Device-Session-Token': result.deviceSessionToken,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
return this.fetchWithNetworkError(url, retryOptions);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Refresh failed — token may be expired beyond recovery
|
|
80
|
+
process.stderr.write('[vess] Session token refresh failed. Run "vess login" to re-authenticate.\n');
|
|
81
|
+
return response;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return response;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Refresh the device session token.
|
|
88
|
+
* POST /api/v1/device/refresh
|
|
89
|
+
* NOTE: Uses fetchWithNetworkError (not fetchWithAuthRetry) to avoid infinite loops.
|
|
90
|
+
*/
|
|
91
|
+
async refreshToken() {
|
|
92
|
+
const url = `${this.baseUrl}/api/v1/device/refresh`;
|
|
93
|
+
const response = await this.fetchWithNetworkError(url, {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
headers: this.buildHeaders(),
|
|
96
|
+
signal: AbortSignal.timeout(10000),
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw new Error(`refreshToken failed: ${response.status}`);
|
|
100
|
+
}
|
|
101
|
+
const result = await response.json();
|
|
102
|
+
return result.data;
|
|
103
|
+
}
|
|
104
|
+
// ===========================================================================
|
|
105
|
+
// v1/agentd/ endpoints
|
|
106
|
+
// ===========================================================================
|
|
107
|
+
/**
|
|
108
|
+
* Issue nonce for VP replay prevention.
|
|
109
|
+
* POST /api/v1/agentd/nonce
|
|
110
|
+
*/
|
|
111
|
+
async issueNonce(agentDid) {
|
|
112
|
+
const url = `${this.baseUrl}/api/v1/agentd/nonce`;
|
|
113
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
114
|
+
method: 'POST',
|
|
115
|
+
headers: this.buildHeaders(),
|
|
116
|
+
body: JSON.stringify({ agentDid }),
|
|
117
|
+
signal: AbortSignal.timeout(10000),
|
|
118
|
+
});
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new Error(`issueNonce failed: ${response.status}`);
|
|
121
|
+
}
|
|
122
|
+
const result = await response.json();
|
|
123
|
+
return result.data;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Auto-issue VC when grant has autoApprove enabled.
|
|
127
|
+
* POST /api/v1/agentd/vc/auto-issue
|
|
128
|
+
*/
|
|
129
|
+
async autoIssueVC(params) {
|
|
130
|
+
const url = `${this.baseUrl}/api/v1/agentd/vc/auto-issue`;
|
|
131
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
132
|
+
method: 'POST',
|
|
133
|
+
headers: this.buildHeaders(),
|
|
134
|
+
body: JSON.stringify(params),
|
|
135
|
+
signal: AbortSignal.timeout(10000),
|
|
136
|
+
});
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
throw new Error(`autoIssueVC failed: ${response.status}`);
|
|
139
|
+
}
|
|
140
|
+
const result = await response.json();
|
|
141
|
+
const data = result.data;
|
|
142
|
+
// API returns null when no auto-issue is available
|
|
143
|
+
if (!data || !data.autoIssued) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
// Guard: autoIssued=true but credential missing (edge case)
|
|
147
|
+
if (!data.credential) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
// API returns flat format: { credential: "jwt-string", expiresAt: "ISO-string", ... }
|
|
151
|
+
// Normalize to AutoIssueVCResult: { credential: { jwt, expiresAt (epoch ms) }, ... }
|
|
152
|
+
const expiresAt = typeof data.expiresAt === 'string'
|
|
153
|
+
? Date.parse(data.expiresAt)
|
|
154
|
+
: (data.credential?.expiresAt ?? data.expiresAt);
|
|
155
|
+
// Guard: unparseable expiresAt
|
|
156
|
+
if (typeof expiresAt !== 'number' || Number.isNaN(expiresAt)) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
autoIssued: data.autoIssued,
|
|
161
|
+
credential: {
|
|
162
|
+
jwt: typeof data.credential === 'string' ? data.credential : data.credential?.jwt,
|
|
163
|
+
expiresAt,
|
|
164
|
+
},
|
|
165
|
+
actions: data.actions ?? [],
|
|
166
|
+
...(data.resources?.length ? { resources: data.resources } : {}),
|
|
167
|
+
...(data.metadata != null ? { metadata: data.metadata } : {}),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Find approved requests by subjectDid.
|
|
172
|
+
* GET /api/v1/agentd/vc/approved?subjectDid=...
|
|
173
|
+
*/
|
|
174
|
+
async findApprovedRequests(subjectDid) {
|
|
175
|
+
const url = `${this.baseUrl}/api/v1/agentd/vc/approved?subjectDid=${encodeURIComponent(subjectDid)}`;
|
|
176
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
177
|
+
method: 'GET',
|
|
178
|
+
headers: this.buildHeaders(),
|
|
179
|
+
signal: AbortSignal.timeout(10000),
|
|
180
|
+
});
|
|
181
|
+
if (!response.ok) {
|
|
182
|
+
throw new Error(`findApprovedRequests failed: ${response.status}`);
|
|
183
|
+
}
|
|
184
|
+
const result = await response.json();
|
|
185
|
+
// API returns flat format per item: { credential: "jwt-string", vcExpiresAt: "ISO-string", ... }
|
|
186
|
+
// Normalize each item to ApprovedRequest: { credential: { jwt, expiresAt (epoch ms) } | undefined }
|
|
187
|
+
return result.data.map((item) => {
|
|
188
|
+
const resources = item.resources;
|
|
189
|
+
// If credential is already in nested format, pass through
|
|
190
|
+
if (item.credential && typeof item.credential === 'object' && 'jwt' in item.credential) {
|
|
191
|
+
return { id: item.id, actions: item.actions, credential: item.credential, resources };
|
|
192
|
+
}
|
|
193
|
+
// Flat format: credential is a raw JWT string, vcExpiresAt is a separate field
|
|
194
|
+
if (typeof item.credential === 'string' && item.credential) {
|
|
195
|
+
const expiresAt = typeof item.vcExpiresAt === 'string'
|
|
196
|
+
? Date.parse(item.vcExpiresAt)
|
|
197
|
+
: undefined;
|
|
198
|
+
return {
|
|
199
|
+
id: item.id,
|
|
200
|
+
actions: item.actions,
|
|
201
|
+
credential: {
|
|
202
|
+
jwt: item.credential,
|
|
203
|
+
expiresAt: (typeof expiresAt === 'number' && !Number.isNaN(expiresAt)) ? expiresAt : 0,
|
|
204
|
+
},
|
|
205
|
+
resources,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// No credential (null/undefined)
|
|
209
|
+
return { id: item.id, actions: item.actions, resources };
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check VC revocation status by jti.
|
|
214
|
+
* GET /api/v1/agentd/vc/status/:jti
|
|
215
|
+
*/
|
|
216
|
+
async checkVCStatus(jti) {
|
|
217
|
+
const url = `${this.baseUrl}/api/v1/agentd/vc/status/${encodeURIComponent(jti)}`;
|
|
218
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
219
|
+
method: 'GET',
|
|
220
|
+
headers: this.buildHeaders(),
|
|
221
|
+
signal: AbortSignal.timeout(10000),
|
|
222
|
+
});
|
|
223
|
+
if (!response.ok) {
|
|
224
|
+
return { valid: false, reason: `VC status check failed: ${response.status}` };
|
|
225
|
+
}
|
|
226
|
+
const result = await response.json();
|
|
227
|
+
return result.data;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* VP verify + grant authorization check (gateway_verified_local).
|
|
231
|
+
* POST /api/v1/agentd/vp/verify-authorize
|
|
232
|
+
*/
|
|
233
|
+
async verifyAndAuthorize(vpJwt, challenge, domain, action, holderDid) {
|
|
234
|
+
const url = `${this.baseUrl}/api/v1/agentd/vp/verify-authorize`;
|
|
235
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
236
|
+
method: 'POST',
|
|
237
|
+
headers: this.buildHeaders(),
|
|
238
|
+
body: JSON.stringify({ vpJwt, challenge, domain, action, holderDid }),
|
|
239
|
+
signal: AbortSignal.timeout(10000),
|
|
240
|
+
});
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
return { authorized: false, reason: `VP verify-authorize failed: ${response.status}` };
|
|
243
|
+
}
|
|
244
|
+
const result = await response.json();
|
|
245
|
+
return result.data;
|
|
246
|
+
}
|
|
247
|
+
// ===========================================================================
|
|
248
|
+
// api/v1/ endpoints (spec Appendix B)
|
|
249
|
+
// ===========================================================================
|
|
250
|
+
/**
|
|
251
|
+
* Register an agent in the API Agent table so it appears in agents.html / timeline.html.
|
|
252
|
+
* POST /api/v1/agents/create
|
|
253
|
+
*
|
|
254
|
+
* Requires X-Project-Id header for ProjectRoleGuard.
|
|
255
|
+
* Treats 409 Conflict as success (idempotent — agent already exists).
|
|
256
|
+
*/
|
|
257
|
+
async registerAgent(params) {
|
|
258
|
+
const url = `${this.baseUrl}/api/v1/agents/create`;
|
|
259
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
260
|
+
method: 'POST',
|
|
261
|
+
headers: {
|
|
262
|
+
...this.buildHeaders(),
|
|
263
|
+
'X-Project-Id': params.projectId,
|
|
264
|
+
},
|
|
265
|
+
body: JSON.stringify({
|
|
266
|
+
agentDid: params.agentDid,
|
|
267
|
+
name: params.name,
|
|
268
|
+
type: params.type,
|
|
269
|
+
publicKey: params.publicKey,
|
|
270
|
+
deviceInfo: params.deviceInfo,
|
|
271
|
+
}),
|
|
272
|
+
signal: AbortSignal.timeout(10000),
|
|
273
|
+
});
|
|
274
|
+
// 409 Conflict = agent already registered — treat as success
|
|
275
|
+
if (response.status === 409) {
|
|
276
|
+
return {
|
|
277
|
+
id: '',
|
|
278
|
+
did: params.agentDid,
|
|
279
|
+
name: params.name,
|
|
280
|
+
type: params.type,
|
|
281
|
+
status: 'active',
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
if (!response.ok) {
|
|
285
|
+
const body = await response.text().catch(() => '');
|
|
286
|
+
throw new Error(`registerAgent failed: ${response.status} ${response.statusText} - ${body}`);
|
|
287
|
+
}
|
|
288
|
+
const result = await response.json();
|
|
289
|
+
return result.agent;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Inline Grant + VC issuance (spec §6.2).
|
|
293
|
+
* POST /api/v1/grant/quick-approve
|
|
294
|
+
*/
|
|
295
|
+
async quickApprove(params) {
|
|
296
|
+
const url = `${this.baseUrl}/api/v1/grant/quick-approve`;
|
|
297
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
298
|
+
method: 'POST',
|
|
299
|
+
headers: this.buildHeaders(),
|
|
300
|
+
body: JSON.stringify(params),
|
|
301
|
+
signal: AbortSignal.timeout(10000),
|
|
302
|
+
});
|
|
303
|
+
if (!response.ok) {
|
|
304
|
+
const body = await response.text().catch(() => '');
|
|
305
|
+
throw new Error(`quickApprove failed: ${response.status} ${response.statusText} - ${body}`);
|
|
306
|
+
}
|
|
307
|
+
const result = await response.json();
|
|
308
|
+
if (!result.success) {
|
|
309
|
+
throw new Error(`quickApprove failed: ${JSON.stringify(result)}`);
|
|
310
|
+
}
|
|
311
|
+
// Enrich resources with provider derived from the first action
|
|
312
|
+
const data = result.data;
|
|
313
|
+
const provider = params.actions[0]?.split('.')[0] || '';
|
|
314
|
+
data.resources = data.grant?.resources?.map((r) => ({ ...r, provider }));
|
|
315
|
+
return data;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Create an OOB approval request for high-risk actions.
|
|
319
|
+
* POST /api/v1/agentd/approval/request
|
|
320
|
+
*/
|
|
321
|
+
async createApprovalRequest(params) {
|
|
322
|
+
const url = `${this.baseUrl}/api/v1/agentd/approval/request`;
|
|
323
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
324
|
+
method: 'POST',
|
|
325
|
+
headers: this.buildHeaders(),
|
|
326
|
+
body: JSON.stringify(params),
|
|
327
|
+
signal: AbortSignal.timeout(10000),
|
|
328
|
+
});
|
|
329
|
+
if (!response.ok) {
|
|
330
|
+
const text = await response.text().catch(() => '');
|
|
331
|
+
throw new Error(`createApprovalRequest failed: ${response.status} ${text}`);
|
|
332
|
+
}
|
|
333
|
+
const result = await response.json();
|
|
334
|
+
return result.data;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Poll the status of an OOB approval request.
|
|
338
|
+
* GET /api/v1/agentd/approval/:requestId/status
|
|
339
|
+
*/
|
|
340
|
+
async getApprovalStatus(requestId) {
|
|
341
|
+
const url = `${this.baseUrl}/api/v1/agentd/approval/${encodeURIComponent(requestId)}/status`;
|
|
342
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
343
|
+
method: 'GET',
|
|
344
|
+
headers: this.buildHeaders(),
|
|
345
|
+
signal: AbortSignal.timeout(10000),
|
|
346
|
+
});
|
|
347
|
+
if (!response.ok) {
|
|
348
|
+
const text = await response.text().catch(() => '');
|
|
349
|
+
throw new Error(`getApprovalStatus failed: ${response.status} ${text}`);
|
|
350
|
+
}
|
|
351
|
+
const result = await response.json();
|
|
352
|
+
return result.data;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* One-time grant atomic consumption (spec §6.2).
|
|
356
|
+
* POST /api/v1/grant/consume
|
|
357
|
+
*/
|
|
358
|
+
async consumeGrant(grantId) {
|
|
359
|
+
const url = `${this.baseUrl}/api/v1/grant/consume`;
|
|
360
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
361
|
+
method: 'POST',
|
|
362
|
+
headers: this.buildHeaders(),
|
|
363
|
+
body: JSON.stringify({ grantId }),
|
|
364
|
+
signal: AbortSignal.timeout(10000),
|
|
365
|
+
});
|
|
366
|
+
if (!response.ok) {
|
|
367
|
+
return { consumed: false, reason: `consumeGrant failed: ${response.status}` };
|
|
368
|
+
}
|
|
369
|
+
const result = await response.json();
|
|
370
|
+
return result.data;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* SaaS tool execution via Gateway (VP in Authorization header).
|
|
374
|
+
* POST /api/v1/tool/invoke
|
|
375
|
+
*/
|
|
376
|
+
async invokeTool(params) {
|
|
377
|
+
const url = `${this.baseUrl}/api/v1/tool/invoke`;
|
|
378
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
379
|
+
method: 'POST',
|
|
380
|
+
headers: {
|
|
381
|
+
...this.buildHeaders(),
|
|
382
|
+
'Authorization': `Bearer ${params.vpJwt}`,
|
|
383
|
+
'x-holder-did': params.holderDid,
|
|
384
|
+
'x-auth-challenge': params.vpChallenge,
|
|
385
|
+
},
|
|
386
|
+
body: JSON.stringify({
|
|
387
|
+
tool: params.action.split('.')[0],
|
|
388
|
+
action: params.action,
|
|
389
|
+
params: params.parameters,
|
|
390
|
+
holderDid: params.holderDid,
|
|
391
|
+
vpChallenge: params.vpChallenge,
|
|
392
|
+
vpDomain: params.vpDomain,
|
|
393
|
+
}),
|
|
394
|
+
signal: AbortSignal.timeout(30000),
|
|
395
|
+
});
|
|
396
|
+
if (!response.ok) {
|
|
397
|
+
const body = await response.text().catch(() => '');
|
|
398
|
+
// Parse structured error codes (e.g., RESOURCE_MISMATCH, CREDENTIAL_INVALID)
|
|
399
|
+
try {
|
|
400
|
+
const parsed = JSON.parse(body);
|
|
401
|
+
if (parsed.code === 'RESOURCE_MISMATCH') {
|
|
402
|
+
return {
|
|
403
|
+
success: false,
|
|
404
|
+
error: parsed.message || `invokeTool failed: ${response.status}`,
|
|
405
|
+
errorCode: 'RESOURCE_MISMATCH',
|
|
406
|
+
allowedResources: parsed.allowedResources,
|
|
407
|
+
requestedResource: parsed.requestedResource,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch { /* not JSON or no code field, fall through */ }
|
|
412
|
+
// Detect credential-invalid errors (expired VC, invalid VP, etc.)
|
|
413
|
+
// NOTE: Any 401 from invokeTool is treated as credential-invalid since this endpoint
|
|
414
|
+
// is always VP-authenticated — non-VC auth failures cannot occur here.
|
|
415
|
+
const errorMessage = body;
|
|
416
|
+
const isCredentialInvalid = response.status === 401 ||
|
|
417
|
+
(0, credential_errors_1.isCredentialInvalidError)(errorMessage);
|
|
418
|
+
if (isCredentialInvalid) {
|
|
419
|
+
return {
|
|
420
|
+
success: false,
|
|
421
|
+
error: errorMessage || `invokeTool failed: ${response.status}`,
|
|
422
|
+
errorCode: 'CREDENTIAL_INVALID',
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
return { success: false, error: `invokeTool failed: ${response.status} - ${body}` };
|
|
426
|
+
}
|
|
427
|
+
const result = await response.json();
|
|
428
|
+
return result;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Resolve a human-readable resource identifier to its canonical ID.
|
|
432
|
+
* POST /api/v1/agentd/resource/resolve
|
|
433
|
+
*/
|
|
434
|
+
async resolveResource(params) {
|
|
435
|
+
const url = `${this.baseUrl}/api/v1/agentd/resource/resolve`;
|
|
436
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
437
|
+
method: 'POST',
|
|
438
|
+
headers: this.buildHeaders(),
|
|
439
|
+
body: JSON.stringify(params),
|
|
440
|
+
signal: AbortSignal.timeout(10000),
|
|
441
|
+
});
|
|
442
|
+
if (!response.ok) {
|
|
443
|
+
throw new Error(`resolveResource failed: ${response.status}`);
|
|
444
|
+
}
|
|
445
|
+
const result = await response.json();
|
|
446
|
+
return result.data;
|
|
447
|
+
}
|
|
448
|
+
// ===========================================================================
|
|
449
|
+
// Existing endpoints
|
|
450
|
+
// ===========================================================================
|
|
451
|
+
/**
|
|
452
|
+
* Fetch org-level policy for a project (spec §7.6).
|
|
453
|
+
*/
|
|
454
|
+
async fetchOrgPolicy(projectId) {
|
|
455
|
+
const url = `${this.baseUrl}/api/v1/grant/policy/${encodeURIComponent(projectId)}`;
|
|
456
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
457
|
+
method: 'GET',
|
|
458
|
+
headers: this.buildHeaders(),
|
|
459
|
+
signal: AbortSignal.timeout(10000),
|
|
460
|
+
});
|
|
461
|
+
if (!response.ok) {
|
|
462
|
+
throw new Error(`fetchOrgPolicy failed: ${response.status}`);
|
|
463
|
+
}
|
|
464
|
+
const result = await response.json();
|
|
465
|
+
return result.data;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Verify a VP with the Gateway (spec §7.4 gateway_verified_local).
|
|
469
|
+
* @deprecated Use verifyAndAuthorize instead for full VP+grant check.
|
|
470
|
+
*/
|
|
471
|
+
async verifyVP(vpJwt, nonce, domain) {
|
|
472
|
+
const url = `${this.baseUrl}/api/v1/vp/verify`;
|
|
473
|
+
const response = await this.fetchWithAuthRetry(url, {
|
|
474
|
+
method: 'POST',
|
|
475
|
+
headers: this.buildHeaders(),
|
|
476
|
+
body: JSON.stringify({ vpJwt, nonce, domain }),
|
|
477
|
+
signal: AbortSignal.timeout(10000),
|
|
478
|
+
});
|
|
479
|
+
if (!response.ok) {
|
|
480
|
+
return { valid: false, reason: `VP verification failed: ${response.status}` };
|
|
481
|
+
}
|
|
482
|
+
return await response.json();
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Check if Gateway is reachable.
|
|
486
|
+
*/
|
|
487
|
+
async isReachable() {
|
|
488
|
+
try {
|
|
489
|
+
const response = await fetch(`${this.baseUrl}/health`, {
|
|
490
|
+
method: 'GET',
|
|
491
|
+
signal: AbortSignal.timeout(5000),
|
|
492
|
+
});
|
|
493
|
+
return response.ok;
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
return false;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
exports.AgentdGatewayClient = AgentdGatewayClient;
|
|
501
|
+
//# sourceMappingURL=gateway-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../../src/gateway/gateway-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Identity resolver — manages Agent DIDs per project × client (spec §4.2).
|
|
3
|
+
*
|
|
4
|
+
* Each (projectId, clientName) pair gets its own Agent DID.
|
|
5
|
+
* Private keys stored in OS Keychain, metadata in SQLite `keys` table.
|
|
6
|
+
* Agent DID signs VPs (KB-JWT iss = Agent DID).
|
|
7
|
+
* Root DID is used ONLY for device enrollment.
|
|
8
|
+
*/
|
|
9
|
+
import Database from 'better-sqlite3';
|
|
10
|
+
import { KeyManager } from './key-manager';
|
|
11
|
+
export interface AgentIdentity {
|
|
12
|
+
agentDid: string;
|
|
13
|
+
privateKeyJwk: string;
|
|
14
|
+
projectId: string;
|
|
15
|
+
clientName: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class AgentIdentityResolver {
|
|
18
|
+
private readonly keyManager;
|
|
19
|
+
private readonly db;
|
|
20
|
+
private readonly rootDid;
|
|
21
|
+
constructor(keyManager: KeyManager, db: Database.Database, rootDid: string);
|
|
22
|
+
/**
|
|
23
|
+
* Get or create an Agent DID for the given project × client combination.
|
|
24
|
+
* If one already exists in SQLite (status=active), reuse it.
|
|
25
|
+
* Otherwise, generate a new Agent DID and store in Keychain + SQLite.
|
|
26
|
+
*/
|
|
27
|
+
resolveAgentIdentity(projectId: string, clientName: string): Promise<AgentIdentity>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=agent-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-identity.d.ts","sourceRoot":"","sources":["../../src/identity/agent-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM;IAGlC;;;;OAIG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;CA2C1B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentIdentityResolver = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const key_manager_1 = require("./key-manager");
|
|
6
|
+
const did_manager_1 = require("./did-manager");
|
|
7
|
+
class AgentIdentityResolver {
|
|
8
|
+
keyManager;
|
|
9
|
+
db;
|
|
10
|
+
rootDid;
|
|
11
|
+
constructor(keyManager, db, rootDid) {
|
|
12
|
+
this.keyManager = keyManager;
|
|
13
|
+
this.db = db;
|
|
14
|
+
this.rootDid = rootDid;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get or create an Agent DID for the given project × client combination.
|
|
18
|
+
* If one already exists in SQLite (status=active), reuse it.
|
|
19
|
+
* Otherwise, generate a new Agent DID and store in Keychain + SQLite.
|
|
20
|
+
*/
|
|
21
|
+
async resolveAgentIdentity(projectId, clientName) {
|
|
22
|
+
// Check SQLite for existing agent key
|
|
23
|
+
const existing = this.db.prepare("SELECT did FROM keys WHERE project_id = ? AND client_name = ? AND key_type = 'agent' AND status = 'active'").get(projectId, clientName);
|
|
24
|
+
if (existing) {
|
|
25
|
+
// Load private key from Keychain
|
|
26
|
+
const privateKeyJwk = this.keyManager.getAgentKey(projectId, clientName);
|
|
27
|
+
if (privateKeyJwk) {
|
|
28
|
+
return {
|
|
29
|
+
agentDid: existing.did,
|
|
30
|
+
privateKeyJwk,
|
|
31
|
+
projectId,
|
|
32
|
+
clientName,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Key missing from Keychain but exists in DB — regenerate
|
|
36
|
+
}
|
|
37
|
+
// Generate new Agent DID
|
|
38
|
+
const { did: agentDid, privateKeyJwk, publicKeyJwk } = await did_manager_1.DIDManager.generateAgentDID();
|
|
39
|
+
// Store private key in OS Keychain
|
|
40
|
+
this.keyManager.storeAgentKey(projectId, clientName, privateKeyJwk);
|
|
41
|
+
// Store metadata in SQLite (no private key material)
|
|
42
|
+
const id = (0, crypto_1.randomUUID)();
|
|
43
|
+
const keychainRef = key_manager_1.KeyManager.getKeychainRef('agent', projectId, clientName);
|
|
44
|
+
this.db.prepare(`
|
|
45
|
+
INSERT OR REPLACE INTO keys (
|
|
46
|
+
id, did, key_type, public_key, keychain_ref, storage_type,
|
|
47
|
+
parent_did, project_id, client_name, status, created_at
|
|
48
|
+
) VALUES (?, ?, 'agent', ?, ?, 'keychain', ?, ?, ?, 'active', ?)
|
|
49
|
+
`).run(id, agentDid, JSON.stringify(publicKeyJwk), keychainRef, this.rootDid, projectId, clientName, Date.now());
|
|
50
|
+
return { agentDid, privateKeyJwk, projectId, clientName };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.AgentIdentityResolver = AgentIdentityResolver;
|
|
54
|
+
//# sourceMappingURL=agent-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-identity.js","sourceRoot":"","sources":["../../src/identity/agent-identity.ts"],"names":[],"mappings":";;;AASA,mCAAmC;AACnC,+CAA0C;AAC1C,+CAA0C;AAS1C,MAAa,qBAAqB;IAEb;IACA;IACA;IAHnB,YACmB,UAAsB,EACtB,EAAqB,EACrB,OAAe;QAFf,eAAU,GAAV,UAAU,CAAY;QACtB,OAAE,GAAF,EAAE,CAAmB;QACrB,YAAO,GAAP,OAAO,CAAQ;IAC/B,CAAC;IAEJ;;;;OAIG;IACH,KAAK,CAAC,oBAAoB,CACxB,SAAiB,EACjB,UAAkB;QAElB,sCAAsC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC9B,4GAA4G,CAC7G,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAgC,CAAA;QAE3D,IAAI,QAAQ,EAAE,CAAC;YACb,iCAAiC;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;YACxE,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO;oBACL,QAAQ,EAAE,QAAQ,CAAC,GAAG;oBACtB,aAAa;oBACb,SAAS;oBACT,UAAU;iBACX,CAAA;YACH,CAAC;YACD,0DAA0D;QAC5D,CAAC;QAED,yBAAyB;QACzB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,GAClD,MAAM,wBAAU,CAAC,gBAAgB,EAAE,CAAA;QAErC,mCAAmC;QACnC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;QAEnE,qDAAqD;QACrD,MAAM,EAAE,GAAG,IAAA,mBAAU,GAAE,CAAA;QACvB,MAAM,WAAW,GAAG,wBAAU,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAE7E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKf,CAAC,CAAC,GAAG,CACJ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,WAAW,EACvD,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAChD,CAAA;QAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;IAC3D,CAAC;CACF;AA1DD,sDA0DC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface DIDGenerationResult {
|
|
2
|
+
did: string;
|
|
3
|
+
privateKeyJwk: string;
|
|
4
|
+
publicKeyJwk: {
|
|
5
|
+
kty: string;
|
|
6
|
+
crv?: string;
|
|
7
|
+
x?: string;
|
|
8
|
+
y?: string;
|
|
9
|
+
alg?: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare class DIDManager {
|
|
13
|
+
static generateRootDID(): Promise<DIDGenerationResult>;
|
|
14
|
+
static generateAgentDID(): Promise<DIDGenerationResult>;
|
|
15
|
+
private static generateDID;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=did-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"did-manager.d.ts","sourceRoot":"","sources":["../../src/identity/did-manager.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,CAAC,CAAC,EAAE,MAAM,CAAA;QACV,CAAC,CAAC,EAAE,MAAM,CAAA;QACV,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAED,qBAAa,UAAU;WACR,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;WAI/C,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;mBAIxC,WAAW;CAgBjC"}
|