@kya-os/mcp-i-cloudflare 1.4.1-canary.1 → 1.4.1-canary.2
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/dist/adapter.d.ts +6 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +29 -0
- package/dist/adapter.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +5 -0
- package/dist/app.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +11 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +48 -4
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/services/consent-config.service.d.ts +46 -0
- package/dist/services/consent-config.service.d.ts.map +1 -0
- package/dist/services/consent-config.service.js +157 -0
- package/dist/services/consent-config.service.js.map +1 -0
- package/dist/services/consent-page-renderer.d.ts +137 -0
- package/dist/services/consent-page-renderer.d.ts.map +1 -0
- package/dist/services/consent-page-renderer.js +489 -0
- package/dist/services/consent-page-renderer.js.map +1 -0
- package/dist/services/consent.service.d.ts +57 -3
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +360 -16
- package/dist/services/consent.service.js.map +1 -1
- package/dist/services/transport.service.d.ts +47 -0
- package/dist/services/transport.service.d.ts.map +1 -0
- package/dist/services/transport.service.js +76 -0
- package/dist/services/transport.service.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent Config Service
|
|
3
|
+
*
|
|
4
|
+
* Fetches consent configuration from AgentShield API with caching.
|
|
5
|
+
* Falls back to sensible defaults if API is unavailable.
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I Phase 0 Implementation Plan, Task B.3
|
|
8
|
+
*/
|
|
9
|
+
import { DEFAULT_AGENTSHIELD_URL } from '../constants';
|
|
10
|
+
import { validateConsentConfig } from '@kya-os/contracts/consent';
|
|
11
|
+
/**
|
|
12
|
+
* Default consent configuration cache TTL (5 minutes)
|
|
13
|
+
*/
|
|
14
|
+
const CONSENT_CONFIG_CACHE_TTL = 300; // 5 minutes in seconds
|
|
15
|
+
/**
|
|
16
|
+
* Consent Config Service
|
|
17
|
+
*
|
|
18
|
+
* Manages fetching and caching of consent configuration from AgentShield
|
|
19
|
+
*/
|
|
20
|
+
export class ConsentConfigService {
|
|
21
|
+
env;
|
|
22
|
+
constructor(env) {
|
|
23
|
+
this.env = env;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get consent configuration for a project
|
|
27
|
+
*
|
|
28
|
+
* Fetches from AgentShield API with caching. Falls back to defaults if:
|
|
29
|
+
* - API is unavailable
|
|
30
|
+
* - API key is missing
|
|
31
|
+
* - Project not found
|
|
32
|
+
*
|
|
33
|
+
* @param projectId - Project ID from AgentShield
|
|
34
|
+
* @returns Consent configuration (always returns valid config, never throws)
|
|
35
|
+
*/
|
|
36
|
+
async getConsentConfig(projectId) {
|
|
37
|
+
const cache = this.env.TOOL_PROTECTION_KV;
|
|
38
|
+
// Check cache first
|
|
39
|
+
if (cache) {
|
|
40
|
+
const cacheKey = `consent:config:${projectId}`;
|
|
41
|
+
try {
|
|
42
|
+
const cached = await cache.get(cacheKey, 'json');
|
|
43
|
+
if (cached) {
|
|
44
|
+
// Validate cached config
|
|
45
|
+
const validation = validateConsentConfig(cached);
|
|
46
|
+
if (validation.success) {
|
|
47
|
+
console.log('[ConsentConfig] ✅ Config retrieved from cache');
|
|
48
|
+
return validation.data;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.warn('[ConsentConfig] Cached config invalid, fetching fresh:', validation.error);
|
|
52
|
+
// Cache is invalid, continue to fetch fresh
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.warn('[ConsentConfig] Cache read error, fetching fresh:', error);
|
|
58
|
+
// Continue to fetch fresh on cache error
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Fetch from AgentShield API
|
|
62
|
+
try {
|
|
63
|
+
const agentShieldUrl = this.env.AGENTSHIELD_API_URL || DEFAULT_AGENTSHIELD_URL;
|
|
64
|
+
const apiKey = this.env.AGENTSHIELD_API_KEY;
|
|
65
|
+
if (!apiKey) {
|
|
66
|
+
console.warn('[ConsentConfig] No API key configured, using defaults');
|
|
67
|
+
return this.getDefaultConfig();
|
|
68
|
+
}
|
|
69
|
+
const response = await fetch(`${agentShieldUrl}/api/v1/bouncer/projects/${projectId}/consent-config`, {
|
|
70
|
+
headers: {
|
|
71
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
72
|
+
'Content-Type': 'application/json',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
if (response.ok) {
|
|
76
|
+
const configData = await response.json();
|
|
77
|
+
// Validate response
|
|
78
|
+
const validation = validateConsentConfig(configData);
|
|
79
|
+
if (validation.success) {
|
|
80
|
+
const config = validation.data;
|
|
81
|
+
// Cache for 5 minutes
|
|
82
|
+
if (cache) {
|
|
83
|
+
try {
|
|
84
|
+
await cache.put(`consent:config:${projectId}`, JSON.stringify(config), { expirationTtl: CONSENT_CONFIG_CACHE_TTL });
|
|
85
|
+
console.log('[ConsentConfig] ✅ Config fetched and cached');
|
|
86
|
+
}
|
|
87
|
+
catch (cacheError) {
|
|
88
|
+
console.warn('[ConsentConfig] Cache write failed (non-fatal):', cacheError);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return config;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.warn('[ConsentConfig] API response invalid, using defaults:', validation.error);
|
|
95
|
+
// Don't cache invalid configs - return defaults instead
|
|
96
|
+
return this.getDefaultConfig();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (response.status === 404) {
|
|
100
|
+
console.log('[ConsentConfig] Project not found, using defaults');
|
|
101
|
+
return this.getDefaultConfig();
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.warn('[ConsentConfig] API request failed:', response.status, response.statusText);
|
|
105
|
+
return this.getDefaultConfig();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.warn('[ConsentConfig] Failed to fetch config, using defaults:', error);
|
|
110
|
+
return this.getDefaultConfig();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get default consent configuration
|
|
115
|
+
*
|
|
116
|
+
* Returns sensible defaults when API is unavailable
|
|
117
|
+
*
|
|
118
|
+
* @returns Default consent configuration
|
|
119
|
+
*/
|
|
120
|
+
getDefaultConfig() {
|
|
121
|
+
return {
|
|
122
|
+
branding: {
|
|
123
|
+
primaryColor: '#2563eb',
|
|
124
|
+
theme: 'light',
|
|
125
|
+
},
|
|
126
|
+
terms: {
|
|
127
|
+
text: 'By approving, you grant permission for this agent to perform actions on your behalf. You can revoke this permission at any time.',
|
|
128
|
+
required: true,
|
|
129
|
+
},
|
|
130
|
+
ui: {
|
|
131
|
+
theme: 'light',
|
|
132
|
+
popupEnabled: false,
|
|
133
|
+
autoClose: false,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Invalidate cached consent configuration for a project
|
|
139
|
+
*
|
|
140
|
+
* @param projectId - Project ID to invalidate
|
|
141
|
+
*/
|
|
142
|
+
async invalidateCache(projectId) {
|
|
143
|
+
const cache = this.env.TOOL_PROTECTION_KV;
|
|
144
|
+
if (!cache) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const cacheKey = `consent:config:${projectId}`;
|
|
149
|
+
await cache.delete(cacheKey);
|
|
150
|
+
console.log('[ConsentConfig] Cache invalidated for project:', projectId);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.warn('[ConsentConfig] Failed to invalidate cache:', error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=consent-config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-config.service.js","sourceRoot":"","sources":["../../src/services/consent-config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent Page Renderer
|
|
3
|
+
*
|
|
4
|
+
* Renders secure consent pages with comprehensive XSS prevention.
|
|
5
|
+
* All user input is sanitized and escaped before rendering.
|
|
6
|
+
*
|
|
7
|
+
* Security Requirements:
|
|
8
|
+
* - All user input escaped with escapeHtml()
|
|
9
|
+
* - URLs validated before use
|
|
10
|
+
* - CSS colors validated
|
|
11
|
+
* - CSP headers enforced
|
|
12
|
+
* - No eval() or innerHTML with user data
|
|
13
|
+
*
|
|
14
|
+
* Related Spec: MCP-I Phase 0 Implementation Plan, Task B.4
|
|
15
|
+
*/
|
|
16
|
+
import type { ConsentPageConfig } from "@kya-os/contracts/consent";
|
|
17
|
+
/**
|
|
18
|
+
* Consent Page Renderer
|
|
19
|
+
*
|
|
20
|
+
* Renders HTML consent pages with security-first approach
|
|
21
|
+
*/
|
|
22
|
+
export declare class ConsentPageRenderer {
|
|
23
|
+
/**
|
|
24
|
+
* Render consent page HTML
|
|
25
|
+
*
|
|
26
|
+
* @param config - Consent page configuration (will be sanitized)
|
|
27
|
+
* @returns HTML string
|
|
28
|
+
*/
|
|
29
|
+
render(config: ConsentPageConfig): string;
|
|
30
|
+
/**
|
|
31
|
+
* Render success page HTML
|
|
32
|
+
*
|
|
33
|
+
* @param config - Success page configuration
|
|
34
|
+
* @returns HTML string
|
|
35
|
+
*/
|
|
36
|
+
renderSuccess(config: {
|
|
37
|
+
delegationId: string;
|
|
38
|
+
autoClose?: boolean;
|
|
39
|
+
}): string;
|
|
40
|
+
/**
|
|
41
|
+
* Escape HTML special characters
|
|
42
|
+
*
|
|
43
|
+
* Prevents XSS by escaping characters that have special meaning in HTML
|
|
44
|
+
*
|
|
45
|
+
* @param text - Text to escape
|
|
46
|
+
* @returns Escaped text
|
|
47
|
+
*/
|
|
48
|
+
private escapeHtml;
|
|
49
|
+
/**
|
|
50
|
+
* Validate and sanitize URL
|
|
51
|
+
*
|
|
52
|
+
* @param url - URL to validate
|
|
53
|
+
* @returns Sanitized URL or original if invalid (for fallback)
|
|
54
|
+
*/
|
|
55
|
+
private validateUrl;
|
|
56
|
+
/**
|
|
57
|
+
* Validate CSS color (hex format)
|
|
58
|
+
*
|
|
59
|
+
* @param color - Color to validate
|
|
60
|
+
* @returns Validated color or default
|
|
61
|
+
*/
|
|
62
|
+
private validateColor;
|
|
63
|
+
/**
|
|
64
|
+
* Sanitize consent page configuration
|
|
65
|
+
*
|
|
66
|
+
* Deep sanitization of all user input fields
|
|
67
|
+
* Note: serverUrl is validated but not escaped (needed for JavaScript)
|
|
68
|
+
*
|
|
69
|
+
* @param config - Configuration to sanitize
|
|
70
|
+
* @returns Sanitized configuration
|
|
71
|
+
*/
|
|
72
|
+
private sanitizeConfig;
|
|
73
|
+
/**
|
|
74
|
+
* Sanitize branding configuration
|
|
75
|
+
*
|
|
76
|
+
* @param branding - Branding to sanitize
|
|
77
|
+
* @returns Sanitized branding
|
|
78
|
+
*/
|
|
79
|
+
private sanitizeBranding;
|
|
80
|
+
/**
|
|
81
|
+
* Sanitize terms configuration
|
|
82
|
+
*
|
|
83
|
+
* @param terms - Terms to sanitize
|
|
84
|
+
* @returns Sanitized terms
|
|
85
|
+
*/
|
|
86
|
+
private sanitizeTerms;
|
|
87
|
+
/**
|
|
88
|
+
* Sanitize custom field
|
|
89
|
+
*
|
|
90
|
+
* @param field - Field to sanitize
|
|
91
|
+
* @returns Sanitized field
|
|
92
|
+
*/
|
|
93
|
+
private sanitizeCustomField;
|
|
94
|
+
/**
|
|
95
|
+
* Render page header
|
|
96
|
+
*
|
|
97
|
+
* @param config - Sanitized configuration
|
|
98
|
+
* @returns HTML string
|
|
99
|
+
*/
|
|
100
|
+
private renderHeader;
|
|
101
|
+
/**
|
|
102
|
+
* Render scopes list
|
|
103
|
+
*
|
|
104
|
+
* @param scopes - Sanitized scopes
|
|
105
|
+
* @returns HTML string
|
|
106
|
+
*/
|
|
107
|
+
private renderScopes;
|
|
108
|
+
/**
|
|
109
|
+
* Render terms section
|
|
110
|
+
*
|
|
111
|
+
* @param terms - Sanitized terms
|
|
112
|
+
* @returns HTML string
|
|
113
|
+
*/
|
|
114
|
+
private renderTerms;
|
|
115
|
+
/**
|
|
116
|
+
* Render custom fields
|
|
117
|
+
*
|
|
118
|
+
* @param fields - Sanitized custom fields
|
|
119
|
+
* @returns HTML string
|
|
120
|
+
*/
|
|
121
|
+
private renderCustomFields;
|
|
122
|
+
/**
|
|
123
|
+
* Render form
|
|
124
|
+
*
|
|
125
|
+
* @param config - Sanitized configuration
|
|
126
|
+
* @returns HTML string
|
|
127
|
+
*/
|
|
128
|
+
private renderForm;
|
|
129
|
+
/**
|
|
130
|
+
* Render JavaScript for form handling
|
|
131
|
+
*
|
|
132
|
+
* @param config - Sanitized configuration
|
|
133
|
+
* @returns HTML string
|
|
134
|
+
*/
|
|
135
|
+
private renderScript;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=consent-page-renderer.d.ts.map
|
|
@@ -0,0 +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,EAIlB,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAyBzC;;;;;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;IAwBtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAmBpB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAmBnB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA4D1B;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAwClB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;CAiErB"}
|