@kya-os/mcp-i-cloudflare 1.6.62 → 1.7.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.
Files changed (83) hide show
  1. package/dist/agent.d.ts +4 -2
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +121 -94
  4. package/dist/agent.js.map +1 -1
  5. package/dist/app.d.ts.map +1 -1
  6. package/dist/app.js +9 -95
  7. package/dist/app.js.map +1 -1
  8. package/dist/services/consent-config.service.d.ts +9 -3
  9. package/dist/services/consent-config.service.d.ts.map +1 -1
  10. package/dist/services/consent-config.service.js +90 -100
  11. package/dist/services/consent-config.service.js.map +1 -1
  12. package/dist/services/consent-page-renderer.d.ts.map +1 -1
  13. package/dist/services/consent-page-renderer.js +0 -5
  14. package/dist/services/consent-page-renderer.js.map +1 -1
  15. package/dist/services/consent-templates/base/base-template.d.ts +79 -0
  16. package/dist/services/consent-templates/base/base-template.d.ts.map +1 -0
  17. package/dist/services/consent-templates/base/base-template.js +283 -0
  18. package/dist/services/consent-templates/base/base-template.js.map +1 -0
  19. package/dist/services/consent-templates/base/components.d.ts +120 -0
  20. package/dist/services/consent-templates/base/components.d.ts.map +1 -0
  21. package/dist/services/consent-templates/base/components.js +278 -0
  22. package/dist/services/consent-templates/base/components.js.map +1 -0
  23. package/dist/services/consent-templates/base/escape.d.ts +53 -0
  24. package/dist/services/consent-templates/base/escape.d.ts.map +1 -0
  25. package/dist/services/consent-templates/base/escape.js +115 -0
  26. package/dist/services/consent-templates/base/escape.js.map +1 -0
  27. package/dist/services/consent-templates/base/index.d.ts +10 -0
  28. package/dist/services/consent-templates/base/index.d.ts.map +1 -0
  29. package/dist/services/consent-templates/base/index.js +10 -0
  30. package/dist/services/consent-templates/base/index.js.map +1 -0
  31. package/dist/services/consent-templates/base/styles.d.ts +80 -0
  32. package/dist/services/consent-templates/base/styles.d.ts.map +1 -0
  33. package/dist/services/consent-templates/base/styles.js +226 -0
  34. package/dist/services/consent-templates/base/styles.js.map +1 -0
  35. package/dist/services/consent-templates/helpers.d.ts +60 -0
  36. package/dist/services/consent-templates/helpers.d.ts.map +1 -0
  37. package/dist/services/consent-templates/helpers.js +121 -0
  38. package/dist/services/consent-templates/helpers.js.map +1 -0
  39. package/dist/services/consent-templates/index.d.ts +28 -0
  40. package/dist/services/consent-templates/index.d.ts.map +1 -0
  41. package/dist/services/consent-templates/index.js +36 -0
  42. package/dist/services/consent-templates/index.js.map +1 -0
  43. package/dist/services/consent-templates/modes/consent-only.template.d.ts +36 -0
  44. package/dist/services/consent-templates/modes/consent-only.template.d.ts.map +1 -0
  45. package/dist/services/consent-templates/modes/consent-only.template.js +69 -0
  46. package/dist/services/consent-templates/modes/consent-only.template.js.map +1 -0
  47. package/dist/services/consent-templates/modes/credentials.template.d.ts +59 -0
  48. package/dist/services/consent-templates/modes/credentials.template.d.ts.map +1 -0
  49. package/dist/services/consent-templates/modes/credentials.template.js +393 -0
  50. package/dist/services/consent-templates/modes/credentials.template.js.map +1 -0
  51. package/dist/services/consent-templates/modes/index.d.ts +13 -0
  52. package/dist/services/consent-templates/modes/index.d.ts.map +1 -0
  53. package/dist/services/consent-templates/modes/index.js +13 -0
  54. package/dist/services/consent-templates/modes/index.js.map +1 -0
  55. package/dist/services/consent-templates/modes/magic-link.template.d.ts +33 -0
  56. package/dist/services/consent-templates/modes/magic-link.template.d.ts.map +1 -0
  57. package/dist/services/consent-templates/modes/magic-link.template.js +191 -0
  58. package/dist/services/consent-templates/modes/magic-link.template.js.map +1 -0
  59. package/dist/services/consent-templates/modes/oauth.template.d.ts +40 -0
  60. package/dist/services/consent-templates/modes/oauth.template.d.ts.map +1 -0
  61. package/dist/services/consent-templates/modes/oauth.template.js +151 -0
  62. package/dist/services/consent-templates/modes/oauth.template.js.map +1 -0
  63. package/dist/services/consent-templates/modes/otp.template.d.ts +35 -0
  64. package/dist/services/consent-templates/modes/otp.template.d.ts.map +1 -0
  65. package/dist/services/consent-templates/modes/otp.template.js +311 -0
  66. package/dist/services/consent-templates/modes/otp.template.js.map +1 -0
  67. package/dist/services/consent-templates/registry.d.ts +61 -0
  68. package/dist/services/consent-templates/registry.d.ts.map +1 -0
  69. package/dist/services/consent-templates/registry.js +136 -0
  70. package/dist/services/consent-templates/registry.js.map +1 -0
  71. package/dist/services/consent-templates/template-renderer.d.ts +118 -0
  72. package/dist/services/consent-templates/template-renderer.d.ts.map +1 -0
  73. package/dist/services/consent-templates/template-renderer.js +334 -0
  74. package/dist/services/consent-templates/template-renderer.js.map +1 -0
  75. package/dist/services/consent-templates/types.d.ts +194 -0
  76. package/dist/services/consent-templates/types.d.ts.map +1 -0
  77. package/dist/services/consent-templates/types.js +23 -0
  78. package/dist/services/consent-templates/types.js.map +1 -0
  79. package/dist/services/consent.service.d.ts +9 -0
  80. package/dist/services/consent.service.d.ts.map +1 -1
  81. package/dist/services/consent.service.js +50 -6
  82. package/dist/services/consent.service.js.map +1 -1
  83. package/package.json +4 -3
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Credentials Template
3
+ *
4
+ * Username/password authentication flow.
5
+ * HTML structure matches AgentShield's CredentialsPreview.tsx EXACTLY.
6
+ *
7
+ * This is a pixel-perfect port of the React component to static HTML.
8
+ * Any changes here MUST be synchronized with AgentShield.
9
+ *
10
+ * @module consent-templates/modes/credentials
11
+ */
12
+ import { BaseConsentTemplate } from "../base/base-template";
13
+ import type { AuthMode, CredentialsConfig, ResolvedConsentConfig, ExtendedConsentPageConfig } from "../types";
14
+ /**
15
+ * Credentials Template
16
+ *
17
+ * Renders a login form matching AgentShield's CredentialsPreview exactly:
18
+ * - PreviewShell wrapper with branding
19
+ * - PreviewHeader with title
20
+ * - PreviewContent with spacing
21
+ * - PreviewAgentInfo with icon + description
22
+ * - Username/email field (shadcn Input style)
23
+ * - Password field with show/hide toggle
24
+ * - Remember me checkbox (label toggles checkbox)
25
+ * - Forgot password link
26
+ * - Cancel + Sign in buttons (PreviewButtonGroup)
27
+ */
28
+ export declare class CredentialsTemplate extends BaseConsentTemplate {
29
+ private remoteCredentialsConfig?;
30
+ constructor(config: ExtendedConsentPageConfig, resolved: ResolvedConsentConfig, remoteCredentials?: CredentialsConfig);
31
+ get authMode(): AuthMode;
32
+ private get credentialsConfig();
33
+ /**
34
+ * Override the main render method to match AgentShield's exact structure.
35
+ * This bypasses the base template's structure to ensure pixel-perfect match.
36
+ */
37
+ render(): string;
38
+ /**
39
+ * Render agent icon SVG (matches AgentIconPlaceholder in AgentShield)
40
+ */
41
+ private renderAgentIcon;
42
+ /**
43
+ * Render remember me checkbox and forgot password link.
44
+ * The checkbox uses a <label> that wraps everything so clicking toggles.
45
+ */
46
+ private renderRememberAndForgot;
47
+ /**
48
+ * These methods are overridden to prevent base template rendering
49
+ * since we completely override render()
50
+ */
51
+ renderAuthContent(): string;
52
+ protected renderActionButtons(): string;
53
+ protected renderTermsSection(): string;
54
+ /**
55
+ * Render mode-specific scripts for password toggle and checkbox
56
+ */
57
+ protected renderModeScript(): string;
58
+ }
59
+ //# sourceMappingURL=credentials.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.template.d.ts","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/credentials.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EACV,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAoB,SAAQ,mBAAmB;IAC1D,OAAO,CAAC,uBAAuB,CAAC,CAAoB;gBAGlD,MAAM,EAAE,yBAAyB,EACjC,QAAQ,EAAE,qBAAqB,EAC/B,iBAAiB,CAAC,EAAE,iBAAiB;IAMvC,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,OAAO,KAAK,iBAAiB,GAoB5B;IAED;;;OAGG;IACH,MAAM,IAAI,MAAM;IAyHhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAmD/B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAI3B,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAItC;;OAEG;IACH,SAAS,CAAC,gBAAgB,IAAI,MAAM;CAuIrC"}
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Credentials Template
3
+ *
4
+ * Username/password authentication flow.
5
+ * HTML structure matches AgentShield's CredentialsPreview.tsx EXACTLY.
6
+ *
7
+ * This is a pixel-perfect port of the React component to static HTML.
8
+ * Any changes here MUST be synchronized with AgentShield.
9
+ *
10
+ * @module consent-templates/modes/credentials
11
+ */
12
+ import { BaseConsentTemplate } from "../base/base-template";
13
+ import { escapeHtml, escapeJs, escapeAttr, validateUrl } from "../base/escape";
14
+ /**
15
+ * Credentials Template
16
+ *
17
+ * Renders a login form matching AgentShield's CredentialsPreview exactly:
18
+ * - PreviewShell wrapper with branding
19
+ * - PreviewHeader with title
20
+ * - PreviewContent with spacing
21
+ * - PreviewAgentInfo with icon + description
22
+ * - Username/email field (shadcn Input style)
23
+ * - Password field with show/hide toggle
24
+ * - Remember me checkbox (label toggles checkbox)
25
+ * - Forgot password link
26
+ * - Cancel + Sign in buttons (PreviewButtonGroup)
27
+ */
28
+ export class CredentialsTemplate extends BaseConsentTemplate {
29
+ remoteCredentialsConfig;
30
+ constructor(config, resolved, remoteCredentials) {
31
+ super(config, resolved);
32
+ this.remoteCredentialsConfig = remoteCredentials;
33
+ }
34
+ get authMode() {
35
+ return "credentials";
36
+ }
37
+ get credentialsConfig() {
38
+ // Merge remote config with modeConfig, preferring modeConfig for overrides
39
+ const remote = this.remoteCredentialsConfig || {};
40
+ const local = this.config.modeConfig?.credentials || {};
41
+ return {
42
+ usernameLabel: local.usernameLabel || remote.usernameLabel || "Username",
43
+ usernamePlaceholder: local.usernamePlaceholder ||
44
+ remote.usernamePlaceholder ||
45
+ "Enter your username",
46
+ passwordLabel: local.passwordLabel || remote.passwordLabel || "Password",
47
+ passwordPlaceholder: local.passwordPlaceholder ||
48
+ remote.passwordPlaceholder ||
49
+ "Enter your password",
50
+ showRememberMe: local.showRememberMe ?? remote.showRememberMe ?? true,
51
+ showForgotPassword: local.showForgotPassword ?? remote.showForgotPassword ?? true,
52
+ forgotPasswordUrl: local.forgotPasswordUrl || remote.forgotPasswordUrl,
53
+ };
54
+ }
55
+ /**
56
+ * Override the main render method to match AgentShield's exact structure.
57
+ * This bypasses the base template's structure to ensure pixel-perfect match.
58
+ */
59
+ render() {
60
+ const { branding, copy } = this.resolved;
61
+ const config = this.credentialsConfig;
62
+ const primaryColor = branding.primaryColor;
63
+ return `<!DOCTYPE html>
64
+ <html lang="en">
65
+ <head>
66
+ ${this.renderHead()}
67
+ </head>
68
+ <body class="bg-gray-50 min-h-screen flex items-center justify-center p-4">
69
+ <!-- PreviewShell: bg-white rounded-[20px] border border-black/10 shadow-xl w-full overflow-hidden max-w-[512px] -->
70
+ <div
71
+ class="bg-white rounded-[20px] border border-black/10 shadow-xl w-full overflow-hidden"
72
+ style="max-width: 512px; --consent-primary: ${escapeAttr(primaryColor)}; --consent-secondary: ${escapeAttr(branding.secondaryColor)};"
73
+ >
74
+ <!-- PreviewHeader: px-8 pt-5 -->
75
+ <div class="px-8 pt-5">
76
+ <h2 class="text-2xl font-bold text-[#333333]">${escapeHtml(copy.title)}</h2>
77
+ </div>
78
+
79
+ <!-- PreviewContent: p-8 pt-4 space-y-6 -->
80
+ <div class="p-8 pt-4 space-y-6">
81
+ <!-- PreviewAgentInfo: flex gap-4 items-start -->
82
+ <div class="flex gap-4 items-start">
83
+ <!-- Icon: w-[54px] h-[54px] rounded-[10px] border border-gray-300 -->
84
+ <div class="w-[54px] h-[54px] rounded-[10px] border border-gray-300 flex items-center justify-center flex-shrink-0 overflow-hidden bg-white">
85
+ ${this.renderAgentIcon()}
86
+ </div>
87
+ <!-- Description: text-base text-black leading-[1.4] flex-1 -->
88
+ <p class="text-base text-black leading-[1.4] flex-1">${escapeHtml(copy.resolvedDescription)}</p>
89
+ </div>
90
+
91
+ <!-- Login Form: space-y-4 -->
92
+ <form id="credential-form" class="space-y-4">
93
+ <!-- Username Field: space-y-2 -->
94
+ <div class="space-y-2">
95
+ <label for="username" class="text-sm font-medium text-gray-700">
96
+ ${escapeHtml(config.usernameLabel || "Username")}
97
+ </label>
98
+ <input
99
+ type="text"
100
+ id="username"
101
+ name="username"
102
+ placeholder="${escapeAttr(config.usernamePlaceholder || "Enter your username")}"
103
+ required
104
+ autocomplete="username"
105
+ class="flex h-11 w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:cursor-not-allowed disabled:opacity-50"
106
+ />
107
+ </div>
108
+
109
+ <!-- Password Field: space-y-2 -->
110
+ <div class="space-y-2">
111
+ <label for="password" class="text-sm font-medium text-gray-700">
112
+ ${escapeHtml(config.passwordLabel || "Password")}
113
+ </label>
114
+ <div class="relative">
115
+ <input
116
+ type="password"
117
+ id="password"
118
+ name="password"
119
+ placeholder="${escapeAttr(config.passwordPlaceholder || "Enter your password")}"
120
+ required
121
+ autocomplete="current-password"
122
+ class="flex h-11 w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:cursor-not-allowed disabled:opacity-50 pr-10"
123
+ />
124
+ <button
125
+ type="button"
126
+ id="toggle-password"
127
+ class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600"
128
+ aria-label="Toggle password visibility"
129
+ >
130
+ <!-- Eye icon (visible when password is hidden) -->
131
+ <svg id="eye-icon" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
132
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
133
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
134
+ </svg>
135
+ <!-- Eye-off icon (visible when password is shown) -->
136
+ <svg id="eye-off-icon" class="w-4 h-4 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
137
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"></path>
138
+ </svg>
139
+ </button>
140
+ </div>
141
+ </div>
142
+
143
+ <!-- Remember Me & Forgot Password: flex items-center justify-between -->
144
+ ${this.renderRememberAndForgot(config, primaryColor)}
145
+
146
+ <!-- Error Container (hidden by default) -->
147
+ <div id="error-container" class="hidden">
148
+ <div class="p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"></div>
149
+ </div>
150
+ </form>
151
+
152
+ <!-- PreviewButtonGroup: flex gap-3 justify-end -->
153
+ <div class="flex gap-3 justify-end">
154
+ <button
155
+ type="button"
156
+ onclick="window.close()"
157
+ class="font-medium text-sm rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed px-4 py-2.5 h-10 border-[1.5px] bg-transparent"
158
+ style="border-color: ${escapeAttr(primaryColor)}; color: ${escapeAttr(primaryColor)};"
159
+ >
160
+ ${escapeHtml(copy.cancelButtonText)}
161
+ </button>
162
+ <button
163
+ type="submit"
164
+ form="credential-form"
165
+ class="font-medium text-sm rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed px-4 py-3 h-11 text-white"
166
+ style="background-color: ${escapeAttr(primaryColor)};"
167
+ >
168
+ Sign in
169
+ </button>
170
+ </div>
171
+ </div>
172
+ </div>
173
+
174
+ ${this.renderModeScript()}
175
+ </body>
176
+ </html>`;
177
+ }
178
+ /**
179
+ * Render agent icon SVG (matches AgentIconPlaceholder in AgentShield)
180
+ */
181
+ renderAgentIcon() {
182
+ const logoUrl = this.resolved.branding.logoUrl;
183
+ if (logoUrl) {
184
+ return `<img src="${escapeAttr(logoUrl)}" alt="Agent" class="w-full h-full object-contain" />`;
185
+ }
186
+ // Default placeholder icon matching AgentShield exactly
187
+ return `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="text-gray-400">
188
+ <rect x="3" y="3" width="18" height="18" rx="2" stroke="currentColor" stroke-width="2" />
189
+ <circle cx="8" cy="8" r="1.5" fill="currentColor" />
190
+ <circle cx="16" cy="8" r="1.5" fill="currentColor" />
191
+ <path d="M8 14s1.5 2 4 2 4-2 4-2" stroke="currentColor" stroke-width="2" stroke-linecap="round" />
192
+ </svg>`;
193
+ }
194
+ /**
195
+ * Render remember me checkbox and forgot password link.
196
+ * The checkbox uses a <label> that wraps everything so clicking toggles.
197
+ */
198
+ renderRememberAndForgot(config, primaryColor) {
199
+ const showRemember = config.showRememberMe !== false;
200
+ const showForgot = config.showForgotPassword === true;
201
+ if (!showRemember && !showForgot)
202
+ return "";
203
+ // Match PreviewCheckbox exactly: custom div with border-2 border-gray-300 bg-white when unchecked
204
+ // When checked: backgroundColor and borderColor set to primaryColor, with white Check icon
205
+ const rememberHtml = showRemember
206
+ ? `
207
+ <div id="remember-label" class="flex items-center gap-3 cursor-pointer select-none" role="button" tabindex="0">
208
+ <div
209
+ id="remember-checkbox"
210
+ class="w-4 h-4 rounded flex items-center justify-center transition-colors border-2 border-gray-300 bg-white"
211
+ role="checkbox"
212
+ aria-checked="false"
213
+ >
214
+ <!-- Checkmark (hidden by default, shown when checked) -->
215
+ <svg id="remember-check" class="w-3 h-3 text-white hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.5">
216
+ <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path>
217
+ </svg>
218
+ </div>
219
+ <span class="text-base text-black">Remember me</span>
220
+ <input type="hidden" name="rememberMe" id="rememberMe-input" value="false" />
221
+ </div>
222
+ `
223
+ : "<span></span>";
224
+ // Validate URL to prevent javascript: and other dangerous protocols
225
+ const validatedUrl = config.forgotPasswordUrl ? validateUrl(config.forgotPasswordUrl) : undefined;
226
+ const forgotHtml = showForgot
227
+ ? `
228
+ <a href="${escapeAttr(validatedUrl || "#")}"
229
+ class="text-sm hover:underline"
230
+ style="color: ${escapeAttr(primaryColor)}">
231
+ Forgot password?
232
+ </a>
233
+ `
234
+ : "";
235
+ return `
236
+ <div class="flex items-center justify-between">
237
+ ${rememberHtml}
238
+ ${forgotHtml}
239
+ </div>
240
+ `;
241
+ }
242
+ /**
243
+ * These methods are overridden to prevent base template rendering
244
+ * since we completely override render()
245
+ */
246
+ renderAuthContent() {
247
+ return "";
248
+ }
249
+ renderActionButtons() {
250
+ return "";
251
+ }
252
+ renderTermsSection() {
253
+ return "";
254
+ }
255
+ /**
256
+ * Render mode-specific scripts for password toggle and checkbox
257
+ */
258
+ renderModeScript() {
259
+ // Use escapeJs which properly escapes via JSON.stringify (returns quoted string)
260
+ const serverUrl = escapeJs(this.config.serverUrl);
261
+ const projectId = escapeJs(this.config.projectId);
262
+ const sessionId = escapeJs(this.config.sessionId);
263
+ const agentDid = escapeJs(this.config.agentDid);
264
+ const tool = escapeJs(this.config.tool);
265
+ const scopes = JSON.stringify(this.config.scopes);
266
+ const provider = escapeJs(this.config.provider || "credentials");
267
+ const primaryColor = escapeJs(this.resolved.branding.primaryColor);
268
+ return `
269
+ <script>
270
+ (function() {
271
+ // Password visibility toggle
272
+ var toggleBtn = document.getElementById('toggle-password');
273
+ var passwordInput = document.getElementById('password');
274
+ var eyeIcon = document.getElementById('eye-icon');
275
+ var eyeOffIcon = document.getElementById('eye-off-icon');
276
+
277
+ if (toggleBtn && passwordInput) {
278
+ toggleBtn.addEventListener('click', function() {
279
+ var isPassword = passwordInput.type === 'password';
280
+ passwordInput.type = isPassword ? 'text' : 'password';
281
+ eyeIcon.classList.toggle('hidden', isPassword);
282
+ eyeOffIcon.classList.toggle('hidden', !isPassword);
283
+ });
284
+ }
285
+
286
+ // Remember me checkbox toggle
287
+ var rememberLabel = document.getElementById('remember-label');
288
+ var rememberCheckbox = document.getElementById('remember-checkbox');
289
+ var rememberCheck = document.getElementById('remember-check');
290
+ var rememberInput = document.getElementById('rememberMe-input');
291
+ var checkboxColor = ${primaryColor};
292
+
293
+ if (rememberLabel && rememberCheckbox && rememberCheck) {
294
+ var isChecked = false;
295
+
296
+ rememberLabel.onclick = function() {
297
+ isChecked = !isChecked;
298
+
299
+ if (isChecked) {
300
+ rememberCheckbox.style.backgroundColor = checkboxColor;
301
+ rememberCheckbox.style.borderColor = checkboxColor;
302
+ rememberCheck.classList.remove('hidden');
303
+ } else {
304
+ rememberCheckbox.style.backgroundColor = 'white';
305
+ rememberCheckbox.style.borderColor = '#d1d5db';
306
+ rememberCheck.classList.add('hidden');
307
+ }
308
+
309
+ rememberCheckbox.setAttribute('aria-checked', isChecked.toString());
310
+ if (rememberInput) rememberInput.value = isChecked ? 'true' : 'false';
311
+ };
312
+ }
313
+
314
+ // Form submission
315
+ var form = document.getElementById('credential-form');
316
+ if (!form) return;
317
+
318
+ var formServerUrl = ${serverUrl};
319
+ var formProjectId = ${projectId};
320
+ var errorContainer = document.getElementById('error-container');
321
+ var errorDiv = errorContainer ? errorContainer.querySelector('div') : null;
322
+
323
+ form.addEventListener('submit', function(e) {
324
+ e.preventDefault();
325
+
326
+ var submitBtn = document.querySelector('button[type="submit"]');
327
+ var originalText = submitBtn.textContent;
328
+
329
+ if (errorContainer) errorContainer.classList.add('hidden');
330
+
331
+ submitBtn.disabled = true;
332
+ submitBtn.textContent = 'Signing in...';
333
+ submitBtn.style.opacity = '0.7';
334
+
335
+ var formData = new FormData(form);
336
+
337
+ var data = {
338
+ auth_mode: 'credentials',
339
+ provider_type: 'credential',
340
+ provider: ${provider},
341
+ username: formData.get('username'),
342
+ password: formData.get('password'),
343
+ rememberMe: formData.get('rememberMe') === 'true',
344
+ tool: ${tool},
345
+ scopes: ${scopes},
346
+ agent_did: ${agentDid},
347
+ session_id: ${sessionId},
348
+ project_id: ${projectId}
349
+ };
350
+
351
+ fetch(formServerUrl + '/consent/approve', {
352
+ method: 'POST',
353
+ headers: { 'Content-Type': 'application/json' },
354
+ body: JSON.stringify(data)
355
+ })
356
+ .then(function(response) { return response.json(); })
357
+ .then(function(result) {
358
+ if (result.success) {
359
+ submitBtn.textContent = 'Success! Redirecting...';
360
+ submitBtn.style.backgroundColor = '#10B981';
361
+
362
+ if (result.redirectUrl) {
363
+ window.location.href = result.redirectUrl;
364
+ } else if (result.delegation_id) {
365
+ window.location.href = formServerUrl + '/consent/success?delegation_id=' +
366
+ encodeURIComponent(result.delegation_id) +
367
+ '&project_id=' + encodeURIComponent(formProjectId);
368
+ }
369
+ } else {
370
+ if (errorDiv) {
371
+ errorDiv.textContent = result.error || 'Authentication failed. Please check your credentials.';
372
+ errorContainer.classList.remove('hidden');
373
+ }
374
+ submitBtn.disabled = false;
375
+ submitBtn.textContent = originalText;
376
+ submitBtn.style.opacity = '1';
377
+ }
378
+ })
379
+ .catch(function(err) {
380
+ if (errorDiv) {
381
+ errorDiv.textContent = 'Network error. Please try again.';
382
+ errorContainer.classList.remove('hidden');
383
+ }
384
+ submitBtn.disabled = false;
385
+ submitBtn.textContent = originalText;
386
+ submitBtn.style.opacity = '1';
387
+ });
388
+ });
389
+ })();
390
+ </script>`;
391
+ }
392
+ }
393
+ //# sourceMappingURL=credentials.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.template.js","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/credentials.template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Auth Mode Templates Index
3
+ *
4
+ * Exports all auth mode template classes.
5
+ *
6
+ * @module consent-templates/modes
7
+ */
8
+ export { ConsentOnlyTemplate } from "./consent-only.template";
9
+ export { CredentialsTemplate } from "./credentials.template";
10
+ export { OAuthTemplate } from "./oauth.template";
11
+ export { MagicLinkTemplate } from "./magic-link.template";
12
+ export { OTPTemplate } from "./otp.template";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Auth Mode Templates Index
3
+ *
4
+ * Exports all auth mode template classes.
5
+ *
6
+ * @module consent-templates/modes
7
+ */
8
+ export { ConsentOnlyTemplate } from "./consent-only.template";
9
+ export { CredentialsTemplate } from "./credentials.template";
10
+ export { OAuthTemplate } from "./oauth.template";
11
+ export { MagicLinkTemplate } from "./magic-link.template";
12
+ export { OTPTemplate } from "./otp.template";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Magic Link Template
3
+ *
4
+ * Passwordless authentication via email link.
5
+ *
6
+ * @module consent-templates/modes/magic-link
7
+ */
8
+ import { BaseConsentTemplate } from "../base/base-template";
9
+ import type { AuthMode } from "../types";
10
+ /**
11
+ * Magic Link Template
12
+ *
13
+ * Renders an email-based passwordless login:
14
+ * - Email input field
15
+ * - Submit button
16
+ * - Success/waiting state
17
+ * - Resend link functionality
18
+ */
19
+ export declare class MagicLinkTemplate extends BaseConsentTemplate {
20
+ get authMode(): AuthMode;
21
+ private get magicLinkConfig();
22
+ renderAuthContent(): string;
23
+ /**
24
+ * Render email input field.
25
+ */
26
+ private renderEmailField;
27
+ /**
28
+ * Override action buttons - form has its own submit.
29
+ */
30
+ protected renderActionButtons(): string;
31
+ protected renderModeScript(): string;
32
+ }
33
+ //# sourceMappingURL=magic-link.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-link.template.d.ts","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/magic-link.template.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAO5D,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAE1D;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,iBAAiB,IAAI,MAAM;IA6B3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC,SAAS,CAAC,gBAAgB,IAAI,MAAM;CA6HrC"}