@kya-os/mcp-i-cloudflare 1.4.1-canary.0 → 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.
Files changed (35) hide show
  1. package/dist/adapter.d.ts +6 -0
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js +29 -0
  4. package/dist/adapter.js.map +1 -1
  5. package/dist/app.d.ts.map +1 -1
  6. package/dist/app.js +5 -0
  7. package/dist/app.js.map +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/runtime.d.ts +11 -2
  12. package/dist/runtime.d.ts.map +1 -1
  13. package/dist/runtime.js +48 -4
  14. package/dist/runtime.js.map +1 -1
  15. package/dist/server.js +1 -1
  16. package/dist/server.js.map +1 -1
  17. package/dist/services/consent-config.service.d.ts +46 -0
  18. package/dist/services/consent-config.service.d.ts.map +1 -0
  19. package/dist/services/consent-config.service.js +157 -0
  20. package/dist/services/consent-config.service.js.map +1 -0
  21. package/dist/services/consent-page-renderer.d.ts +137 -0
  22. package/dist/services/consent-page-renderer.d.ts.map +1 -0
  23. package/dist/services/consent-page-renderer.js +489 -0
  24. package/dist/services/consent-page-renderer.js.map +1 -0
  25. package/dist/services/consent.service.d.ts +57 -3
  26. package/dist/services/consent.service.d.ts.map +1 -1
  27. package/dist/services/consent.service.js +360 -16
  28. package/dist/services/consent.service.js.map +1 -1
  29. package/dist/services/transport.service.d.ts +47 -0
  30. package/dist/services/transport.service.d.ts.map +1 -0
  31. package/dist/services/transport.service.js +76 -0
  32. package/dist/services/transport.service.js.map +1 -0
  33. package/dist/types.d.ts +1 -0
  34. package/dist/types.d.ts.map +1 -1
  35. 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"}