@kya-os/mcp-i-cloudflare 1.5.10-canary.8 → 1.6.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 +130 -0
- package/dist/__tests__/e2e/test-config.d.ts +37 -0
- package/dist/__tests__/e2e/test-config.d.ts.map +1 -0
- package/dist/__tests__/e2e/test-config.js +62 -0
- package/dist/__tests__/e2e/test-config.js.map +1 -0
- package/dist/adapter.d.ts +44 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +712 -112
- package/dist/adapter.js.map +1 -1
- package/dist/agent.d.ts +103 -25
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +617 -40
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts +0 -8
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +277 -119
- package/dist/app.js.map +1 -1
- package/dist/cache/kv-oauth-config-cache.d.ts +47 -0
- package/dist/cache/kv-oauth-config-cache.d.ts.map +1 -0
- package/dist/cache/kv-oauth-config-cache.js +82 -0
- package/dist/cache/kv-oauth-config-cache.js.map +1 -0
- package/dist/cache/kv-tool-protection-cache.d.ts +26 -1
- package/dist/cache/kv-tool-protection-cache.d.ts.map +1 -1
- package/dist/cache/kv-tool-protection-cache.js +19 -11
- package/dist/cache/kv-tool-protection-cache.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -14
- package/dist/config.js.map +1 -1
- package/dist/helpers/env-mapper.d.ts +60 -1
- package/dist/helpers/env-mapper.d.ts.map +1 -1
- package/dist/helpers/env-mapper.js +136 -6
- package/dist/helpers/env-mapper.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/runtime/audit-logger.d.ts +96 -0
- package/dist/runtime/audit-logger.d.ts.map +1 -0
- package/dist/runtime/audit-logger.js +276 -0
- package/dist/runtime/audit-logger.js.map +1 -0
- package/dist/runtime/oauth-handler.d.ts +5 -0
- package/dist/runtime/oauth-handler.d.ts.map +1 -1
- package/dist/runtime/oauth-handler.js +287 -35
- package/dist/runtime/oauth-handler.js.map +1 -1
- package/dist/runtime.d.ts +12 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +34 -4
- package/dist/runtime.js.map +1 -1
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +133 -18
- package/dist/server.js.map +1 -1
- package/dist/services/admin.service.d.ts +1 -3
- package/dist/services/admin.service.d.ts.map +1 -1
- package/dist/services/admin.service.js +175 -146
- package/dist/services/admin.service.js.map +1 -1
- package/dist/services/consent-audit.service.d.ts +91 -0
- package/dist/services/consent-audit.service.d.ts.map +1 -0
- package/dist/services/consent-audit.service.js +243 -0
- package/dist/services/consent-audit.service.js.map +1 -0
- package/dist/services/consent-config.service.d.ts +2 -2
- package/dist/services/consent-config.service.d.ts.map +1 -1
- package/dist/services/consent-config.service.js +55 -28
- package/dist/services/consent-config.service.js.map +1 -1
- package/dist/services/consent-page-renderer.d.ts +14 -0
- package/dist/services/consent-page-renderer.d.ts.map +1 -1
- package/dist/services/consent-page-renderer.js +54 -27
- package/dist/services/consent-page-renderer.js.map +1 -1
- package/dist/services/consent.service.d.ts +93 -8
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +1817 -553
- package/dist/services/consent.service.js.map +1 -1
- package/dist/services/delegation.service.d.ts.map +1 -1
- package/dist/services/delegation.service.js +67 -29
- package/dist/services/delegation.service.js.map +1 -1
- package/dist/services/idp-token-storage.d.ts +68 -0
- package/dist/services/idp-token-storage.d.ts.map +1 -0
- package/dist/services/idp-token-storage.js +157 -0
- package/dist/services/idp-token-storage.js.map +1 -0
- package/dist/services/oauth-service.d.ts +66 -0
- package/dist/services/oauth-service.d.ts.map +1 -0
- package/dist/services/oauth-service.js +223 -0
- package/dist/services/oauth-service.js.map +1 -0
- package/dist/services/proof.service.d.ts +8 -6
- package/dist/services/proof.service.d.ts.map +1 -1
- package/dist/services/proof.service.js +131 -75
- package/dist/services/proof.service.js.map +1 -1
- package/dist/services/tool-context-builder.d.ts +55 -0
- package/dist/services/tool-context-builder.d.ts.map +1 -0
- package/dist/services/tool-context-builder.js +124 -0
- package/dist/services/tool-context-builder.js.map +1 -0
- package/dist/types/tool-context.d.ts +35 -0
- package/dist/types/tool-context.d.ts.map +1 -0
- package/dist/types/tool-context.js +13 -0
- package/dist/types/tool-context.js.map +1 -0
- package/dist/types.d.ts +31 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/oauth-service-registry.d.ts +65 -0
- package/dist/utils/oauth-service-registry.d.ts.map +1 -0
- package/dist/utils/oauth-service-registry.js +125 -0
- package/dist/utils/oauth-service-registry.js.map +1 -0
- package/package.json +27 -60
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent Audit Service
|
|
3
|
+
*
|
|
4
|
+
* Handles audit logging for consent-related events.
|
|
5
|
+
* These events bypass session deduplication to allow multiple events per session.
|
|
6
|
+
*/
|
|
7
|
+
export class ConsentAuditService {
|
|
8
|
+
proofService;
|
|
9
|
+
auditLogger;
|
|
10
|
+
proofGenerator;
|
|
11
|
+
config;
|
|
12
|
+
runtime;
|
|
13
|
+
logger = {
|
|
14
|
+
error: (message, meta) => {
|
|
15
|
+
console.error(`[ConsentAuditService] ${message}`, meta);
|
|
16
|
+
// TODO: Send to error tracking service
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
constructor(proofService, auditLogger, proofGenerator, config, runtime // REQUIRED for identity
|
|
20
|
+
) {
|
|
21
|
+
this.proofService = proofService;
|
|
22
|
+
this.auditLogger = auditLogger;
|
|
23
|
+
this.proofGenerator = proofGenerator;
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.runtime = runtime;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a minimal SessionContext for audit logging
|
|
29
|
+
* Only sessionId and audience are used by logEvent, but TypeScript requires full SessionContext
|
|
30
|
+
*/
|
|
31
|
+
createSessionContext(sessionId) {
|
|
32
|
+
const now = Math.floor(Date.now() / 1000);
|
|
33
|
+
// Audience is typically from the handshake, but for consent events we use a default
|
|
34
|
+
const audience = "https://kya.vouched.id";
|
|
35
|
+
return {
|
|
36
|
+
sessionId,
|
|
37
|
+
audience,
|
|
38
|
+
nonce: "", // Not used by logEvent, but required by type
|
|
39
|
+
timestamp: now,
|
|
40
|
+
createdAt: now,
|
|
41
|
+
lastActivity: now,
|
|
42
|
+
ttlMinutes: 30,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Log consent page view event
|
|
47
|
+
*/
|
|
48
|
+
async logConsentPageView(event) {
|
|
49
|
+
const timestamp = Math.floor(Date.now() / 1000); // Unix timestamp in seconds
|
|
50
|
+
const identity = await this.getServerIdentity();
|
|
51
|
+
// Log to audit system (bypasses session deduplication)
|
|
52
|
+
await this.auditLogger.logEvent({
|
|
53
|
+
eventType: "consent:page_viewed",
|
|
54
|
+
identity,
|
|
55
|
+
session: this.createSessionContext(event.sessionId),
|
|
56
|
+
eventData: event,
|
|
57
|
+
});
|
|
58
|
+
// Generate proof for dashboard
|
|
59
|
+
const proof = await this.generateConsentProof("consent:page_viewed", event, timestamp);
|
|
60
|
+
await this.proofService.submitProof(proof, {
|
|
61
|
+
session: { id: event.sessionId },
|
|
62
|
+
consentEvent: {
|
|
63
|
+
eventType: "consent:page_viewed",
|
|
64
|
+
timestamp,
|
|
65
|
+
sessionId: event.sessionId,
|
|
66
|
+
agentDid: event.agentDid,
|
|
67
|
+
targetTools: event.targetTools,
|
|
68
|
+
scopes: event.scopes,
|
|
69
|
+
projectId: event.projectId,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Log consent approval event
|
|
75
|
+
*/
|
|
76
|
+
async logConsentApproval(event) {
|
|
77
|
+
const timestamp = Math.floor(Date.now() / 1000); // Unix timestamp in seconds
|
|
78
|
+
const identity = await this.getServerIdentity();
|
|
79
|
+
// Log to audit system
|
|
80
|
+
await this.auditLogger.logEvent({
|
|
81
|
+
eventType: "consent:approved",
|
|
82
|
+
identity,
|
|
83
|
+
session: this.createSessionContext(event.sessionId),
|
|
84
|
+
eventData: event,
|
|
85
|
+
});
|
|
86
|
+
// Generate proof
|
|
87
|
+
const proof = await this.generateConsentProof("consent:approved", event, timestamp);
|
|
88
|
+
await this.proofService.submitProof(proof, {
|
|
89
|
+
session: { id: event.sessionId },
|
|
90
|
+
consentEvent: {
|
|
91
|
+
eventType: "consent:approved",
|
|
92
|
+
timestamp,
|
|
93
|
+
sessionId: event.sessionId,
|
|
94
|
+
userDid: event.userDid,
|
|
95
|
+
agentDid: event.agentDid,
|
|
96
|
+
targetTools: event.targetTools,
|
|
97
|
+
scopes: event.scopes,
|
|
98
|
+
delegationId: event.delegationId,
|
|
99
|
+
projectId: event.projectId,
|
|
100
|
+
termsAccepted: event.termsAccepted,
|
|
101
|
+
oauthIdentity: event.oauthIdentity,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Log when user needs credentials before delegation
|
|
107
|
+
*/
|
|
108
|
+
async logCredentialRequired(event) {
|
|
109
|
+
const timestamp = Math.floor(Date.now() / 1000); // Unix timestamp in seconds
|
|
110
|
+
const identity = await this.getServerIdentity();
|
|
111
|
+
// Log to audit system
|
|
112
|
+
await this.auditLogger.logEvent({
|
|
113
|
+
eventType: "consent:credential_required",
|
|
114
|
+
identity,
|
|
115
|
+
session: this.createSessionContext(event.sessionId),
|
|
116
|
+
eventData: event,
|
|
117
|
+
});
|
|
118
|
+
// Generate proof
|
|
119
|
+
const proof = await this.generateConsentProof("consent:credential_required", event, timestamp);
|
|
120
|
+
await this.proofService.submitProof(proof, {
|
|
121
|
+
session: { id: event.sessionId },
|
|
122
|
+
consentEvent: {
|
|
123
|
+
eventType: "consent:credential_required",
|
|
124
|
+
timestamp,
|
|
125
|
+
sessionId: event.sessionId,
|
|
126
|
+
agentDid: event.agentDid,
|
|
127
|
+
targetTools: event.targetTools,
|
|
128
|
+
scopes: event.scopes,
|
|
129
|
+
projectId: event.projectId,
|
|
130
|
+
credentialStatus: "required",
|
|
131
|
+
oauthIdentity: event.oauthProvider
|
|
132
|
+
? {
|
|
133
|
+
provider: event.oauthProvider,
|
|
134
|
+
identifier: "",
|
|
135
|
+
}
|
|
136
|
+
: undefined,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Log delegation creation
|
|
142
|
+
*/
|
|
143
|
+
async logDelegationCreated(event) {
|
|
144
|
+
const timestamp = Math.floor(Date.now() / 1000); // Unix timestamp in seconds
|
|
145
|
+
const identity = await this.getServerIdentity();
|
|
146
|
+
// Log to audit system
|
|
147
|
+
await this.auditLogger.logEvent({
|
|
148
|
+
eventType: "consent:delegation_created",
|
|
149
|
+
identity,
|
|
150
|
+
session: this.createSessionContext(event.sessionId),
|
|
151
|
+
eventData: event,
|
|
152
|
+
});
|
|
153
|
+
// Generate proof
|
|
154
|
+
const proof = await this.generateConsentProof("consent:delegation_created", event, timestamp);
|
|
155
|
+
await this.proofService.submitProof(proof, {
|
|
156
|
+
session: { id: event.sessionId },
|
|
157
|
+
consentEvent: {
|
|
158
|
+
eventType: "consent:delegation_created",
|
|
159
|
+
timestamp,
|
|
160
|
+
sessionId: event.sessionId,
|
|
161
|
+
delegationId: event.delegationId,
|
|
162
|
+
agentDid: event.agentDid,
|
|
163
|
+
userDid: event.userDid,
|
|
164
|
+
targetTools: event.targetTools,
|
|
165
|
+
scopes: event.scopes,
|
|
166
|
+
projectId: event.projectId,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Generate proof for consent event
|
|
172
|
+
*
|
|
173
|
+
* IMPORTANT: Consent events use synthetic canonical request/response forms
|
|
174
|
+
* since they represent system events, not actual HTTP requests. The MCP-I
|
|
175
|
+
* proof spec allows synthetic forms for system-generated events that don't
|
|
176
|
+
* correspond to actual HTTP requests.
|
|
177
|
+
*
|
|
178
|
+
* ✅ FIXED: Added nonce generation, fixed SessionContext structure
|
|
179
|
+
*/
|
|
180
|
+
async generateConsentProof(eventType, event, timestamp) {
|
|
181
|
+
const identity = await this.getServerIdentity();
|
|
182
|
+
// ✅ CRITICAL: Generate nonce for this session (REQUIRED by SessionContext)
|
|
183
|
+
const nonce = await this.runtime.issueNonce(event.sessionId);
|
|
184
|
+
// Synthetic canonical forms for consent events
|
|
185
|
+
// Use ToolRequest/ToolResponse format expected by CloudflareProofGenerator
|
|
186
|
+
const canonicalRequest = {
|
|
187
|
+
method: "POST",
|
|
188
|
+
params: {
|
|
189
|
+
eventType,
|
|
190
|
+
timestamp,
|
|
191
|
+
...event,
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
const canonicalResponse = {
|
|
195
|
+
data: {
|
|
196
|
+
success: true,
|
|
197
|
+
eventType,
|
|
198
|
+
timestamp,
|
|
199
|
+
serverDid: identity.did,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
// ✅ FIXED: Build SessionContext with all required fields
|
|
203
|
+
// ✅ FIXED: Remove agentDid and clientDid from SessionContext (not part of spec)
|
|
204
|
+
// ✅ FIXED: Move clientDid to ProofOptions
|
|
205
|
+
const now = Math.floor(Date.now() / 1000);
|
|
206
|
+
const sessionContext = {
|
|
207
|
+
sessionId: event.sessionId,
|
|
208
|
+
nonce, // ✅ REQUIRED - was missing!
|
|
209
|
+
audience: "https://kya.vouched.id",
|
|
210
|
+
timestamp: now,
|
|
211
|
+
createdAt: now,
|
|
212
|
+
lastActivity: now,
|
|
213
|
+
ttlMinutes: 30,
|
|
214
|
+
};
|
|
215
|
+
return await this.proofGenerator.generateProof(canonicalRequest, canonicalResponse, sessionContext, // Only nonce, audience, sessionId
|
|
216
|
+
{
|
|
217
|
+
scopeId: eventType,
|
|
218
|
+
clientDid: event.userDid, // ✅ clientDid belongs in options, not session
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get server's actual identity (NO FALLBACK)
|
|
223
|
+
*/
|
|
224
|
+
async getServerIdentity() {
|
|
225
|
+
if (!this.runtime) {
|
|
226
|
+
throw new Error("Runtime required for consent audit - cannot use fallback identity");
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const identity = await this.runtime.getIdentity();
|
|
230
|
+
if (!identity) {
|
|
231
|
+
throw new Error("No active identity available");
|
|
232
|
+
}
|
|
233
|
+
return identity;
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
this.logger.error("Failed to get server identity", {
|
|
237
|
+
error: error instanceof Error ? error.message : String(error),
|
|
238
|
+
});
|
|
239
|
+
throw new Error("Server identity required for consent audit logging");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=consent-audit.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-audit.service.js","sourceRoot":"","sources":["../../src/services/consent-audit.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Related Spec: MCP-I Phase 0 Implementation Plan, Task B.3
|
|
8
8
|
*/
|
|
9
|
-
import type { CloudflareEnv } from
|
|
10
|
-
import type { ConsentConfig } from
|
|
9
|
+
import type { CloudflareEnv } from "../types";
|
|
10
|
+
import type { ConsentConfig } from "@kya-os/contracts/consent";
|
|
11
11
|
/**
|
|
12
12
|
* Consent Config Service
|
|
13
13
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent-config.service.d.ts","sourceRoot":"","sources":["../../src/services/consent-config.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"consent-config.service.d.ts","sourceRoot":"","sources":["../../src/services/consent-config.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAW/D;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAgB;gBAEf,GAAG,EAAE,aAAa;IAI9B;;;;;;;;;;OAUG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA0IjE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;OAIG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcxD"}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Related Spec: MCP-I Phase 0 Implementation Plan, Task B.3
|
|
8
8
|
*/
|
|
9
|
-
import { DEFAULT_AGENTSHIELD_URL } from
|
|
10
|
-
import { validateConsentConfig } from
|
|
9
|
+
import { DEFAULT_AGENTSHIELD_URL } from "../constants";
|
|
10
|
+
import { validateConsentConfig, } from "@kya-os/contracts/consent";
|
|
11
11
|
/**
|
|
12
12
|
* Default consent configuration cache TTL (5 minutes)
|
|
13
13
|
*/
|
|
@@ -39,22 +39,37 @@ export class ConsentConfigService {
|
|
|
39
39
|
if (cache) {
|
|
40
40
|
const cacheKey = `consent:config:${projectId}`;
|
|
41
41
|
try {
|
|
42
|
-
const cached = await cache.get(cacheKey,
|
|
42
|
+
const cached = await cache.get(cacheKey, "json");
|
|
43
43
|
if (cached) {
|
|
44
44
|
// Validate cached config
|
|
45
45
|
const validation = validateConsentConfig(cached);
|
|
46
46
|
if (validation.success) {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
// ✅ Merge cached config with defaults to ensure terms checkbox is always shown
|
|
48
|
+
const cachedConfig = validation.data;
|
|
49
|
+
const defaults = this.getDefaultConfig();
|
|
50
|
+
const mergedConfig = {
|
|
51
|
+
...cachedConfig, // Start with cached config
|
|
52
|
+
// Merge terms: ensure required is always true if terms exist (unless explicitly false)
|
|
53
|
+
terms: cachedConfig.terms
|
|
54
|
+
? {
|
|
55
|
+
...defaults.terms, // Start with defaults (required: true)
|
|
56
|
+
...cachedConfig.terms, // Override with cached values
|
|
57
|
+
// ✅ CRITICAL: Always set required to true if terms exist (unless explicitly false)
|
|
58
|
+
required: cachedConfig.terms.required !== false ? true : false,
|
|
59
|
+
}
|
|
60
|
+
: defaults.terms,
|
|
61
|
+
};
|
|
62
|
+
console.log("[ConsentConfig] ✅ Config retrieved from cache");
|
|
63
|
+
return mergedConfig;
|
|
49
64
|
}
|
|
50
65
|
else {
|
|
51
|
-
console.warn(
|
|
66
|
+
console.warn("[ConsentConfig] Cached config invalid, fetching fresh:", validation.error);
|
|
52
67
|
// Cache is invalid, continue to fetch fresh
|
|
53
68
|
}
|
|
54
69
|
}
|
|
55
70
|
}
|
|
56
71
|
catch (error) {
|
|
57
|
-
console.warn(
|
|
72
|
+
console.warn("[ConsentConfig] Cache read error, fetching fresh:", error);
|
|
58
73
|
// Continue to fetch fresh on cache error
|
|
59
74
|
}
|
|
60
75
|
}
|
|
@@ -63,14 +78,13 @@ export class ConsentConfigService {
|
|
|
63
78
|
const agentShieldUrl = this.env.AGENTSHIELD_API_URL || DEFAULT_AGENTSHIELD_URL;
|
|
64
79
|
const apiKey = this.env.AGENTSHIELD_API_KEY;
|
|
65
80
|
if (!apiKey) {
|
|
66
|
-
console.warn(
|
|
81
|
+
console.warn("[ConsentConfig] No API key configured, using defaults");
|
|
67
82
|
return this.getDefaultConfig();
|
|
68
83
|
}
|
|
69
84
|
const response = await fetch(`${agentShieldUrl}/api/v1/bouncer/projects/${projectId}/consent-config`, {
|
|
70
85
|
headers: {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
'Content-Type': 'application/json',
|
|
86
|
+
Authorization: `Bearer ${apiKey}`,
|
|
87
|
+
"Content-Type": "application/json",
|
|
74
88
|
},
|
|
75
89
|
});
|
|
76
90
|
if (response.ok) {
|
|
@@ -78,39 +92,52 @@ export class ConsentConfigService {
|
|
|
78
92
|
// Validate response
|
|
79
93
|
const validation = validateConsentConfig(configData);
|
|
80
94
|
if (validation.success) {
|
|
81
|
-
const
|
|
82
|
-
//
|
|
95
|
+
const apiConfig = validation.data;
|
|
96
|
+
// ✅ Merge with defaults to ensure terms checkbox is always shown
|
|
97
|
+
// This ensures that if API returns config without terms, we use default terms
|
|
98
|
+
const defaults = this.getDefaultConfig();
|
|
99
|
+
const config = {
|
|
100
|
+
...apiConfig, // Start with API config
|
|
101
|
+
// Merge terms: if API provides terms but required is false/undefined, ensure required is true
|
|
102
|
+
terms: apiConfig.terms
|
|
103
|
+
? {
|
|
104
|
+
...defaults.terms, // Start with defaults (required: true)
|
|
105
|
+
...apiConfig.terms, // Override with API values
|
|
106
|
+
// ✅ CRITICAL: Always set required to true if terms exist (unless API explicitly sets to false)
|
|
107
|
+
// This ensures checkbox always appears for delegation flows
|
|
108
|
+
required: apiConfig.terms.required !== false ? true : false,
|
|
109
|
+
}
|
|
110
|
+
: defaults.terms,
|
|
111
|
+
};
|
|
112
|
+
// Cache merged config for 5 minutes
|
|
83
113
|
if (cache) {
|
|
84
114
|
try {
|
|
85
115
|
await cache.put(`consent:config:${projectId}`, JSON.stringify(config), { expirationTtl: CONSENT_CONFIG_CACHE_TTL });
|
|
86
|
-
console.log(
|
|
116
|
+
console.log("[ConsentConfig] ✅ Config fetched and cached");
|
|
87
117
|
}
|
|
88
118
|
catch (cacheError) {
|
|
89
|
-
console.warn(
|
|
119
|
+
console.warn("[ConsentConfig] Cache write failed (non-fatal):", cacheError);
|
|
90
120
|
}
|
|
91
121
|
}
|
|
92
122
|
return config;
|
|
93
123
|
}
|
|
94
124
|
else {
|
|
95
|
-
console.warn(
|
|
125
|
+
console.warn("[ConsentConfig] API response invalid, using defaults:", validation.error.errors || validation.error.message || String(validation.error));
|
|
96
126
|
// Don't cache invalid configs - return defaults instead
|
|
97
127
|
return this.getDefaultConfig();
|
|
98
128
|
}
|
|
99
129
|
}
|
|
100
130
|
else if (response.status === 404) {
|
|
101
|
-
console.log(
|
|
131
|
+
console.log("[ConsentConfig] Project not found, using defaults");
|
|
102
132
|
return this.getDefaultConfig();
|
|
103
133
|
}
|
|
104
134
|
else {
|
|
105
|
-
console.warn(
|
|
106
|
-
url: `${agentShieldUrl}/api/v1/bouncer/projects/${projectId}/consent-config`,
|
|
107
|
-
projectId,
|
|
108
|
-
});
|
|
135
|
+
console.warn("[ConsentConfig] API request failed:", response.status, response.statusText);
|
|
109
136
|
return this.getDefaultConfig();
|
|
110
137
|
}
|
|
111
138
|
}
|
|
112
139
|
catch (error) {
|
|
113
|
-
console.warn(
|
|
140
|
+
console.warn("[ConsentConfig] Failed to fetch config, using defaults:", error);
|
|
114
141
|
return this.getDefaultConfig();
|
|
115
142
|
}
|
|
116
143
|
}
|
|
@@ -124,15 +151,15 @@ export class ConsentConfigService {
|
|
|
124
151
|
getDefaultConfig() {
|
|
125
152
|
return {
|
|
126
153
|
branding: {
|
|
127
|
-
primaryColor:
|
|
128
|
-
theme:
|
|
154
|
+
primaryColor: "#2563eb",
|
|
155
|
+
theme: "light",
|
|
129
156
|
},
|
|
130
157
|
terms: {
|
|
131
|
-
text:
|
|
158
|
+
text: "By approving, you grant permission for this agent to perform actions on your behalf. You can revoke this permission at any time.",
|
|
132
159
|
required: true,
|
|
133
160
|
},
|
|
134
161
|
ui: {
|
|
135
|
-
theme:
|
|
162
|
+
theme: "light",
|
|
136
163
|
popupEnabled: false,
|
|
137
164
|
autoClose: false,
|
|
138
165
|
},
|
|
@@ -151,10 +178,10 @@ export class ConsentConfigService {
|
|
|
151
178
|
try {
|
|
152
179
|
const cacheKey = `consent:config:${projectId}`;
|
|
153
180
|
await cache.delete(cacheKey);
|
|
154
|
-
console.log(
|
|
181
|
+
console.log("[ConsentConfig] Cache invalidated for project:", projectId);
|
|
155
182
|
}
|
|
156
183
|
catch (error) {
|
|
157
|
-
console.warn(
|
|
184
|
+
console.warn("[ConsentConfig] Failed to invalidate cache:", error);
|
|
158
185
|
}
|
|
159
186
|
}
|
|
160
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent-config.service.js","sourceRoot":"","sources":["../../src/services/consent-config.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,
|
|
1
|
+
{"version":3,"file":"consent-config.service.js","sourceRoot":"","sources":["../../src/services/consent-config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,6 +102,20 @@ export declare class ConsentPageRenderer {
|
|
|
102
102
|
* @returns HTML string
|
|
103
103
|
*/
|
|
104
104
|
private renderHeader;
|
|
105
|
+
/**
|
|
106
|
+
* Get provider branding information
|
|
107
|
+
*
|
|
108
|
+
* @param provider - Provider name
|
|
109
|
+
* @returns Provider branding (color and display name)
|
|
110
|
+
*/
|
|
111
|
+
private getProviderBranding;
|
|
112
|
+
/**
|
|
113
|
+
* Render provider badge
|
|
114
|
+
*
|
|
115
|
+
* @param provider - Provider name
|
|
116
|
+
* @returns HTML string for provider badge
|
|
117
|
+
*/
|
|
118
|
+
private renderProviderBadge;
|
|
105
119
|
/**
|
|
106
120
|
* Render scopes list
|
|
107
121
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent-page-renderer.d.ts","sourceRoot":"","sources":["../../src/services/consent-page-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAIjB,aAAa,EACd,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B;;;;;;OAMG;IACH,MAAM,CACJ,MAAM,EAAE,iBAAiB,GAAG;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAC1E,aAAa,CAAC,EAAE,aAAa,GAC5B,MAAM;IAyBT;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;IA6B5E;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAanB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IA0BtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"consent-page-renderer.d.ts","sourceRoot":"","sources":["../../src/services/consent-page-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAIjB,aAAa,EACd,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B;;;;;;OAMG;IACH,MAAM,CACJ,MAAM,EAAE,iBAAiB,GAAG;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAC1E,aAAa,CAAC,EAAE,aAAa,GAC5B,MAAM;IAyBT;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;IA6B5E;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAanB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IA0BtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA6D1B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAqDlB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;CAoJrB"}
|
|
@@ -259,14 +259,56 @@ export class ConsentPageRenderer {
|
|
|
259
259
|
? `<p class="text-sm text-gray-600 mb-2">${branding.companyName}</p>`
|
|
260
260
|
: "";
|
|
261
261
|
const primaryColor = branding?.primaryColor || "#2563eb";
|
|
262
|
+
// Phase 2: Render provider badge if provider is specified
|
|
263
|
+
const providerBadge = config.provider
|
|
264
|
+
? this.renderProviderBadge(config.provider)
|
|
265
|
+
: "";
|
|
262
266
|
return `
|
|
263
267
|
<div class="text-center mb-6">
|
|
264
268
|
${logoHtml}
|
|
265
269
|
${companyName}
|
|
270
|
+
${providerBadge}
|
|
266
271
|
<h1 class="text-2xl font-bold mb-2" style="color: ${primaryColor};">Authorize ${config.tool}</h1>
|
|
267
272
|
<p class="text-gray-600">${config.toolDescription}</p>
|
|
268
273
|
</div>`;
|
|
269
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Get provider branding information
|
|
277
|
+
*
|
|
278
|
+
* @param provider - Provider name
|
|
279
|
+
* @returns Provider branding (color and display name)
|
|
280
|
+
*/
|
|
281
|
+
getProviderBranding(provider) {
|
|
282
|
+
const branding = {
|
|
283
|
+
github: { color: "#24292e", name: "GitHub" },
|
|
284
|
+
google: { color: "#4285f4", name: "Google" },
|
|
285
|
+
microsoft: { color: "#0078d4", name: "Microsoft" },
|
|
286
|
+
slack: { color: "#4a154b", name: "Slack" },
|
|
287
|
+
auth0: { color: "#eb5424", name: "Auth0" },
|
|
288
|
+
okta: { color: "#007dc1", name: "Okta" },
|
|
289
|
+
};
|
|
290
|
+
return (branding[provider.toLowerCase()] || {
|
|
291
|
+
color: "#666",
|
|
292
|
+
name: provider.charAt(0).toUpperCase() + provider.slice(1),
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Render provider badge
|
|
297
|
+
*
|
|
298
|
+
* @param provider - Provider name
|
|
299
|
+
* @returns HTML string for provider badge
|
|
300
|
+
*/
|
|
301
|
+
renderProviderBadge(provider) {
|
|
302
|
+
const branding = this.getProviderBranding(provider);
|
|
303
|
+
const providerNameEscaped = this.escapeHtml(branding.name);
|
|
304
|
+
const providerColorEscaped = this.escapeHtml(branding.color);
|
|
305
|
+
return `
|
|
306
|
+
<div class="mb-3">
|
|
307
|
+
<span class="inline-block px-3 py-1 rounded-full text-xs font-semibold text-white" style="background-color: ${providerColorEscaped};">
|
|
308
|
+
${providerNameEscaped}
|
|
309
|
+
</span>
|
|
310
|
+
</div>`;
|
|
311
|
+
}
|
|
270
312
|
/**
|
|
271
313
|
* Render scopes list
|
|
272
314
|
*
|
|
@@ -412,11 +454,11 @@ export class ConsentPageRenderer {
|
|
|
412
454
|
<input type="hidden" name="session_id" value="${sessionId}" />
|
|
413
455
|
<input type="hidden" name="project_id" value="${projectId}" />
|
|
414
456
|
|
|
415
|
-
${config.terms
|
|
457
|
+
${config.terms?.required
|
|
416
458
|
? `
|
|
417
459
|
<div class="mb-4">
|
|
418
460
|
<label class="flex items-start">
|
|
419
|
-
<input type="checkbox" name="termsAccepted"
|
|
461
|
+
<input type="checkbox" name="termsAccepted" required class="mr-2 mt-1" />
|
|
420
462
|
<span class="text-sm text-gray-700">I accept the terms and conditions</span>
|
|
421
463
|
</label>
|
|
422
464
|
</div>
|
|
@@ -451,21 +493,15 @@ export class ConsentPageRenderer {
|
|
|
451
493
|
return `
|
|
452
494
|
<script>
|
|
453
495
|
(function() {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
const oauthRequired = ${oauthRequiredJs};
|
|
464
|
-
const oauthUrl = ${oauthUrlJs};
|
|
465
|
-
|
|
466
|
-
form.addEventListener('submit', async function(e) {
|
|
467
|
-
e.preventDefault();
|
|
468
|
-
e.stopPropagation();
|
|
496
|
+
const form = document.getElementById('consent-form');
|
|
497
|
+
if (!form) return;
|
|
498
|
+
|
|
499
|
+
const serverUrl = ${serverUrlJs};
|
|
500
|
+
const oauthRequired = ${oauthRequiredJs};
|
|
501
|
+
const oauthUrl = ${oauthUrlJs};
|
|
502
|
+
|
|
503
|
+
form.addEventListener('submit', async function(e) {
|
|
504
|
+
e.preventDefault();
|
|
469
505
|
|
|
470
506
|
// Check if OAuth is required before submitting
|
|
471
507
|
if (oauthRequired && oauthUrl) {
|
|
@@ -520,8 +556,7 @@ export class ConsentPageRenderer {
|
|
|
520
556
|
project_id: formData.get('project_id'),
|
|
521
557
|
termsAccepted: formData.get('termsAccepted') === 'on',
|
|
522
558
|
customFields: {},
|
|
523
|
-
|
|
524
|
-
oauth_identity: extractedOAuthIdentity,
|
|
559
|
+
oauth_identity: extractedOAuthIdentity
|
|
525
560
|
};
|
|
526
561
|
|
|
527
562
|
// Collect custom fields
|
|
@@ -587,14 +622,6 @@ export class ConsentPageRenderer {
|
|
|
587
622
|
alert('Error submitting authorization: ' + (error instanceof Error ? error.message : String(error)));
|
|
588
623
|
}
|
|
589
624
|
});
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// Initialize when DOM is ready
|
|
593
|
-
if (document.readyState === 'loading') {
|
|
594
|
-
document.addEventListener('DOMContentLoaded', init);
|
|
595
|
-
} else {
|
|
596
|
-
init();
|
|
597
|
-
}
|
|
598
625
|
})();
|
|
599
626
|
</script>`;
|
|
600
627
|
}
|