ugly-app 0.1.545 → 0.1.548

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.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.545";
1
+ export declare const CLI_VERSION = "0.1.548";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.545";
2
+ export const CLI_VERSION = "0.1.548";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginPopup.d.ts","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"AAQA,UAAU,eAAe;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,MAAc,EAAE,EAAE,eAAe,2CAqExE"}
1
+ {"version":3,"file":"LoginPopup.d.ts","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"AAQA,UAAU,eAAe;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,MAAc,EAAE,EAAE,eAAe,2CAgJxE"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useState } from 'react';
3
3
  const UGLY_BOT_URL = typeof window !== 'undefined'
4
4
  ? (window.__UGLY_BOT_URL__ ??
@@ -45,6 +45,7 @@ export function LoginPopup({ onSuccess, inline = false }) {
45
45
  }, 500);
46
46
  }
47
47
  }, []);
48
+ const isWaiting = status === 'waiting';
48
49
  return (_jsxs("div", { style: {
49
50
  display: 'flex',
50
51
  flexDirection: 'column',
@@ -52,6 +53,60 @@ export function LoginPopup({ onSuccess, inline = false }) {
52
53
  justifyContent: 'center',
53
54
  ...(inline ? { padding: '24px 32px' } : { minHeight: '100vh' }),
54
55
  gap: 16,
55
- }, children: [status === 'error' && (_jsx("p", { style: { color: 'red' }, children: "Login failed. Please try again." })), _jsx("button", { onClick: openPopup, disabled: status === 'waiting', style: { padding: '12px 24px', fontSize: 16, cursor: 'pointer' }, children: status === 'waiting' ? 'Waiting for login…' : 'Login with ugly.bot' })] }));
56
+ }, children: [_jsx("style", { children: `
57
+ @keyframes ugly-login-spin {
58
+ to { transform: rotate(360deg); }
59
+ }
60
+ .ugly-login-btn {
61
+ display: inline-flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ gap: 10px;
65
+ padding: 11px 20px;
66
+ font-size: 15px;
67
+ font-weight: 600;
68
+ font-family: inherit;
69
+ line-height: 1.2;
70
+ color: #ffffff;
71
+ background: #18181b;
72
+ border: 1px solid #18181b;
73
+ border-radius: 8px;
74
+ cursor: pointer;
75
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
76
+ transition: background-color 0.15s ease, transform 0.1s ease,
77
+ box-shadow 0.15s ease, opacity 0.15s ease;
78
+ -webkit-tap-highlight-color: transparent;
79
+ }
80
+ .ugly-login-btn:hover:not(:disabled) {
81
+ background: #000000;
82
+ transform: translateY(-1px);
83
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.16);
84
+ }
85
+ .ugly-login-btn:active:not(:disabled) {
86
+ transform: translateY(0);
87
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
88
+ }
89
+ .ugly-login-btn:focus-visible {
90
+ outline: none;
91
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.45);
92
+ }
93
+ .ugly-login-btn:disabled {
94
+ cursor: default;
95
+ opacity: 0.65;
96
+ }
97
+ .ugly-login-spinner {
98
+ width: 15px;
99
+ height: 15px;
100
+ border: 2px solid rgba(255, 255, 255, 0.35);
101
+ border-top-color: #ffffff;
102
+ border-radius: 50%;
103
+ animation: ugly-login-spin 0.7s linear infinite;
104
+ }
105
+ ` }), status === 'error' && (_jsx("p", { style: {
106
+ margin: 0,
107
+ color: '#dc2626',
108
+ fontSize: 14,
109
+ fontWeight: 500,
110
+ }, children: "Login failed. Please try again." })), _jsx("button", { type: "button", className: "ugly-login-btn", onClick: openPopup, disabled: isWaiting, "aria-busy": isWaiting, children: isWaiting ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "ugly-login-spinner", "aria-hidden": "true" }), "Signing in\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", style: { fontSize: 16, lineHeight: 1 }, children: "\uD83E\uDD16" }), "Login with ugly.bot"] })) })] }));
56
111
  }
57
112
  //# sourceMappingURL=LoginPopup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoginPopup.js","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LoginPopup.js","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAsGD,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAoD/E"}
1
+ {"version":3,"file":"ChatMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAwGD,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAoD/E"}
@@ -6,12 +6,13 @@ const rowStyle = {
6
6
  flexDirection: 'row',
7
7
  alignItems: 'flex-start',
8
8
  gap: 8,
9
- padding: '2px 12px',
9
+ padding: '1px 14px',
10
10
  };
11
11
  const rowWithHeaderStyle = {
12
12
  ...rowStyle,
13
13
  paddingTop: 6,
14
14
  };
15
+ const AVATAR_SIZE = 24;
15
16
  // Inline lucide "bot" glyph — the framework has no lucide dependency, and a
16
17
  // small muted robot mark next to a bot's name matches chat apps' convention
17
18
  // (and avoids an emoji). Sized to sit on the name baseline.
@@ -19,19 +20,19 @@ function BotMark() {
19
20
  return (_jsxs("svg", { width: 13, height: 13, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", style: { color: 'var(--app-foreground)', opacity: 0.45, flexShrink: 0 }, "aria-label": "Bot", children: [_jsx("path", { d: "M12 8V4H8" }), _jsx("rect", { width: 16, height: 12, x: 4, y: 8, rx: 2 }), _jsx("path", { d: "M2 14h2" }), _jsx("path", { d: "M20 14h2" }), _jsx("path", { d: "M15 13v2" }), _jsx("path", { d: "M9 13v2" })] }));
20
21
  }
21
22
  const avatarStyle = {
22
- width: 32,
23
- height: 32,
23
+ width: AVATAR_SIZE,
24
+ height: AVATAR_SIZE,
24
25
  borderRadius: '50%',
25
26
  display: 'flex',
26
27
  alignItems: 'center',
27
28
  justifyContent: 'center',
28
- fontSize: 14,
29
+ fontSize: 11,
29
30
  fontWeight: 600,
30
31
  color: '#fff',
31
32
  flexShrink: 0,
32
33
  };
33
34
  const avatarPlaceholderStyle = {
34
- width: 32,
35
+ width: AVATAR_SIZE,
35
36
  flexShrink: 0,
36
37
  };
37
38
  const contentColumnStyle = {
@@ -42,13 +43,13 @@ const contentColumnStyle = {
42
43
  };
43
44
  const headerStyle = {
44
45
  display: 'flex',
45
- alignItems: 'baseline',
46
- gap: 6,
47
- marginBottom: 2,
46
+ alignItems: 'center',
47
+ gap: 5,
48
+ marginBottom: 1,
48
49
  };
49
50
  const nameStyle = {
50
51
  fontWeight: 600,
51
- fontSize: 14,
52
+ fontSize: 13,
52
53
  color: 'var(--app-foreground)',
53
54
  };
54
55
  const bodyStyle = {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessageBubble.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatMessageBubble.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Email.d.ts","sourceRoot":"","sources":["../../src/server/Email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKxD;AAgBD,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAID;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,YAAY,GAAG,oBAAoB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAiEf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB;kBAET;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;EAWpB"}
1
+ {"version":3,"file":"Email.d.ts","sourceRoot":"","sources":["../../src/server/Email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKxD;AAgBD,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAID;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,YAAY,GAAG,oBAAoB,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Ff;AAED;;;GAGG;AACH,wBAAgB,iBAAiB;kBAET;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;EAWpB"}
@@ -52,6 +52,31 @@ export async function emailSend(options) {
52
52
  if (!hasUserId && !hasTo) {
53
53
  throw new Error('[Email] Recipient is required (userId or to)');
54
54
  }
55
+ // Direct Cloudflare Email Sending API path. When the CF email creds are
56
+ // present AND we have a concrete recipient address (`to`, e.g. magic-link),
57
+ // send via Cloudflare's `/email/sending/send` endpoint instead of the
58
+ // ugly.bot email proxy. This lets a lean platform core (which drops the
59
+ // /v1/email proxy in favor of direct CF email) still send transactional
60
+ // mail. `userId`-addressed sends still route through the proxy (which
61
+ // resolves the address server-side). Pure fetch → Workers-compatible.
62
+ const cfToken = process.env['CLOUDFLARE_EMAIL_API_TOKEN'];
63
+ const cfAccount = process.env['CLOUDFLARE_ACCOUNT_ID'];
64
+ const toAddr = 'to' in options ? options.to?.trim() : undefined;
65
+ if (cfToken && cfAccount && toAddr) {
66
+ await sendViaCloudflare({
67
+ token: cfToken,
68
+ accountId: cfAccount,
69
+ ...(process.env['CLOUDFLARE_EMAIL_SENDING_DOMAIN']
70
+ ? { sendingDomain: process.env['CLOUDFLARE_EMAIL_SENDING_DOMAIN'] }
71
+ : {}),
72
+ to: toAddr,
73
+ subject: options.subject,
74
+ html: options.html,
75
+ ...(options.replyTo !== undefined ? { replyTo: options.replyTo } : {}),
76
+ ...(options.headers !== undefined ? { headers: options.headers } : {}),
77
+ });
78
+ return;
79
+ }
55
80
  const { url, token, timeoutMs } = resolveConfig();
56
81
  if (!token) {
57
82
  throw new Error('[Email] EMAIL_PROXY_TOKEN is not set. Run `npx ugly-app login` ' +
@@ -131,4 +156,47 @@ export function createEmailSender() {
131
156
  },
132
157
  };
133
158
  }
159
+ // ── Direct Cloudflare Email Sending API ─────────────────────────────────────
160
+ // Mirrors the monolith's CloudflareEmailSend: POST to
161
+ // `/accounts/{id}/email/sending/send` with a CF Email API token. Pure fetch,
162
+ // so it runs on Workers. Used by emailSend() when CF email creds are present
163
+ // (lean cores send transactional mail directly instead of via the proxy).
164
+ async function sendViaCloudflare(opts) {
165
+ // Parse "Name <email@domain>" or plain "email@domain".
166
+ const from = `noreply@${opts.sendingDomain ?? 'ugly.bot'}`;
167
+ const body = {
168
+ from, // string form (CF rejects object form when no display name)
169
+ to: opts.to,
170
+ subject: opts.subject,
171
+ html: opts.html,
172
+ };
173
+ if (opts.replyTo)
174
+ body['reply_to'] = opts.replyTo;
175
+ if (opts.headers && Object.keys(opts.headers).length > 0) {
176
+ body['headers'] = opts.headers;
177
+ }
178
+ const url = `https://api.cloudflare.com/client/v4/accounts/${opts.accountId}/email/sending/send`;
179
+ const res = await fetch(url, {
180
+ method: 'POST',
181
+ headers: {
182
+ Authorization: `Bearer ${opts.token}`,
183
+ 'Content-Type': 'application/json',
184
+ },
185
+ body: JSON.stringify(body),
186
+ });
187
+ if (!res.ok) {
188
+ let msg = `HTTP ${res.status}`;
189
+ try {
190
+ const env = (await res.json());
191
+ if (env.errors?.length)
192
+ msg = env.errors.map((e) => e.message).join('; ');
193
+ }
194
+ catch {
195
+ /* fall back to status */
196
+ }
197
+ throw new Error('[Email] Cloudflare send failed: ' + msg);
198
+ }
199
+ // eslint-disable-next-line no-console
200
+ console.log('[Email] Sent via Cloudflare', { to: opts.to, subject: opts.subject });
201
+ }
134
202
  //# sourceMappingURL=Email.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Email.js","sourceRoot":"","sources":["../../src/server/Email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Email.js","sourceRoot":"","sources":["../../src/server/Email.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.545",
3
+ "version": "0.1.548",
4
4
  "type": "module",
5
5
  "main": "./dist/server/index.js",
6
6
  "exports": {
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.545";
2
+ export const CLI_VERSION = "0.1.548";
@@ -58,6 +58,8 @@ export function LoginPopup({ onSuccess, inline = false }: LoginPopupProps) {
58
58
  }
59
59
  }, []);
60
60
 
61
+ const isWaiting = status === 'waiting';
62
+
61
63
  return (
62
64
  <div
63
65
  style={{
@@ -69,15 +71,88 @@ export function LoginPopup({ onSuccess, inline = false }: LoginPopupProps) {
69
71
  gap: 16,
70
72
  }}
71
73
  >
74
+ <style>{`
75
+ @keyframes ugly-login-spin {
76
+ to { transform: rotate(360deg); }
77
+ }
78
+ .ugly-login-btn {
79
+ display: inline-flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ gap: 10px;
83
+ padding: 11px 20px;
84
+ font-size: 15px;
85
+ font-weight: 600;
86
+ font-family: inherit;
87
+ line-height: 1.2;
88
+ color: #ffffff;
89
+ background: #18181b;
90
+ border: 1px solid #18181b;
91
+ border-radius: 8px;
92
+ cursor: pointer;
93
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
94
+ transition: background-color 0.15s ease, transform 0.1s ease,
95
+ box-shadow 0.15s ease, opacity 0.15s ease;
96
+ -webkit-tap-highlight-color: transparent;
97
+ }
98
+ .ugly-login-btn:hover:not(:disabled) {
99
+ background: #000000;
100
+ transform: translateY(-1px);
101
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.16);
102
+ }
103
+ .ugly-login-btn:active:not(:disabled) {
104
+ transform: translateY(0);
105
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
106
+ }
107
+ .ugly-login-btn:focus-visible {
108
+ outline: none;
109
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.45);
110
+ }
111
+ .ugly-login-btn:disabled {
112
+ cursor: default;
113
+ opacity: 0.65;
114
+ }
115
+ .ugly-login-spinner {
116
+ width: 15px;
117
+ height: 15px;
118
+ border: 2px solid rgba(255, 255, 255, 0.35);
119
+ border-top-color: #ffffff;
120
+ border-radius: 50%;
121
+ animation: ugly-login-spin 0.7s linear infinite;
122
+ }
123
+ `}</style>
72
124
  {status === 'error' && (
73
- <p style={{ color: 'red' }}>Login failed. Please try again.</p>
125
+ <p
126
+ style={{
127
+ margin: 0,
128
+ color: '#dc2626',
129
+ fontSize: 14,
130
+ fontWeight: 500,
131
+ }}
132
+ >
133
+ Login failed. Please try again.
134
+ </p>
74
135
  )}
75
136
  <button
137
+ type="button"
138
+ className="ugly-login-btn"
76
139
  onClick={openPopup}
77
- disabled={status === 'waiting'}
78
- style={{ padding: '12px 24px', fontSize: 16, cursor: 'pointer' }}
140
+ disabled={isWaiting}
141
+ aria-busy={isWaiting}
79
142
  >
80
- {status === 'waiting' ? 'Waiting for login…' : 'Login with ugly.bot'}
143
+ {isWaiting ? (
144
+ <>
145
+ <span className="ugly-login-spinner" aria-hidden="true" />
146
+ Signing in…
147
+ </>
148
+ ) : (
149
+ <>
150
+ <span aria-hidden="true" style={{ fontSize: 16, lineHeight: 1 }}>
151
+ 🤖
152
+ </span>
153
+ Login with ugly.bot
154
+ </>
155
+ )}
81
156
  </button>
82
157
  </div>
83
158
  );
@@ -13,7 +13,7 @@ const rowStyle: CSSProperties = {
13
13
  flexDirection: 'row',
14
14
  alignItems: 'flex-start',
15
15
  gap: 8,
16
- padding: '2px 12px',
16
+ padding: '1px 14px',
17
17
  };
18
18
 
19
19
  const rowWithHeaderStyle: CSSProperties = {
@@ -21,6 +21,8 @@ const rowWithHeaderStyle: CSSProperties = {
21
21
  paddingTop: 6,
22
22
  };
23
23
 
24
+ const AVATAR_SIZE = 24;
25
+
24
26
  // Inline lucide "bot" glyph — the framework has no lucide dependency, and a
25
27
  // small muted robot mark next to a bot's name matches chat apps' convention
26
28
  // (and avoids an emoji). Sized to sit on the name baseline.
@@ -49,20 +51,20 @@ function BotMark() {
49
51
  }
50
52
 
51
53
  const avatarStyle: CSSProperties = {
52
- width: 32,
53
- height: 32,
54
+ width: AVATAR_SIZE,
55
+ height: AVATAR_SIZE,
54
56
  borderRadius: '50%',
55
57
  display: 'flex',
56
58
  alignItems: 'center',
57
59
  justifyContent: 'center',
58
- fontSize: 14,
60
+ fontSize: 11,
59
61
  fontWeight: 600,
60
62
  color: '#fff',
61
63
  flexShrink: 0,
62
64
  };
63
65
 
64
66
  const avatarPlaceholderStyle: CSSProperties = {
65
- width: 32,
67
+ width: AVATAR_SIZE,
66
68
  flexShrink: 0,
67
69
  };
68
70
 
@@ -75,14 +77,14 @@ const contentColumnStyle: CSSProperties = {
75
77
 
76
78
  const headerStyle: CSSProperties = {
77
79
  display: 'flex',
78
- alignItems: 'baseline',
79
- gap: 6,
80
- marginBottom: 2,
80
+ alignItems: 'center',
81
+ gap: 5,
82
+ marginBottom: 1,
81
83
  };
82
84
 
83
85
  const nameStyle: CSSProperties = {
84
86
  fontWeight: 600,
85
- fontSize: 14,
87
+ fontSize: 13,
86
88
  color: 'var(--app-foreground)',
87
89
  };
88
90
 
@@ -100,6 +100,32 @@ export async function emailSend(
100
100
  throw new Error('[Email] Recipient is required (userId or to)');
101
101
  }
102
102
 
103
+ // Direct Cloudflare Email Sending API path. When the CF email creds are
104
+ // present AND we have a concrete recipient address (`to`, e.g. magic-link),
105
+ // send via Cloudflare's `/email/sending/send` endpoint instead of the
106
+ // ugly.bot email proxy. This lets a lean platform core (which drops the
107
+ // /v1/email proxy in favor of direct CF email) still send transactional
108
+ // mail. `userId`-addressed sends still route through the proxy (which
109
+ // resolves the address server-side). Pure fetch → Workers-compatible.
110
+ const cfToken = process.env['CLOUDFLARE_EMAIL_API_TOKEN'];
111
+ const cfAccount = process.env['CLOUDFLARE_ACCOUNT_ID'];
112
+ const toAddr = 'to' in options ? options.to?.trim() : undefined;
113
+ if (cfToken && cfAccount && toAddr) {
114
+ await sendViaCloudflare({
115
+ token: cfToken,
116
+ accountId: cfAccount,
117
+ ...(process.env['CLOUDFLARE_EMAIL_SENDING_DOMAIN']
118
+ ? { sendingDomain: process.env['CLOUDFLARE_EMAIL_SENDING_DOMAIN'] }
119
+ : {}),
120
+ to: toAddr,
121
+ subject: options.subject,
122
+ html: options.html,
123
+ ...(options.replyTo !== undefined ? { replyTo: options.replyTo } : {}),
124
+ ...(options.headers !== undefined ? { headers: options.headers } : {}),
125
+ });
126
+ return;
127
+ }
128
+
103
129
  const { url, token, timeoutMs } = resolveConfig();
104
130
  if (!token) {
105
131
  throw new Error(
@@ -184,3 +210,55 @@ export function createEmailSender() {
184
210
  },
185
211
  };
186
212
  }
213
+
214
+ // ── Direct Cloudflare Email Sending API ─────────────────────────────────────
215
+ // Mirrors the monolith's CloudflareEmailSend: POST to
216
+ // `/accounts/{id}/email/sending/send` with a CF Email API token. Pure fetch,
217
+ // so it runs on Workers. Used by emailSend() when CF email creds are present
218
+ // (lean cores send transactional mail directly instead of via the proxy).
219
+ async function sendViaCloudflare(opts: {
220
+ token: string;
221
+ accountId: string;
222
+ sendingDomain?: string;
223
+ to: string;
224
+ subject: string;
225
+ html: string;
226
+ replyTo?: string;
227
+ headers?: Record<string, string>;
228
+ }): Promise<void> {
229
+ // Parse "Name <email@domain>" or plain "email@domain".
230
+ const from = `noreply@${opts.sendingDomain ?? 'ugly.bot'}`;
231
+ const body: Record<string, unknown> = {
232
+ from, // string form (CF rejects object form when no display name)
233
+ to: opts.to,
234
+ subject: opts.subject,
235
+ html: opts.html,
236
+ };
237
+ if (opts.replyTo) body['reply_to'] = opts.replyTo;
238
+ if (opts.headers && Object.keys(opts.headers).length > 0) {
239
+ body['headers'] = opts.headers;
240
+ }
241
+ const url = `https://api.cloudflare.com/client/v4/accounts/${opts.accountId}/email/sending/send`;
242
+ const res = await fetch(url, {
243
+ method: 'POST',
244
+ headers: {
245
+ Authorization: `Bearer ${opts.token}`,
246
+ 'Content-Type': 'application/json',
247
+ },
248
+ body: JSON.stringify(body),
249
+ });
250
+ if (!res.ok) {
251
+ let msg = `HTTP ${res.status}`;
252
+ try {
253
+ const env = (await res.json()) as {
254
+ errors?: { message: string }[];
255
+ };
256
+ if (env.errors?.length) msg = env.errors.map((e) => e.message).join('; ');
257
+ } catch {
258
+ /* fall back to status */
259
+ }
260
+ throw new Error('[Email] Cloudflare send failed: ' + msg);
261
+ }
262
+ // eslint-disable-next-line no-console
263
+ console.log('[Email] Sent via Cloudflare', { to: opts.to, subject: opts.subject });
264
+ }