@kya-os/mcp-i-cloudflare 1.5.10-canary.9 → 1.6.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.
Files changed (102) hide show
  1. package/README.md +130 -0
  2. package/dist/__tests__/e2e/test-config.d.ts +37 -0
  3. package/dist/__tests__/e2e/test-config.d.ts.map +1 -0
  4. package/dist/__tests__/e2e/test-config.js +62 -0
  5. package/dist/__tests__/e2e/test-config.js.map +1 -0
  6. package/dist/adapter.d.ts +44 -1
  7. package/dist/adapter.d.ts.map +1 -1
  8. package/dist/adapter.js +712 -112
  9. package/dist/adapter.js.map +1 -1
  10. package/dist/agent.d.ts +117 -25
  11. package/dist/agent.d.ts.map +1 -1
  12. package/dist/agent.js +664 -40
  13. package/dist/agent.js.map +1 -1
  14. package/dist/app.d.ts +0 -8
  15. package/dist/app.d.ts.map +1 -1
  16. package/dist/app.js +348 -119
  17. package/dist/app.js.map +1 -1
  18. package/dist/cache/kv-oauth-config-cache.d.ts +47 -0
  19. package/dist/cache/kv-oauth-config-cache.d.ts.map +1 -0
  20. package/dist/cache/kv-oauth-config-cache.js +82 -0
  21. package/dist/cache/kv-oauth-config-cache.js.map +1 -0
  22. package/dist/cache/kv-tool-protection-cache.d.ts +26 -1
  23. package/dist/cache/kv-tool-protection-cache.d.ts.map +1 -1
  24. package/dist/cache/kv-tool-protection-cache.js +19 -11
  25. package/dist/cache/kv-tool-protection-cache.js.map +1 -1
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +39 -14
  28. package/dist/config.js.map +1 -1
  29. package/dist/helpers/env-mapper.d.ts +60 -1
  30. package/dist/helpers/env-mapper.d.ts.map +1 -1
  31. package/dist/helpers/env-mapper.js +136 -6
  32. package/dist/helpers/env-mapper.js.map +1 -1
  33. package/dist/index.d.ts +4 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +16 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/runtime/audit-logger.d.ts +96 -0
  38. package/dist/runtime/audit-logger.d.ts.map +1 -0
  39. package/dist/runtime/audit-logger.js +276 -0
  40. package/dist/runtime/audit-logger.js.map +1 -0
  41. package/dist/runtime/oauth-handler.d.ts +5 -0
  42. package/dist/runtime/oauth-handler.d.ts.map +1 -1
  43. package/dist/runtime/oauth-handler.js +287 -35
  44. package/dist/runtime/oauth-handler.js.map +1 -1
  45. package/dist/runtime.d.ts +12 -1
  46. package/dist/runtime.d.ts.map +1 -1
  47. package/dist/runtime.js +34 -4
  48. package/dist/runtime.js.map +1 -1
  49. package/dist/server.d.ts +7 -0
  50. package/dist/server.d.ts.map +1 -1
  51. package/dist/server.js +120 -29
  52. package/dist/server.js.map +1 -1
  53. package/dist/services/admin.service.d.ts +1 -3
  54. package/dist/services/admin.service.d.ts.map +1 -1
  55. package/dist/services/admin.service.js +175 -146
  56. package/dist/services/admin.service.js.map +1 -1
  57. package/dist/services/consent-audit.service.d.ts +91 -0
  58. package/dist/services/consent-audit.service.d.ts.map +1 -0
  59. package/dist/services/consent-audit.service.js +243 -0
  60. package/dist/services/consent-audit.service.js.map +1 -0
  61. package/dist/services/consent-config.service.d.ts +2 -2
  62. package/dist/services/consent-config.service.d.ts.map +1 -1
  63. package/dist/services/consent-config.service.js +55 -28
  64. package/dist/services/consent-config.service.js.map +1 -1
  65. package/dist/services/consent-page-renderer.d.ts +14 -0
  66. package/dist/services/consent-page-renderer.d.ts.map +1 -1
  67. package/dist/services/consent-page-renderer.js +54 -27
  68. package/dist/services/consent-page-renderer.js.map +1 -1
  69. package/dist/services/consent.service.d.ts +93 -8
  70. package/dist/services/consent.service.d.ts.map +1 -1
  71. package/dist/services/consent.service.js +1817 -553
  72. package/dist/services/consent.service.js.map +1 -1
  73. package/dist/services/delegation.service.d.ts.map +1 -1
  74. package/dist/services/delegation.service.js +67 -29
  75. package/dist/services/delegation.service.js.map +1 -1
  76. package/dist/services/idp-token-storage.d.ts +68 -0
  77. package/dist/services/idp-token-storage.d.ts.map +1 -0
  78. package/dist/services/idp-token-storage.js +157 -0
  79. package/dist/services/idp-token-storage.js.map +1 -0
  80. package/dist/services/oauth-service.d.ts +66 -0
  81. package/dist/services/oauth-service.d.ts.map +1 -0
  82. package/dist/services/oauth-service.js +223 -0
  83. package/dist/services/oauth-service.js.map +1 -0
  84. package/dist/services/proof.service.d.ts +8 -6
  85. package/dist/services/proof.service.d.ts.map +1 -1
  86. package/dist/services/proof.service.js +131 -75
  87. package/dist/services/proof.service.js.map +1 -1
  88. package/dist/services/tool-context-builder.d.ts +55 -0
  89. package/dist/services/tool-context-builder.d.ts.map +1 -0
  90. package/dist/services/tool-context-builder.js +124 -0
  91. package/dist/services/tool-context-builder.js.map +1 -0
  92. package/dist/types/tool-context.d.ts +35 -0
  93. package/dist/types/tool-context.d.ts.map +1 -0
  94. package/dist/types/tool-context.js +13 -0
  95. package/dist/types/tool-context.js.map +1 -0
  96. package/dist/types.d.ts +31 -2
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/utils/oauth-service-registry.d.ts +65 -0
  99. package/dist/utils/oauth-service-registry.d.ts.map +1 -0
  100. package/dist/utils/oauth-service-registry.js +125 -0
  101. package/dist/utils/oauth-service-registry.js.map +1 -0
  102. 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 '../types';
10
- import type { ConsentConfig } from '@kya-os/contracts/consent';
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;AAQ/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;IA0FjE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;OAIG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcxD"}
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 '../constants';
10
- import { validateConsentConfig } from '@kya-os/contracts/consent';
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, 'json');
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
- console.log('[ConsentConfig]Config retrieved from cache');
48
- return validation.data;
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('[ConsentConfig] Cached config invalid, fetching fresh:', validation.error);
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('[ConsentConfig] Cache read error, fetching fresh:', error);
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('[ConsentConfig] No API key configured, using defaults');
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
- 'X-API-Key': apiKey,
72
- 'X-Project-Id': projectId,
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 config = validation.data;
82
- // Cache for 5 minutes
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('[ConsentConfig] ✅ Config fetched and cached');
116
+ console.log("[ConsentConfig] ✅ Config fetched and cached");
87
117
  }
88
118
  catch (cacheError) {
89
- console.warn('[ConsentConfig] Cache write failed (non-fatal):', cacheError);
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('[ConsentConfig] API response invalid, using defaults:', validation.error);
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('[ConsentConfig] Project not found (404), using defaults. Endpoint may not exist yet on AgentShield.');
131
+ console.log("[ConsentConfig] Project not found, using defaults");
102
132
  return this.getDefaultConfig();
103
133
  }
104
134
  else {
105
- console.warn('[ConsentConfig] API request failed:', response.status, response.statusText, {
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('[ConsentConfig] Failed to fetch config, using defaults:', error);
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: '#2563eb',
128
- theme: 'light',
154
+ primaryColor: "#2563eb",
155
+ theme: "light",
129
156
  },
130
157
  terms: {
131
- text: 'By approving, you grant permission for this agent to perform actions on your behalf. You can revoke this permission at any time.',
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: 'light',
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('[ConsentConfig] Cache invalidated for project:', projectId);
181
+ console.log("[ConsentConfig] Cache invalidated for project:", projectId);
155
182
  }
156
183
  catch (error) {
157
- console.warn('[ConsentConfig] Failed to invalidate cache:', error);
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":"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"}
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;IAuBpB;;;;;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;CAmKrB"}
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 && (config.terms.text || config.terms.url)
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" ${config.terms.required ? "required" : ""} class="mr-2 mt-1" />
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
- // Wait for DOM to be ready
455
- function init() {
456
- const form = document.getElementById('consent-form');
457
- if (!form) {
458
- console.error('Consent form not found');
459
- return;
460
- }
461
-
462
- const serverUrl = ${serverUrlJs};
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
- // Include oauth_identity (may be null if not available)
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
  }