@intelligo-dev/core 1.0.0-beta.1 → 1.0.0-beta.14

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 (356) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +102 -0
  3. package/dist/attachments/errors.d.ts +7 -0
  4. package/dist/attachments/errors.d.ts.map +1 -0
  5. package/dist/attachments/errors.js +11 -0
  6. package/dist/attachments/errors.js.map +1 -0
  7. package/dist/attachments/index.d.ts +8 -0
  8. package/dist/attachments/index.d.ts.map +1 -0
  9. package/dist/attachments/index.js +7 -0
  10. package/dist/attachments/index.js.map +1 -0
  11. package/dist/attachments/service.d.ts +45 -0
  12. package/dist/attachments/service.d.ts.map +1 -0
  13. package/dist/attachments/service.js +100 -0
  14. package/dist/attachments/service.js.map +1 -0
  15. package/dist/attachments/types.d.ts +6 -0
  16. package/dist/attachments/types.d.ts.map +1 -0
  17. package/dist/attachments/types.js +2 -0
  18. package/dist/attachments/types.js.map +1 -0
  19. package/dist/conversations/errors.d.ts +2 -8
  20. package/dist/conversations/errors.d.ts.map +1 -1
  21. package/dist/conversations/errors.js +2 -8
  22. package/dist/conversations/errors.js.map +1 -1
  23. package/dist/conversations/index.d.ts +4 -12
  24. package/dist/conversations/index.d.ts.map +1 -1
  25. package/dist/conversations/index.js +2 -11
  26. package/dist/conversations/index.js.map +1 -1
  27. package/dist/conversations/service.d.ts +49 -61
  28. package/dist/conversations/service.d.ts.map +1 -1
  29. package/dist/conversations/service.js +110 -83
  30. package/dist/conversations/service.js.map +1 -1
  31. package/dist/conversations/types.d.ts +1 -4
  32. package/dist/conversations/types.d.ts.map +1 -1
  33. package/dist/conversations/types.js +0 -3
  34. package/dist/conversations/types.js.map +1 -1
  35. package/dist/db/client.d.ts +21 -10
  36. package/dist/db/client.d.ts.map +1 -1
  37. package/dist/db/client.js +43 -18
  38. package/dist/db/client.js.map +1 -1
  39. package/dist/db/index.d.ts +3 -3
  40. package/dist/db/index.d.ts.map +1 -1
  41. package/dist/db/index.js +3 -7
  42. package/dist/db/index.js.map +1 -1
  43. package/dist/db/schema/agents.d.ts +14 -51
  44. package/dist/db/schema/agents.d.ts.map +1 -1
  45. package/dist/db/schema/agents.js +9 -21
  46. package/dist/db/schema/agents.js.map +1 -1
  47. package/dist/db/schema/ai.d.ts +86 -1556
  48. package/dist/db/schema/ai.d.ts.map +1 -1
  49. package/dist/db/schema/ai.js +32 -236
  50. package/dist/db/schema/ai.js.map +1 -1
  51. package/dist/db/schema/auth.d.ts +5 -34
  52. package/dist/db/schema/auth.d.ts.map +1 -1
  53. package/dist/db/schema/auth.js +25 -56
  54. package/dist/db/schema/auth.js.map +1 -1
  55. package/dist/db/schema/billing.d.ts +339 -105
  56. package/dist/db/schema/billing.d.ts.map +1 -1
  57. package/dist/db/schema/billing.js +99 -58
  58. package/dist/db/schema/billing.js.map +1 -1
  59. package/dist/db/schema/feature-flags.d.ts +3 -12
  60. package/dist/db/schema/feature-flags.d.ts.map +1 -1
  61. package/dist/db/schema/feature-flags.js +3 -12
  62. package/dist/db/schema/feature-flags.js.map +1 -1
  63. package/dist/db/schema/identity.d.ts +12 -274
  64. package/dist/db/schema/identity.d.ts.map +1 -1
  65. package/dist/db/schema/identity.js +19 -104
  66. package/dist/db/schema/identity.js.map +1 -1
  67. package/dist/db/schema/index.d.ts +8 -15
  68. package/dist/db/schema/index.d.ts.map +1 -1
  69. package/dist/db/schema/index.js +12 -42
  70. package/dist/db/schema/index.js.map +1 -1
  71. package/dist/db/schema/notifications.d.ts +3 -17
  72. package/dist/db/schema/notifications.d.ts.map +1 -1
  73. package/dist/db/schema/notifications.js +3 -17
  74. package/dist/db/schema/notifications.js.map +1 -1
  75. package/dist/db/schema/usage.d.ts +94 -77
  76. package/dist/db/schema/usage.d.ts.map +1 -1
  77. package/dist/db/schema/usage.js +59 -89
  78. package/dist/db/schema/usage.js.map +1 -1
  79. package/dist/db/validate.d.ts +2 -11
  80. package/dist/db/validate.d.ts.map +1 -1
  81. package/dist/db/validate.js +6 -17
  82. package/dist/db/validate.js.map +1 -1
  83. package/dist/db/workspace-queries.d.ts +5 -29
  84. package/dist/db/workspace-queries.d.ts.map +1 -1
  85. package/dist/db/workspace-queries.js +5 -29
  86. package/dist/db/workspace-queries.js.map +1 -1
  87. package/dist/documents/classifier.d.ts +5 -12
  88. package/dist/documents/classifier.d.ts.map +1 -1
  89. package/dist/documents/classifier.js +16 -16
  90. package/dist/documents/classifier.js.map +1 -1
  91. package/dist/documents/errors.d.ts +2 -10
  92. package/dist/documents/errors.d.ts.map +1 -1
  93. package/dist/documents/errors.js +2 -10
  94. package/dist/documents/errors.js.map +1 -1
  95. package/dist/documents/index.d.ts +4 -13
  96. package/dist/documents/index.d.ts.map +1 -1
  97. package/dist/documents/index.js +3 -12
  98. package/dist/documents/index.js.map +1 -1
  99. package/dist/documents/service.d.ts +19 -26
  100. package/dist/documents/service.d.ts.map +1 -1
  101. package/dist/documents/service.js +44 -38
  102. package/dist/documents/service.js.map +1 -1
  103. package/dist/documents/types.d.ts +6 -10
  104. package/dist/documents/types.d.ts.map +1 -1
  105. package/dist/documents/types.js +0 -3
  106. package/dist/documents/types.js.map +1 -1
  107. package/dist/email/brand.d.ts +17 -0
  108. package/dist/email/brand.d.ts.map +1 -0
  109. package/dist/email/brand.js +9 -0
  110. package/dist/email/brand.js.map +1 -0
  111. package/dist/email/index.d.ts +4 -4
  112. package/dist/email/index.js +4 -4
  113. package/dist/email/provider.d.ts +1 -7
  114. package/dist/email/provider.d.ts.map +1 -1
  115. package/dist/email/provider.js +10 -19
  116. package/dist/email/provider.js.map +1 -1
  117. package/dist/email/send.d.ts +12 -12
  118. package/dist/email/send.d.ts.map +1 -1
  119. package/dist/email/send.js +5 -19
  120. package/dist/email/send.js.map +1 -1
  121. package/dist/email/senders.d.ts +17 -30
  122. package/dist/email/senders.d.ts.map +1 -1
  123. package/dist/email/senders.js +33 -47
  124. package/dist/email/senders.js.map +1 -1
  125. package/dist/email/templates/base-layout.d.ts +1 -1
  126. package/dist/email/templates/base-layout.d.ts.map +1 -1
  127. package/dist/email/templates/base-layout.js +4 -6
  128. package/dist/email/templates/base-layout.js.map +1 -1
  129. package/dist/email/templates/index.d.ts +10 -10
  130. package/dist/email/templates/index.d.ts.map +1 -1
  131. package/dist/email/templates/index.js +10 -16
  132. package/dist/email/templates/index.js.map +1 -1
  133. package/dist/email/templates/password-reset.d.ts +2 -2
  134. package/dist/email/templates/password-reset.d.ts.map +1 -1
  135. package/dist/email/templates/password-reset.js +10 -22
  136. package/dist/email/templates/password-reset.js.map +1 -1
  137. package/dist/email/templates/payment-failed.d.ts +2 -2
  138. package/dist/email/templates/payment-failed.d.ts.map +1 -1
  139. package/dist/email/templates/payment-failed.js +11 -24
  140. package/dist/email/templates/payment-failed.js.map +1 -1
  141. package/dist/email/templates/quota-warning.d.ts +4 -4
  142. package/dist/email/templates/quota-warning.d.ts.map +1 -1
  143. package/dist/email/templates/quota-warning.js +19 -39
  144. package/dist/email/templates/quota-warning.js.map +1 -1
  145. package/dist/email/templates/subscription-confirmed.d.ts +2 -2
  146. package/dist/email/templates/subscription-confirmed.d.ts.map +1 -1
  147. package/dist/email/templates/subscription-confirmed.js +13 -28
  148. package/dist/email/templates/subscription-confirmed.js.map +1 -1
  149. package/dist/email/templates/trial-expiry.d.ts +2 -2
  150. package/dist/email/templates/trial-expiry.d.ts.map +1 -1
  151. package/dist/email/templates/trial-expiry.js +12 -36
  152. package/dist/email/templates/trial-expiry.js.map +1 -1
  153. package/dist/email/templates/trial-warning.d.ts +2 -2
  154. package/dist/email/templates/trial-warning.d.ts.map +1 -1
  155. package/dist/email/templates/trial-warning.js +15 -32
  156. package/dist/email/templates/trial-warning.js.map +1 -1
  157. package/dist/email/templates/verify-email.d.ts +2 -2
  158. package/dist/email/templates/verify-email.d.ts.map +1 -1
  159. package/dist/email/templates/verify-email.js +10 -22
  160. package/dist/email/templates/verify-email.js.map +1 -1
  161. package/dist/email/templates/welcome.d.ts +2 -2
  162. package/dist/email/templates/welcome.d.ts.map +1 -1
  163. package/dist/email/templates/welcome.js +13 -20
  164. package/dist/email/templates/welcome.js.map +1 -1
  165. package/dist/email/templates/workspace-invitation.d.ts +2 -2
  166. package/dist/email/templates/workspace-invitation.d.ts.map +1 -1
  167. package/dist/email/templates/workspace-invitation.js +12 -26
  168. package/dist/email/templates/workspace-invitation.js.map +1 -1
  169. package/dist/env.d.ts +5 -10
  170. package/dist/env.d.ts.map +1 -1
  171. package/dist/env.js +41 -31
  172. package/dist/env.js.map +1 -1
  173. package/dist/identity/audit.d.ts +11 -24
  174. package/dist/identity/audit.d.ts.map +1 -1
  175. package/dist/identity/audit.js +13 -27
  176. package/dist/identity/audit.js.map +1 -1
  177. package/dist/identity/errors.d.ts +4 -12
  178. package/dist/identity/errors.d.ts.map +1 -1
  179. package/dist/identity/errors.js +2 -8
  180. package/dist/identity/errors.js.map +1 -1
  181. package/dist/identity/index.d.ts +6 -13
  182. package/dist/identity/index.d.ts.map +1 -1
  183. package/dist/identity/index.js +5 -12
  184. package/dist/identity/index.js.map +1 -1
  185. package/dist/identity/service.d.ts +29 -47
  186. package/dist/identity/service.d.ts.map +1 -1
  187. package/dist/identity/service.js +107 -79
  188. package/dist/identity/service.js.map +1 -1
  189. package/dist/identity/types.d.ts +28 -4
  190. package/dist/identity/types.d.ts.map +1 -1
  191. package/dist/identity/types.js +0 -3
  192. package/dist/identity/types.js.map +1 -1
  193. package/dist/index.d.ts +1 -2
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +3 -10
  196. package/dist/index.js.map +1 -1
  197. package/dist/logger.d.ts +7 -18
  198. package/dist/logger.d.ts.map +1 -1
  199. package/dist/logger.js +45 -49
  200. package/dist/logger.js.map +1 -1
  201. package/dist/money.d.ts +95 -0
  202. package/dist/money.d.ts.map +1 -0
  203. package/dist/money.js +208 -0
  204. package/dist/money.js.map +1 -0
  205. package/dist/notifications/index.d.ts +9 -43
  206. package/dist/notifications/index.d.ts.map +1 -1
  207. package/dist/notifications/index.js +9 -49
  208. package/dist/notifications/index.js.map +1 -1
  209. package/dist/notifications/triggers.d.ts +9 -32
  210. package/dist/notifications/triggers.d.ts.map +1 -1
  211. package/dist/notifications/triggers.js +21 -58
  212. package/dist/notifications/triggers.js.map +1 -1
  213. package/dist/notifications/types.d.ts +6 -8
  214. package/dist/notifications/types.d.ts.map +1 -1
  215. package/dist/notifications/types.js +0 -9
  216. package/dist/notifications/types.js.map +1 -1
  217. package/dist/prompt.d.ts +38 -0
  218. package/dist/prompt.d.ts.map +1 -0
  219. package/dist/prompt.js +118 -0
  220. package/dist/prompt.js.map +1 -0
  221. package/dist/registry.d.ts +32 -0
  222. package/dist/registry.d.ts.map +1 -0
  223. package/dist/registry.js +60 -0
  224. package/dist/registry.js.map +1 -0
  225. package/dist/request-context.d.ts +49 -0
  226. package/dist/request-context.d.ts.map +1 -0
  227. package/dist/request-context.js +100 -0
  228. package/dist/request-context.js.map +1 -0
  229. package/dist/storage/index.d.ts +65 -0
  230. package/dist/storage/index.d.ts.map +1 -0
  231. package/dist/storage/index.js +109 -0
  232. package/dist/storage/index.js.map +1 -0
  233. package/package.json +74 -24
  234. package/src/attachments/errors.ts +18 -0
  235. package/src/attachments/index.ts +22 -0
  236. package/src/attachments/service.ts +178 -0
  237. package/src/attachments/types.ts +6 -0
  238. package/src/conversations/errors.ts +45 -0
  239. package/src/conversations/index.ts +39 -0
  240. package/src/conversations/service.ts +594 -0
  241. package/src/conversations/types.ts +15 -0
  242. package/src/db/client.ts +91 -0
  243. package/src/db/index.ts +3 -0
  244. package/src/db/migrations/0000_baseline.sql +652 -0
  245. package/src/db/migrations/0001_reconcile_chain_built_databases.sql +53 -0
  246. package/src/db/migrations/0002_webhook_claim_lease.sql +1 -0
  247. package/src/db/migrations/0003_local_payments.sql +18 -0
  248. package/src/db/migrations/README.md +103 -36
  249. package/src/db/migrations/legacy-chain.json +206 -0
  250. package/src/db/migrations/meta/0000_snapshot.json +4182 -157
  251. package/src/db/migrations/meta/0002_snapshot.json +2478 -368
  252. package/src/db/migrations/meta/0003_snapshot.json +2567 -554
  253. package/src/db/migrations/meta/_journal.json +8 -274
  254. package/src/db/schema/agents.ts +57 -0
  255. package/src/db/schema/ai.ts +174 -0
  256. package/src/db/schema/auth.ts +183 -0
  257. package/src/db/schema/billing.ts +245 -0
  258. package/src/db/schema/feature-flags.ts +20 -0
  259. package/src/db/schema/identity.ts +250 -0
  260. package/src/db/schema/index.ts +12 -0
  261. package/src/db/schema/notifications.ts +31 -0
  262. package/src/db/schema/usage.ts +269 -0
  263. package/src/db/validate.ts +63 -0
  264. package/src/db/workspace-queries.ts +64 -0
  265. package/src/documents/classifier.ts +61 -0
  266. package/src/documents/errors.ts +44 -0
  267. package/src/documents/index.ts +24 -0
  268. package/src/documents/service.ts +256 -0
  269. package/src/documents/types.ts +24 -0
  270. package/src/email/brand.ts +24 -0
  271. package/src/email/index.ts +19 -0
  272. package/src/email/provider.ts +278 -0
  273. package/src/email/send.ts +169 -0
  274. package/src/email/senders.ts +292 -0
  275. package/src/email/templates/base-layout.tsx +145 -0
  276. package/src/email/templates/index.ts +28 -0
  277. package/src/email/templates/password-reset.tsx +72 -0
  278. package/src/email/templates/payment-failed.tsx +77 -0
  279. package/src/email/templates/quota-warning.tsx +118 -0
  280. package/src/email/templates/subscription-confirmed.tsx +91 -0
  281. package/src/email/templates/trial-expiry.tsx +124 -0
  282. package/src/email/templates/trial-warning.tsx +104 -0
  283. package/src/email/templates/verify-email.tsx +72 -0
  284. package/src/email/templates/welcome.tsx +64 -0
  285. package/src/email/templates/workspace-invitation.tsx +105 -0
  286. package/src/env.ts +180 -0
  287. package/src/identity/audit.ts +65 -0
  288. package/src/identity/errors.ts +44 -0
  289. package/src/identity/index.ts +29 -0
  290. package/src/identity/service.ts +303 -0
  291. package/src/identity/types.ts +58 -0
  292. package/src/index.ts +4 -0
  293. package/src/logger.ts +198 -0
  294. package/src/money.ts +270 -0
  295. package/src/notifications/index.ts +112 -0
  296. package/src/notifications/triggers.ts +158 -0
  297. package/src/notifications/types.ts +26 -0
  298. package/src/prompt.ts +142 -0
  299. package/src/registry.ts +75 -0
  300. package/src/request-context.ts +137 -0
  301. package/src/storage/index.ts +153 -0
  302. package/dist/db/schema/rag.d.ts +0 -171
  303. package/dist/db/schema/rag.d.ts.map +0 -1
  304. package/dist/db/schema/rag.js +0 -42
  305. package/dist/db/schema/rag.js.map +0 -1
  306. package/src/db/migrations/0000_sharp_night_nurse.sql +0 -52
  307. package/src/db/migrations/0001_hesitant_vapor.sql +0 -40
  308. package/src/db/migrations/0002_numerous_lady_vermin.sql +0 -235
  309. package/src/db/migrations/0003_mighty_jean_grey.sql +0 -37
  310. package/src/db/migrations/0004_cynical_grandmaster.sql +0 -2
  311. package/src/db/migrations/0005_careful_switch.sql +0 -8
  312. package/src/db/migrations/0006_tense_blue_marvel.sql +0 -16
  313. package/src/db/migrations/0007_next_squadron_sinister.sql +0 -1
  314. package/src/db/migrations/0008_powerful_scream.sql +0 -39
  315. package/src/db/migrations/0009_sad_ink.sql +0 -1
  316. package/src/db/migrations/0010_shocking_omega_flight.sql +0 -2
  317. package/src/db/migrations/0011_ambiguous_otto_octavius.sql +0 -151
  318. package/src/db/migrations/0011_hnsw_vector_index.sql +0 -17
  319. package/src/db/migrations/0012_user_profiles.sql +0 -30
  320. package/src/db/migrations/0013_trending_seasonal_columns.sql +0 -9
  321. package/src/db/migrations/0014_add_product_type_to_agents.sql +0 -6
  322. package/src/db/migrations/0015_new_v1_tables.sql +0 -149
  323. package/src/db/migrations/0016_document_types.sql +0 -30
  324. package/src/db/migrations/0017_document_metadata.sql +0 -2
  325. package/src/db/migrations/0018_identity_graph.sql +0 -200
  326. package/src/db/migrations/0019_db_driven_prompts.sql +0 -20
  327. package/src/db/migrations/0020_pending_extractions.sql +0 -35
  328. package/src/db/migrations/0021_rag_documents.sql +0 -39
  329. package/src/db/migrations/0022_user_quotas_usage_jsonb.sql +0 -70
  330. package/src/db/migrations/0023_user_facts_user_scoped_unique.sql +0 -17
  331. package/src/db/migrations/0024_user_memories_hnsw.sql +0 -23
  332. package/src/db/migrations/0025_audit_trigger_errcode.sql +0 -21
  333. package/src/db/migrations/0026_user_profile_snapshots_composite_pk.sql +0 -17
  334. package/src/db/migrations/0027_billing_settings_mnt_columns.sql +0 -54
  335. package/src/db/migrations/0028_trial_credits_normalized_email.sql +0 -37
  336. package/src/db/migrations/0029_usage_records_conversation_idx.sql +0 -13
  337. package/src/db/migrations/0030_pending_extractions_composite_idx.sql +0 -11
  338. package/src/db/migrations/0031_rag_documents_hnsw.sql +0 -16
  339. package/src/db/migrations/0032_rate_limit_unique_idx.sql +0 -16
  340. package/src/db/migrations/0033_pending_extractions_partial_idx.sql +0 -18
  341. package/src/db/migrations/0034_rate_limit_count.sql +0 -9
  342. package/src/db/migrations/0035_credit_reservations.sql +0 -24
  343. package/src/db/migrations/0036_executions_audit_jobs.sql +0 -96
  344. package/src/db/migrations/0037_rate_limit_minute_bucket.sql +0 -46
  345. package/src/db/migrations/0038_user_quotas_generic_usage.sql +0 -25
  346. package/src/db/migrations/0039_platform_admin_impersonation.sql +0 -27
  347. package/src/db/migrations/0040_ee_audit_chain.sql +0 -23
  348. package/src/db/migrations/meta/0001_snapshot.json +0 -631
  349. package/src/db/migrations/meta/0004_snapshot.json +0 -2500
  350. package/src/db/migrations/meta/0005_snapshot.json +0 -2548
  351. package/src/db/migrations/meta/0006_snapshot.json +0 -2650
  352. package/src/db/migrations/meta/0007_snapshot.json +0 -2657
  353. package/src/db/migrations/meta/0008_snapshot.json +0 -2719
  354. package/src/db/migrations/meta/0009_snapshot.json +0 -2726
  355. package/src/db/migrations/meta/0010_snapshot.json +0 -2739
  356. package/src/db/migrations/meta/0011_snapshot.json +0 -3886
@@ -0,0 +1,118 @@
1
+ import { Button, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { BaseLayout } from "./base-layout";
4
+
5
+ // `isExceeded` switches between the 80% warning and the used-up variant.
6
+ // `used` and `allowance` arrive formatted: the plan allowance is money in
7
+ // the deployment's billing currency, and the sender owns the formatting.
8
+
9
+ export interface QuotaWarningEmailProps {
10
+ workspaceName: string;
11
+ percentageUsed: number;
12
+ used: string;
13
+ allowance: string;
14
+ upgradeUrl: string;
15
+ isExceeded: boolean;
16
+ }
17
+
18
+ export function QuotaWarningEmail({
19
+ workspaceName,
20
+ percentageUsed,
21
+ used,
22
+ allowance,
23
+ upgradeUrl,
24
+ isExceeded,
25
+ }: QuotaWarningEmailProps) {
26
+ const text = {
27
+ previewExceeded: "Your monthly allowance is used up",
28
+ previewWarning: `You've used ${percentageUsed}% of your monthly allowance`,
29
+ headingExceeded: "Allowance Used Up",
30
+ headingWarning: "Allowance Warning",
31
+ bodyExceeded1: "Your workspace",
32
+ bodyExceeded2: "has used all of its",
33
+ bodyExceeded3: "monthly allowance.",
34
+ warningText:
35
+ "AI features are currently restricted until your allowance resets or you upgrade.",
36
+ bodyWarning1: "Your workspace",
37
+ bodyWarning2: "has used",
38
+ bodyWarning3: "of its",
39
+ bodyWarning4: "monthly allowance",
40
+ button: "Upgrade Plan",
41
+ note: "Your allowance resets at the start of next month.",
42
+ };
43
+
44
+ return (
45
+ <BaseLayout
46
+ preview={isExceeded ? text.previewExceeded : text.previewWarning}
47
+ >
48
+ <Text style={headingStyle}>
49
+ {isExceeded ? text.headingExceeded : text.headingWarning}
50
+ </Text>
51
+
52
+ {isExceeded ? (
53
+ <>
54
+ <Text style={bodyTextStyle}>
55
+ {text.bodyExceeded1} &lsquo;{workspaceName}&rsquo;{" "}
56
+ {text.bodyExceeded2} {allowance} {text.bodyExceeded3}
57
+ </Text>
58
+ <Text style={warningTextStyle}>{text.warningText}</Text>
59
+ </>
60
+ ) : (
61
+ <Text style={bodyTextStyle}>
62
+ {text.bodyWarning1} &lsquo;{workspaceName}&rsquo; {text.bodyWarning2}{" "}
63
+ {used} {text.bodyWarning3} {allowance} {text.bodyWarning4} (
64
+ {percentageUsed}%).
65
+ </Text>
66
+ )}
67
+
68
+ <Button href={upgradeUrl} style={buttonStyle}>
69
+ {text.button}
70
+ </Button>
71
+ <Text style={noteStyle}>{text.note}</Text>
72
+ </BaseLayout>
73
+ );
74
+ }
75
+
76
+ const headingStyle: React.CSSProperties = {
77
+ color: "#18181b",
78
+ fontSize: "22px",
79
+ fontWeight: 700,
80
+ lineHeight: "30px",
81
+ margin: "0 0 16px",
82
+ };
83
+
84
+ const bodyTextStyle: React.CSSProperties = {
85
+ color: "#18181b",
86
+ fontSize: "15px",
87
+ lineHeight: "24px",
88
+ margin: "0 0 12px",
89
+ };
90
+
91
+ const warningTextStyle: React.CSSProperties = {
92
+ color: "#dc2626",
93
+ fontSize: "15px",
94
+ fontWeight: 600,
95
+ lineHeight: "24px",
96
+ margin: "0 0 12px",
97
+ };
98
+
99
+ const buttonStyle: React.CSSProperties = {
100
+ backgroundColor: "#7c3aed",
101
+ borderRadius: "6px",
102
+ color: "#ffffff",
103
+ display: "inline-block",
104
+ fontSize: "15px",
105
+ fontWeight: 600,
106
+ lineHeight: "100%",
107
+ padding: "12px 24px",
108
+ textDecoration: "none",
109
+ textAlign: "center" as const,
110
+ marginTop: "8px",
111
+ };
112
+
113
+ const noteStyle: React.CSSProperties = {
114
+ color: "#71717a",
115
+ fontSize: "13px",
116
+ lineHeight: "20px",
117
+ marginTop: "20px",
118
+ };
@@ -0,0 +1,91 @@
1
+ import { Button, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { BaseLayout } from "./base-layout";
4
+
5
+ export interface SubscriptionConfirmedEmailProps {
6
+ workspaceName: string;
7
+ planName: string;
8
+ amount: string;
9
+ dashboardUrl: string;
10
+ }
11
+
12
+ export function SubscriptionConfirmedEmail({
13
+ workspaceName,
14
+ planName,
15
+ amount,
16
+ dashboardUrl,
17
+ }: SubscriptionConfirmedEmailProps) {
18
+ const text = {
19
+ preview: `Subscription confirmed for ${workspaceName}`,
20
+ heading: "Subscription Confirmed",
21
+ body1: "Your workspace",
22
+ body2: "is now on the",
23
+ body3: "plan.",
24
+ amountLabel: "Amount:",
25
+ perMonth: "/month",
26
+ button: "Go to Dashboard",
27
+ note: "You can manage your subscription from the billing settings.",
28
+ };
29
+
30
+ return (
31
+ <BaseLayout preview={text.preview}>
32
+ <Text style={headingStyle}>{text.heading}</Text>
33
+ <Text style={bodyTextStyle}>
34
+ {text.body1} &lsquo;{workspaceName}&rsquo; {text.body2}{" "}
35
+ <strong>{planName}</strong> {text.body3}
36
+ </Text>
37
+ <Text style={detailStyle}>
38
+ {text.amountLabel} {amount}
39
+ {text.perMonth}
40
+ </Text>
41
+ <Button href={dashboardUrl} style={buttonStyle}>
42
+ {text.button}
43
+ </Button>
44
+ <Text style={noteStyle}>{text.note}</Text>
45
+ </BaseLayout>
46
+ );
47
+ }
48
+
49
+ const headingStyle: React.CSSProperties = {
50
+ color: "#18181b",
51
+ fontSize: "22px",
52
+ fontWeight: 700,
53
+ lineHeight: "30px",
54
+ margin: "0 0 16px",
55
+ };
56
+
57
+ const bodyTextStyle: React.CSSProperties = {
58
+ color: "#18181b",
59
+ fontSize: "15px",
60
+ lineHeight: "24px",
61
+ margin: "0 0 12px",
62
+ };
63
+
64
+ const detailStyle: React.CSSProperties = {
65
+ color: "#18181b",
66
+ fontSize: "15px",
67
+ fontWeight: 600,
68
+ lineHeight: "24px",
69
+ margin: "0 0 16px",
70
+ };
71
+
72
+ const buttonStyle: React.CSSProperties = {
73
+ backgroundColor: "#7c3aed",
74
+ borderRadius: "6px",
75
+ color: "#ffffff",
76
+ display: "inline-block",
77
+ fontSize: "15px",
78
+ fontWeight: 600,
79
+ lineHeight: "100%",
80
+ padding: "12px 24px",
81
+ textDecoration: "none",
82
+ textAlign: "center" as const,
83
+ marginTop: "8px",
84
+ };
85
+
86
+ const noteStyle: React.CSSProperties = {
87
+ color: "#71717a",
88
+ fontSize: "13px",
89
+ lineHeight: "20px",
90
+ marginTop: "20px",
91
+ };
@@ -0,0 +1,124 @@
1
+ import { Button, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { BaseLayout } from "./base-layout";
4
+
5
+ // `daysRemaining` switches between the reminder and expired variants.
6
+
7
+ export interface TrialExpiryEmailProps {
8
+ workspaceName: string;
9
+ expiryDate: string;
10
+ daysRemaining: number;
11
+ upgradeUrl: string;
12
+ }
13
+
14
+ export function TrialExpiryEmail({
15
+ workspaceName,
16
+ expiryDate,
17
+ daysRemaining,
18
+ upgradeUrl,
19
+ }: TrialExpiryEmailProps) {
20
+ const isExpired = daysRemaining <= 0;
21
+ const isUrgent = daysRemaining <= 1 && daysRemaining > 0;
22
+
23
+ const days = `${daysRemaining} day${daysRemaining === 1 ? "" : "s"}`;
24
+ const text = {
25
+ previewExpired: "Your trial has ended",
26
+ previewExpiring: `Your trial ends in ${days}`,
27
+ headingExpired: "Your Trial Has Ended",
28
+ headingExpiring: `Your Trial Ends in ${days}`,
29
+ buttonExpired: "Choose a Plan",
30
+ buttonUpgrade: "Upgrade Now",
31
+ };
32
+
33
+ return (
34
+ <BaseLayout
35
+ preview={isExpired ? text.previewExpired : text.previewExpiring}
36
+ >
37
+ <Text style={headingStyle}>
38
+ {isExpired ? text.headingExpired : text.headingExpiring}
39
+ </Text>
40
+
41
+ {isExpired ? (
42
+ <>
43
+ <Text style={bodyTextStyle}>
44
+ The trial for &lsquo;{workspaceName}&rsquo; has ended, and the
45
+ workspace is back on its plan&rsquo;s limits. All your data has been
46
+ preserved.
47
+ </Text>
48
+ <Text style={bodyTextStyle}>
49
+ Upgrade to restore what the trial included.
50
+ </Text>
51
+ </>
52
+ ) : (
53
+ <>
54
+ <Text style={bodyTextStyle}>
55
+ The trial for &lsquo;{workspaceName}&rsquo; ends on{" "}
56
+ <strong>{expiryDate}</strong>. After that the workspace goes back to
57
+ its plan&rsquo;s limits; all your data will be preserved.
58
+ </Text>
59
+ {isUrgent && (
60
+ <Text style={urgentTextStyle}>
61
+ Upgrade today to keep what the trial includes.
62
+ </Text>
63
+ )}
64
+ <Text style={secondaryTextStyle}>
65
+ No action is needed if the current plan is enough for you.
66
+ </Text>
67
+ </>
68
+ )}
69
+
70
+ <Button href={upgradeUrl} style={buttonStyle}>
71
+ {isExpired ? text.buttonExpired : text.buttonUpgrade}
72
+ </Button>
73
+ </BaseLayout>
74
+ );
75
+ }
76
+
77
+ const headingStyle: React.CSSProperties = {
78
+ color: "#18181b",
79
+ fontSize: "22px",
80
+ fontWeight: 700,
81
+ lineHeight: "30px",
82
+ margin: "0 0 16px",
83
+ };
84
+
85
+ const bodyTextStyle: React.CSSProperties = {
86
+ color: "#18181b",
87
+ fontSize: "15px",
88
+ lineHeight: "24px",
89
+ margin: "0 0 12px",
90
+ };
91
+
92
+ const urgentTextStyle: React.CSSProperties = {
93
+ color: "#dc2626",
94
+ fontSize: "16px",
95
+ fontWeight: 700,
96
+ lineHeight: "24px",
97
+ margin: "12px 0",
98
+ padding: "12px",
99
+ backgroundColor: "#fef2f2",
100
+ borderRadius: "6px",
101
+ border: "1px solid #fecaca",
102
+ };
103
+
104
+ const secondaryTextStyle: React.CSSProperties = {
105
+ color: "#71717a",
106
+ fontSize: "14px",
107
+ lineHeight: "20px",
108
+ margin: "12px 0 0",
109
+ fontStyle: "italic",
110
+ };
111
+
112
+ const buttonStyle: React.CSSProperties = {
113
+ backgroundColor: "#7c3aed",
114
+ borderRadius: "6px",
115
+ color: "#ffffff",
116
+ display: "inline-block",
117
+ fontSize: "15px",
118
+ fontWeight: 600,
119
+ lineHeight: "100%",
120
+ padding: "12px 24px",
121
+ textDecoration: "none",
122
+ textAlign: "center" as const,
123
+ marginTop: "16px",
124
+ };
@@ -0,0 +1,104 @@
1
+ import { Button, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { BaseLayout } from "./base-layout";
4
+
5
+ // `isDepleted` switches between the low-credit and depleted variants.
6
+
7
+ export interface TrialWarningEmailProps {
8
+ workspaceName: string;
9
+ creditsRemaining: number;
10
+ totalCredits: number;
11
+ percentageRemaining: number;
12
+ upgradeUrl: string;
13
+ isDepleted: boolean;
14
+ }
15
+
16
+ export function TrialWarningEmail({
17
+ workspaceName,
18
+ creditsRemaining,
19
+ totalCredits,
20
+ percentageRemaining,
21
+ upgradeUrl,
22
+ isDepleted,
23
+ }: TrialWarningEmailProps) {
24
+ const text = {
25
+ previewDepleted: "Your trial credits are depleted",
26
+ previewWarning: "Your trial credits are running low",
27
+ headingDepleted: "Trial Credits Depleted",
28
+ headingWarning: "Trial Credits Running Low",
29
+ bodyDepleted1: "Your workspace",
30
+ bodyDepleted2: "has used all trial credits.",
31
+ warningText: "Subscribe to a plan to continue using AI features.",
32
+ bodyWarning1: "Your workspace",
33
+ bodyWarning2: "has",
34
+ bodyWarning3: "trial credits remaining",
35
+ button: "Subscribe Now",
36
+ };
37
+
38
+ return (
39
+ <BaseLayout
40
+ preview={isDepleted ? text.previewDepleted : text.previewWarning}
41
+ >
42
+ <Text style={headingStyle}>
43
+ {isDepleted ? text.headingDepleted : text.headingWarning}
44
+ </Text>
45
+
46
+ {isDepleted ? (
47
+ <>
48
+ <Text style={bodyTextStyle}>
49
+ {text.bodyDepleted1} &lsquo;{workspaceName}&rsquo;{" "}
50
+ {text.bodyDepleted2}
51
+ </Text>
52
+ <Text style={warningTextStyle}>{text.warningText}</Text>
53
+ </>
54
+ ) : (
55
+ <Text style={bodyTextStyle}>
56
+ {text.bodyWarning1} &lsquo;{workspaceName}&rsquo; {text.bodyWarning2}{" "}
57
+ {creditsRemaining.toLocaleString()} / {totalCredits.toLocaleString()}{" "}
58
+ {text.bodyWarning3} ({percentageRemaining}%).
59
+ </Text>
60
+ )}
61
+
62
+ <Button href={upgradeUrl} style={buttonStyle}>
63
+ {text.button}
64
+ </Button>
65
+ </BaseLayout>
66
+ );
67
+ }
68
+
69
+ const headingStyle: React.CSSProperties = {
70
+ color: "#18181b",
71
+ fontSize: "22px",
72
+ fontWeight: 700,
73
+ lineHeight: "30px",
74
+ margin: "0 0 16px",
75
+ };
76
+
77
+ const bodyTextStyle: React.CSSProperties = {
78
+ color: "#18181b",
79
+ fontSize: "15px",
80
+ lineHeight: "24px",
81
+ margin: "0 0 12px",
82
+ };
83
+
84
+ const warningTextStyle: React.CSSProperties = {
85
+ color: "#dc2626",
86
+ fontSize: "15px",
87
+ fontWeight: 600,
88
+ lineHeight: "24px",
89
+ margin: "0 0 12px",
90
+ };
91
+
92
+ const buttonStyle: React.CSSProperties = {
93
+ backgroundColor: "#7c3aed",
94
+ borderRadius: "6px",
95
+ color: "#ffffff",
96
+ display: "inline-block",
97
+ fontSize: "15px",
98
+ fontWeight: 600,
99
+ lineHeight: "100%",
100
+ padding: "12px 24px",
101
+ textDecoration: "none",
102
+ textAlign: "center" as const,
103
+ marginTop: "8px",
104
+ };
@@ -0,0 +1,72 @@
1
+ import { Button, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { BaseLayout } from "./base-layout";
4
+
5
+ export interface VerifyEmailEmailProps {
6
+ userName: string;
7
+ verificationUrl: string;
8
+ }
9
+
10
+ export function VerifyEmailEmail({
11
+ userName,
12
+ verificationUrl,
13
+ }: VerifyEmailEmailProps) {
14
+ const text = {
15
+ preview: "Verify your email address",
16
+ heading: "Verify your email",
17
+ greeting: "Hi",
18
+ body: "Please verify your email address by clicking the button below.",
19
+ button: "Verify Email",
20
+ note: "This link expires in 24 hours. If you didn't create an account, you can safely ignore this email.",
21
+ };
22
+
23
+ return (
24
+ <BaseLayout preview={text.preview}>
25
+ <Text style={headingStyle}>{text.heading}</Text>
26
+ <Text style={bodyTextStyle}>
27
+ {text.greeting} {userName},
28
+ </Text>
29
+ <Text style={bodyTextStyle}>{text.body}</Text>
30
+ <Button href={verificationUrl} style={buttonStyle}>
31
+ {text.button}
32
+ </Button>
33
+ <Text style={noteStyle}>{text.note}</Text>
34
+ </BaseLayout>
35
+ );
36
+ }
37
+
38
+ const headingStyle: React.CSSProperties = {
39
+ color: "#18181b",
40
+ fontSize: "22px",
41
+ fontWeight: 700,
42
+ lineHeight: "30px",
43
+ margin: "0 0 16px",
44
+ };
45
+
46
+ const bodyTextStyle: React.CSSProperties = {
47
+ color: "#18181b",
48
+ fontSize: "15px",
49
+ lineHeight: "24px",
50
+ margin: "0 0 12px",
51
+ };
52
+
53
+ const buttonStyle: React.CSSProperties = {
54
+ backgroundColor: "#7c3aed",
55
+ borderRadius: "6px",
56
+ color: "#ffffff",
57
+ display: "inline-block",
58
+ fontSize: "15px",
59
+ fontWeight: 600,
60
+ lineHeight: "100%",
61
+ padding: "12px 24px",
62
+ textDecoration: "none",
63
+ textAlign: "center" as const,
64
+ marginTop: "8px",
65
+ };
66
+
67
+ const noteStyle: React.CSSProperties = {
68
+ color: "#71717a",
69
+ fontSize: "13px",
70
+ lineHeight: "20px",
71
+ marginTop: "20px",
72
+ };
@@ -0,0 +1,64 @@
1
+ import { Button, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { emailBrand } from "../brand";
4
+ import { BaseLayout } from "./base-layout";
5
+
6
+ export interface WelcomeEmailProps {
7
+ userName: string;
8
+ dashboardUrl: string;
9
+ }
10
+
11
+ export function WelcomeEmail({ userName, dashboardUrl }: WelcomeEmailProps) {
12
+ const { name } = emailBrand();
13
+ const text = {
14
+ preview: name
15
+ ? `Welcome to ${name}, ${userName}!`
16
+ : `Welcome, ${userName}!`,
17
+ heading: name ? `Welcome to ${name}` : "Welcome",
18
+ greeting: "Hi",
19
+ body: "Thanks for signing up! You're all set to start using AI-powered tools to boost your productivity.",
20
+ button: "Go to Dashboard",
21
+ };
22
+
23
+ return (
24
+ <BaseLayout preview={text.preview}>
25
+ <Text style={headingStyle}>{text.heading}</Text>
26
+ <Text style={bodyTextStyle}>
27
+ {text.greeting} {userName},
28
+ </Text>
29
+ <Text style={bodyTextStyle}>{text.body}</Text>
30
+ <Button href={dashboardUrl} style={buttonStyle}>
31
+ {text.button}
32
+ </Button>
33
+ </BaseLayout>
34
+ );
35
+ }
36
+
37
+ const headingStyle: React.CSSProperties = {
38
+ color: "#18181b",
39
+ fontSize: "22px",
40
+ fontWeight: 700,
41
+ lineHeight: "30px",
42
+ margin: "0 0 16px",
43
+ };
44
+
45
+ const bodyTextStyle: React.CSSProperties = {
46
+ color: "#18181b",
47
+ fontSize: "15px",
48
+ lineHeight: "24px",
49
+ margin: "0 0 12px",
50
+ };
51
+
52
+ const buttonStyle: React.CSSProperties = {
53
+ backgroundColor: "#7c3aed",
54
+ borderRadius: "6px",
55
+ color: "#ffffff",
56
+ display: "inline-block",
57
+ fontSize: "15px",
58
+ fontWeight: 600,
59
+ lineHeight: "100%",
60
+ padding: "12px 24px",
61
+ textDecoration: "none",
62
+ textAlign: "center" as const,
63
+ marginTop: "8px",
64
+ };
@@ -0,0 +1,105 @@
1
+ import { Button, Section, Text } from "@react-email/components";
2
+ import * as React from "react";
3
+ import { BaseLayout } from "./base-layout";
4
+
5
+ export interface WorkspaceInvitationEmailProps {
6
+ inviterName: string;
7
+ workspaceName: string;
8
+ role: string;
9
+ acceptUrl: string;
10
+ declineUrl: string;
11
+ }
12
+
13
+ export function WorkspaceInvitationEmail({
14
+ inviterName,
15
+ workspaceName,
16
+ role,
17
+ acceptUrl,
18
+ declineUrl,
19
+ }: WorkspaceInvitationEmailProps) {
20
+ const text = {
21
+ preview: `${inviterName} invited you to join ${workspaceName}`,
22
+ heading: "You're invited!",
23
+ body: "has invited you to join the workspace",
24
+ as: "as a",
25
+ invitedYou: "",
26
+ acceptButton: "Accept Invitation",
27
+ declineButton: "Decline",
28
+ note: "This invitation expires in 7 days.",
29
+ };
30
+
31
+ return (
32
+ <BaseLayout preview={text.preview}>
33
+ <Text style={headingStyle}>{text.heading}</Text>
34
+ <Text style={bodyTextStyle}>
35
+ <strong>{inviterName}</strong> {text.body}{" "}
36
+ <strong>&lsquo;{workspaceName}&rsquo;</strong> {text.as}{" "}
37
+ <strong>{role}</strong>
38
+ {text.invitedYou ? ` ${text.invitedYou}` : ""}.
39
+ </Text>
40
+ <Section style={buttonGroupStyle}>
41
+ <Button href={acceptUrl} style={acceptButtonStyle}>
42
+ {text.acceptButton}
43
+ </Button>
44
+ <Button href={declineUrl} style={declineButtonStyle}>
45
+ {text.declineButton}
46
+ </Button>
47
+ </Section>
48
+ <Text style={noteStyle}>{text.note}</Text>
49
+ </BaseLayout>
50
+ );
51
+ }
52
+
53
+ const headingStyle: React.CSSProperties = {
54
+ color: "#18181b",
55
+ fontSize: "22px",
56
+ fontWeight: 700,
57
+ lineHeight: "30px",
58
+ margin: "0 0 16px",
59
+ };
60
+
61
+ const bodyTextStyle: React.CSSProperties = {
62
+ color: "#18181b",
63
+ fontSize: "15px",
64
+ lineHeight: "24px",
65
+ margin: "0 0 12px",
66
+ };
67
+
68
+ const buttonGroupStyle: React.CSSProperties = {
69
+ marginTop: "8px",
70
+ };
71
+
72
+ const acceptButtonStyle: React.CSSProperties = {
73
+ backgroundColor: "#7c3aed",
74
+ borderRadius: "6px",
75
+ color: "#ffffff",
76
+ display: "inline-block",
77
+ fontSize: "15px",
78
+ fontWeight: 600,
79
+ lineHeight: "100%",
80
+ padding: "12px 24px",
81
+ textDecoration: "none",
82
+ textAlign: "center" as const,
83
+ marginRight: "12px",
84
+ };
85
+
86
+ const declineButtonStyle: React.CSSProperties = {
87
+ backgroundColor: "transparent",
88
+ border: "1px solid #d4d4d8",
89
+ borderRadius: "6px",
90
+ color: "#71717a",
91
+ display: "inline-block",
92
+ fontSize: "15px",
93
+ fontWeight: 600,
94
+ lineHeight: "100%",
95
+ padding: "12px 24px",
96
+ textDecoration: "none",
97
+ textAlign: "center" as const,
98
+ };
99
+
100
+ const noteStyle: React.CSSProperties = {
101
+ color: "#71717a",
102
+ fontSize: "13px",
103
+ lineHeight: "20px",
104
+ marginTop: "20px",
105
+ };