From edddb87f833cc1e47bbeaeff2e41e9be07a969d5 Mon Sep 17 00:00:00 2001 From: Ajay Bhargava Date: Thu, 26 Feb 2026 23:16:47 -0500 Subject: [PATCH] feat: paid privacy opt-out, email thread entitlements, and settings cleanup Backend: - Add paid opt-out of training data (schema, enforcement in conversationLogs, Polar webhooks) - Add email thread metering: 10 free/month, auto-paywall email on 11th via preflightOutboundEmail - Integrate preflight checks into emailReply.ts and notes.ts - Add Polar webhook handlers for subscription lifecycle (create/update/cancel) - Auto-populate email from mentraUserId on user creation - Add backfillEmailsFromMentraId internal mutation for existing users - New email templates: OptOutCheckout, EmailThreadPaywall Frontend: - Settings: add Training Data card (sends opt-out email, no in-app checkout) - Remove all payment/billing/usage language from web app - Remove Email Threads card entirely (entitlement handled via email) - Type safety fixes across ChatPage, FollowupsPage, MemoryPage, QueuePage Screenshots: - Add iPhone 15 mobile screenshots for Home, Memory, Follow-ups, Queue, Settings Amp-Thread-ID: https://ampcode.com/threads/T-019c9d33-f47d-73fa-b739-2873a25a4d6f Co-authored-by: Amp --- apps/api/package.json | 2 +- apps/application/package.json | 2 +- apps/web/package.json | 22 +- apps/web/src/components/ChatPage.tsx | 2 +- apps/web/src/components/FollowupChatPage.tsx | 2 +- apps/web/src/components/FollowupsPage.tsx | 96 +- apps/web/src/components/MemoryPage.tsx | 71 +- apps/web/src/components/QueuePage.tsx | 99 +- apps/web/src/components/SettingsPage.tsx | 68 +- .../src/components/charts/ToolUsageChart.tsx | 19 +- apps/web/tsconfig.json | 1 + docs/screenshots/followups-mobile.png | Bin 0 -> 23375 bytes docs/screenshots/home-mobile.png | Bin 0 -> 46723 bytes docs/screenshots/memory-mobile.png | Bin 0 -> 61110 bytes docs/screenshots/queue-mobile.png | Bin 0 -> 51399 bytes docs/screenshots/settings-mobile.png | Bin 0 -> 16312 bytes package.json | 20 +- packages/convex/_generated/api.d.ts | 1566 +++++++++-------- packages/convex/conversationLogs.ts | 5 + packages/convex/emailEntitlements.ts | 117 ++ packages/convex/emailEntitlementsNode.ts | 96 + packages/convex/emailReply.ts | 40 +- packages/convex/emails/EmailThreadPaywall.tsx | 117 ++ packages/convex/emails/OptOutCheckout.tsx | 114 ++ packages/convex/http.ts | 49 +- packages/convex/notes.ts | 19 + packages/convex/optOut.ts | 52 + packages/convex/package.json | 6 +- packages/convex/payments.ts | 93 + packages/convex/schema.ts | 10 + packages/convex/tsconfig.json | 1 + packages/convex/users.ts | 63 + 32 files changed, 1827 insertions(+), 925 deletions(-) create mode 100644 docs/screenshots/followups-mobile.png create mode 100644 docs/screenshots/home-mobile.png create mode 100644 docs/screenshots/memory-mobile.png create mode 100644 docs/screenshots/queue-mobile.png create mode 100644 docs/screenshots/settings-mobile.png create mode 100644 packages/convex/emailEntitlements.ts create mode 100644 packages/convex/emailEntitlementsNode.ts create mode 100644 packages/convex/emails/EmailThreadPaywall.tsx create mode 100644 packages/convex/emails/OptOutCheckout.tsx create mode 100644 packages/convex/optOut.ts diff --git a/apps/api/package.json b/apps/api/package.json index c8be83a..64f68c1 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -21,7 +21,7 @@ "dependencies": { "@elysiajs/cors": "^1.4.1", "@t3-oss/env-core": "^0.13.10", - "convex": "^1.31.7", + "convex": "^1.32.0", "jose": "^6.1.3", "jsonwebtoken": "^9.0.3", "zod": "^3.25.76" diff --git a/apps/application/package.json b/apps/application/package.json index 6fc9bb2..d8d24e7 100644 --- a/apps/application/package.json +++ b/apps/application/package.json @@ -18,7 +18,7 @@ "@mentra/sdk": "^2.1.29", "@t3-oss/env-core": "^0.13.10", "@tavily/core": "^0.5.14", - "convex": "^1.31.7", + "convex": "^1.32.0", "exa-js": "^1.10.2", "openai": "^5.23.2", "zod": "^3.25.76" diff --git a/apps/web/package.json b/apps/web/package.json index 55e913f..801957f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -27,30 +27,30 @@ "@vercel/analytics": "^1.6.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "convex": "^1.31.7", + "convex": "^1.32.0", "date-fns": "^4.1.0", - "framer-motion": "^12.34.0", + "framer-motion": "^12.34.3", "lucide-react": "^0.553.0", - "mapbox-gl": "^3.18.1", - "motion": "^12.34.0", + "mapbox-gl": "^3.19.0", + "motion": "^12.34.3", "react": "^19.2.4", - "react-day-picker": "^9.13.2", + "react-day-picker": "^9.14.0", "react-dom": "^19.2.4", "react-map-gl": "^8.1.0", - "react-router-dom": "^7.13.0", + "react-router-dom": "^7.13.1", "recharts": "^3.7.0", - "tailwind-merge": "^3.4.0", + "tailwind-merge": "^3.5.0", "zod": "^3.25.76" }, "devDependencies": { - "@tailwindcss/vite": "^4.1.18", - "@types/node": "^24.10.13", + "@tailwindcss/vite": "^4.2.1", + "@types/node": "^24.10.15", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^4.7.0", - "autoprefixer": "^10.4.24", + "autoprefixer": "^10.4.27", "postcss": "^8.5.6", - "tailwindcss": "^4.1.18", + "tailwindcss": "^4.2.1", "tailwindcss-animate": "^1.0.7", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", diff --git a/apps/web/src/components/ChatPage.tsx b/apps/web/src/components/ChatPage.tsx index a7c26b3..0c35831 100644 --- a/apps/web/src/components/ChatPage.tsx +++ b/apps/web/src/components/ChatPage.tsx @@ -76,7 +76,7 @@ export function ChatPage({ mentraUserId }: ChatPageProps) { useEffect(() => { if (existingMessages && pendingMessages.length > 0) { const existingContents = new Set( - existingMessages.map((m) => `${m.role}:${m.content}`), + existingMessages.map((m: Message) => `${m.role}:${m.content}`), ); const remaining = pendingMessages.filter( (m) => !existingContents.has(`${m.role}:${m.content}`), diff --git a/apps/web/src/components/FollowupChatPage.tsx b/apps/web/src/components/FollowupChatPage.tsx index 1e94f6b..907f07a 100644 --- a/apps/web/src/components/FollowupChatPage.tsx +++ b/apps/web/src/components/FollowupChatPage.tsx @@ -46,7 +46,7 @@ export function FollowupChatPage({ mentraUserId }: FollowupChatPageProps) { useEffect(() => { if (existingMessages && pendingMessages.length > 0) { const existingContents = new Set( - existingMessages.map((m) => `${m.role}:${m.content}`), + existingMessages.map((m: Message) => `${m.role}:${m.content}`), ); const remaining = pendingMessages.filter( (m) => !existingContents.has(`${m.role}:${m.content}`), diff --git a/apps/web/src/components/FollowupsPage.tsx b/apps/web/src/components/FollowupsPage.tsx index b7d5ca1..de0d410 100644 --- a/apps/web/src/components/FollowupsPage.tsx +++ b/apps/web/src/components/FollowupsPage.tsx @@ -125,52 +125,60 @@ export function FollowupsPage({ userId }: FollowupsPageProps) {

Follow-ups

- {followups.map((followup) => ( - { - if (followup.status === "pending") { - navigate(`/followups/chat/${followup._id}`); - } - }} - > - -
- {followup.topic} - -
-
- -

{followup.summary}

+ {followups.map( + (followup: { + _id: Id<"followups">; + topic: string; + summary: string; + status: "pending" | "completed" | "dismissed"; + createdAt: string; + }) => ( + { + if (followup.status === "pending") { + navigate(`/followups/chat/${followup._id}`); + } + }} + > + +
+ {followup.topic} + +
+
+ +

{followup.summary}

-
-

- {formatRelativeTime(followup.createdAt)} -

+
+

+ {formatRelativeTime(followup.createdAt)} +

- {followup.status === "pending" && ( -
- - -
- )} -
- - - ))} + {followup.status === "pending" && ( +
+ + +
+ )} +
+
+
+ ), + )}
); diff --git a/apps/web/src/components/MemoryPage.tsx b/apps/web/src/components/MemoryPage.tsx index ee46e84..55b0203 100644 --- a/apps/web/src/components/MemoryPage.tsx +++ b/apps/web/src/components/MemoryPage.tsx @@ -82,40 +82,47 @@ export function MemoryPage({ mentraUserId }: MemoryPageProps) {

Memory

- {result.summaries.map((day) => ( - navigate(`/memory/chat/${day.date}`)} - > - - - 📅 - {formatDate(day.date)} - - - -

{day.summary}

+ {result.summaries.map( + (day: { + date: string; + summary: string; + topics: string[]; + sessionCount: number; + }) => ( + navigate(`/memory/chat/${day.date}`)} + > + + + 📅 + {formatDate(day.date)} + + + +

{day.summary}

- {day.topics.length > 0 && ( -
- {day.topics.map((topic) => ( - - {topic} - - ))} -
- )} + {day.topics.length > 0 && ( +
+ {day.topics.map((topic: string) => ( + + {topic} + + ))} +
+ )} -

- {day.sessionCount} session{day.sessionCount > 1 ? "s" : ""} -

-
-
- ))} +

+ {day.sessionCount} session{day.sessionCount > 1 ? "s" : ""} +

+
+
+ ), + )}
); diff --git a/apps/web/src/components/QueuePage.tsx b/apps/web/src/components/QueuePage.tsx index 756b356..93e67f4 100644 --- a/apps/web/src/components/QueuePage.tsx +++ b/apps/web/src/components/QueuePage.tsx @@ -9,7 +9,10 @@ interface QueuePageProps { userId: Id<"users">; } -const PREFIX_COLORS: Record = { +const PREFIX_COLORS: Record< + string, + { bg: string; text: string; label: string } +> = { W: { bg: "bg-blue-100", text: "text-blue-700", label: "Weather" }, M: { bg: "bg-purple-100", text: "text-purple-700", label: "Memory" }, S: { bg: "bg-green-100", text: "text-green-700", label: "Search" }, @@ -51,9 +54,19 @@ interface MessageCardProps { displayedAt?: string; } -function MessageCard({ message, prefix, status, createdAt, displayedAt }: MessageCardProps) { - const prefixStyle = PREFIX_COLORS[prefix] || { bg: "bg-gray-100", text: "text-gray-700", label: prefix }; - +function MessageCard({ + message, + prefix, + status, + createdAt, + displayedAt, +}: MessageCardProps) { + const prefixStyle = PREFIX_COLORS[prefix] || { + bg: "bg-gray-100", + text: "text-gray-700", + label: prefix, + }; + const statusStyles = { queued: "border-yellow-300 bg-yellow-50", displayed: "border-border", @@ -63,11 +76,15 @@ function MessageCard({ message, prefix, status, createdAt, displayedAt }: Messag const cleanMessage = message.replace(/^\/\/ Clairvoyant\n[A-Z]: /, ""); return ( -
+
- + {prefixStyle.label} {status === "queued" && ( @@ -84,7 +101,9 @@ function MessageCard({ message, prefix, status, createdAt, displayedAt }: Messag

{cleanMessage}

- {displayedAt ? formatRelativeTime(displayedAt) : formatRelativeTime(createdAt)} + {displayedAt + ? formatRelativeTime(displayedAt) + : formatRelativeTime(createdAt)}
@@ -115,8 +134,12 @@ export function QueuePage({ userId }: QueuePageProps) { ); } - const queuedMessages = messages.filter((m) => m.status === "queued").slice(0, MAX_VISIBLE); - const recentMessages = messages.filter((m) => m.status !== "queued").slice(0, MAX_VISIBLE); + const queuedMessages = messages + .filter((m: { status: string }) => m.status === "queued") + .slice(0, MAX_VISIBLE); + const recentMessages = messages + .filter((m: { status: string }) => m.status !== "queued") + .slice(0, MAX_VISIBLE); return (
@@ -144,16 +167,25 @@ export function QueuePage({ userId }: QueuePageProps) {

No messages in queue

) : (
- {queuedMessages.map((msg) => ( - - ))} + {queuedMessages.map( + (msg: { + _id: string; + message: string; + prefix: string; + status: string; + createdAt: string; + displayedAt?: string; + }) => ( + + ), + )}
)} @@ -168,16 +200,25 @@ export function QueuePage({ userId }: QueuePageProps) {

No recent messages

) : (
- {recentMessages.map((msg) => ( - - ))} + {recentMessages.map( + (msg: { + _id: string; + message: string; + prefix: string; + status: string; + createdAt: string; + displayedAt?: string; + }) => ( + + ), + )}
)} diff --git a/apps/web/src/components/SettingsPage.tsx b/apps/web/src/components/SettingsPage.tsx index 7bbf33b..c76a5be 100644 --- a/apps/web/src/components/SettingsPage.tsx +++ b/apps/web/src/components/SettingsPage.tsx @@ -1,6 +1,6 @@ import { api } from "@convex/_generated/api"; import type { Id } from "@convex/_generated/dataModel"; -import { useMutation, useQuery } from "convex/react"; +import { useAction, useMutation, useQuery } from "convex/react"; import { useEffect, useMemo, useState } from "react"; import { LocationSelector } from "./LocationSelector"; import { MessageSpeedSelector } from "./MessageSpeedSelector"; @@ -33,18 +33,27 @@ export function SettingsPage({ userId, mentraUserId }: SettingsPageProps) { const updatePreferences = useMutation(api.users.updatePreferences); const updatePrefixPriorities = useMutation(api.users.updatePrefixPriorities); const updateMessageGapSpeed = useMutation(api.users.updateMessageGapSpeed); - + const requestOptOutCheckoutEmail = useAction( + api.optOut.requestOptOutCheckoutEmail, + ); const storedEmail = useQuery( api.users.getEmail, mentraUserId ? { mentraUserId } : "skip", ); + const optOutStatus = useQuery( + api.users.getOptOutStatus, + mentraUserId ? { mentraUserId } : "skip", + ); const updateEmail = useMutation(api.users.updateEmail); const [emailInput, setEmailInput] = useState(""); const [emailStatus, setEmailStatus] = useState< "idle" | "saving" | "saved" | "error" >("idle"); const [emailError, setEmailError] = useState(null); - + const [optOutRequestStatus, setOptOutRequestStatus] = useState< + "idle" | "sending" | "sent" | "error" + >("idle"); + const [optOutError, setOptOutError] = useState(null); useEffect(() => { if (storedEmail !== undefined && storedEmail !== null) { setEmailInput(storedEmail); @@ -97,6 +106,26 @@ export function SettingsPage({ userId, mentraUserId }: SettingsPageProps) { console.log(`Preference saved: messageGapSpeed=${speed}`); }; + const handleRequestOptOut = async () => { + if (!mentraUserId) return; + + setOptOutRequestStatus("sending"); + setOptOutError(null); + try { + const result = await requestOptOutCheckoutEmail({ mentraUserId }); + if (!result.success) { + setOptOutError("Unable to send opt-out email."); + setOptOutRequestStatus("error"); + return; + } + setOptOutRequestStatus("sent"); + setTimeout(() => setOptOutRequestStatus("idle"), 2500); + } catch { + setOptOutError("Unable to send opt-out email."); + setOptOutRequestStatus("error"); + } + }; + const hasPreferencesLoaded = preferences !== undefined; const weatherUnit = useMemo(() => { if (!preferences) { @@ -200,6 +229,39 @@ export function SettingsPage({ userId, mentraUserId }: SettingsPageProps) { + + + Training Data + + Control whether your data is used for model training. + + + +

+ Status:{" "} + {optOutStatus?.optedOut ? "Opted out" : "Included in training"} +

+ {!optOutStatus?.optedOut && ( + + )} + {optOutRequestStatus === "sent" && ( +

+ Email sent with instructions. +

+ )} + {optOutError && ( +

{optOutError}

+ )} +
+
+ Weather Unit diff --git a/apps/web/src/components/charts/ToolUsageChart.tsx b/apps/web/src/components/charts/ToolUsageChart.tsx index 15c3b53..3471afc 100644 --- a/apps/web/src/components/charts/ToolUsageChart.tsx +++ b/apps/web/src/components/charts/ToolUsageChart.tsx @@ -79,6 +79,8 @@ export function ToolUsageChart({ days: timeframe, }); + type ToolInvocation = { date: string; router: string; count: number }; + const chartMemo = useMemo(() => { if (!toolInvocations || !toolInvocations.length) { return { @@ -90,7 +92,7 @@ export function ToolUsageChart({ } // Filter out KNOWLEDGE entries - const filteredInvocations = toolInvocations.filter( + const filteredInvocations = (toolInvocations as ToolInvocation[]).filter( ({ router }) => router !== "KNOWLEDGE", ); @@ -226,12 +228,15 @@ export function ToolUsageChart({ /> - new Date(`${value}T00:00:00Z`).toLocaleDateString(undefined, { - weekday: "short", - month: "short", - day: "numeric", - }) + labelFormatter={(value) => + new Date(`${String(value)}T00:00:00Z`).toLocaleDateString( + undefined, + { + weekday: "short", + month: "short", + day: "numeric", + }, + ) } formatter={(value, name) => [ Number(value).toLocaleString(), diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 1c055cc..c7200d7 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -19,6 +19,7 @@ "noEmit": true, "strict": true, "skipLibCheck": true, + "types": ["node"], "noFallthroughCasesInSwitch": true, "noUncheckedIndexedAccess": true, "noImplicitOverride": true, diff --git a/docs/screenshots/followups-mobile.png b/docs/screenshots/followups-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd522c507066fe56232e3f2fa8e5ff470b0f6c5 GIT binary patch literal 23375 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 N3-0LQP-7pI^gpTGooE06 literal 0 HcmV?d00001 diff --git a/docs/screenshots/home-mobile.png b/docs/screenshots/home-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..52055252f32c1c1dd98f359e200c7f9ff2a04548 GIT binary patch literal 46723 zcmeFZWlSAWA2$dTcejhXySux)ySo*K;_mKFafjmW1q!rKoZ?#C%Ps8mdH2a?H@hG9 z!<*e~mV|`NOzzA%=l}oNnM1d6~XxwU&eBw3*=rEx|Mk17!~1kG1%hRQqaRuadZsI7;4}RBq#=D zDQxk)5U$hynEP$R6ZG#_Z-a%|Op}L?-&xoYu3mRNmA-uYJqv#9=j|2DEl{CF2qQZY zr@@34Uw}=e5=ZBfppr+2PDGanj!;Ua0f*uL|HJ>UpA(8X>eFO4!eDy+0JR6PKjabj zyG~3ULKl9^6@gx+5Y&Zdv`kq646SJM8}Cre2v2U`<#C0ez&Uc#Y)XrDnv3`15Pm)BcoFyIeMemzF;!U|GyG)kH zE5W#UR#|;~LH(UeJja_K(`^91FsW#Fhnqmwx5@8u@RF|*mWc-2#LC&kMUJ_BKf@-O zLQ}I7k3tRJ_5}_fI8ozgLh^3)W^_>K*X4C~mY%FQ93VRq7-Xc&v+7`cMc$n0ZYvK~ zpj6yxe%cM$$xUGrvJqwKWpK48~PRE(e~mp#yycF9@m85U$tF5WEDH}@1M z%+PS*qmQCft9%+)J8mQS(jqu*UT&p6Q5-xcyHc33<-$cd&@?7cGi{Ifl(9Dbf*jkj zk>K3Ao@f(#Uc4n^t|B2h;*qc6!!%#(F*1|t3HDpIkHN;|+senYv#f~T-!C9hH0vPZ zNESq3n4h;fAk~+caHFuQnUKGgv&oMx(k^p~S|@1KuCKK=>P&AbawKq4lUB*8G�!tEyY475u2>6Z4zFHP^{q+QsXuCv$n> zx{xtyU0s9-4-Mo{V2Bprt*NrHj3nyTf7LmvlYUV9yXl*Esi4vavPUU#+Fv3@eV{{OqziuD&^xOSgS6ykAtT7J@h68^TlOsP&iE>$) zI#Ttac{lx6`z4R~*{lsoO&ysE=hSqh^~W-h%m*3Cu+j+FgedG>55^Hr&aDtwsUydrHdng?uZ`>WYP-s|qbEuEB z86^5Wn1e(YBE`im;2um5CebP-FD6+~n4Gj(6aK9^0!y8yZOgcIY`o{P_yCkoK(chw zwXtQQ8~)019AzU@wY3pDYe(Q(8E)Sy3?G?*YnK30eS#vYsW(rE!36tVt$|EdR~D=O z3Y1b&JBx>h_{P9z2B@kX*o1VNALrLH?F_6=bVQFmXYO>ZXdnkfxlF2IP}nf88Ru{L zoL{_wD^>1>ArJV~sPRdKqb~T{S)h%Cj#bPj#`fgRufJum(7sGE&s)SBCXKFVrp9vl zb7viEnc%2IJo=3K@SZp^D0c6)jg3z`(3+-33gPh&jfkj1@@b`f_4NMOeQnDkTJEa1 z?7q25sSDOrSXuisY>pgf;QVO&T(intBbr6MxBA~2#-{( zFT8@GZ*B{px}|PGGM|&=i@d&XfPe752t>g58iQKn@nw=$_`tWkVg*|ck3FsL;qm8c z>z_sm@Y?s`eKK03et%7#8M{%Wu2K2uI;L+Tpb84a-rm+4t2PkDd7iEKM$%XomB}=r zlMdP@DNbg1381@8UO7P`jqJ2s9(F%~&_?X-k-{&z(VH>LXYd$d62?38TYw1dyIf0f z=BP6e>tEGY7Iyn?yL%B!E`zhGC5aN}stE6^+ff~f*9z)Z=%uJ4>r4D%OcQ)EQEI@% z@~vq_c%>Dueq@7=V*<h34RN>C%DDF=B}32)0G-E8cTiya-g#>mhnZi z_Em|l7tQkA62Y-OR^{F16PG%^Oi*XOei6qPD>C@fVqa7z@bx9apVft-%|6mUN`dl< zQZ#arLsh1_@$)cGOQ+uTgaV=4z@=jIb?XMmv>m9QYawNb`s)WV#)oh=aOGtit``6G zy?{;sjBIwIOM-z+HOUI%ds$&thtqNjy49MEyW#txK;|{?NKEyiiGrirOh+FIN+M*;$v+jCI(dJ0N0Ggki``ALva8N1kz`t6n>&0OTQhox*w`r-E&i^9l+++ zsHc!?Ahh(Xn-J=G$Y)ZKi_Di2EGcA)862FpT7b`4@=Oj~wx z5iA@n9CL0YLVJV}k7^0^YLG>)CLTgE;IN)m4W~A%$`vwu$DvVRlVf-4En}^D9-MA=gD@j%)mIzSr zQ4nZyv{TcUhvaYwo`m2L;|jLSm!RSbe$C^T%{GM$O1yrmFz@O~dbCNk4Ku=kEUPJ)@XYVW8+ z(rR;GCe{mAuWldDMf3-;>*#L#2!FyMT`-0W<48@$AUjC{Qz^*J-N2T-cxX~p?_kj7 znTa9_^cDyI=dG5#uU~Y%+B(O~B&x2yHDb}Rj>%jozyD|$FY%Sr;U#J`y9HCvyyHV6 zoVeNyrBl>)X;vyPBTHq_e@Gz`zZ|lhe7NylOn7~7yj+!qZYx4Ds;CFI+s9jSu8#Wn z0fO}30Lik=ktwB;%c0lor=)Lj&|nvN{c1cyc8QkJ;y`j|7-!x6JZNPq!%-g+$S}qR zG(z03#+lDw`zHRz?aNM4W$9|^0s@M62nA*2UYlfJMqMOiU{=x8nEkhRaR``e#%a}M zMLR1cbp8$>puj+Ig!Co8(qMF|su-tp+FF-Im!Sl`8zkwR1g!7~Lq2@Qu`2`xB8mVTa98L|+vcPF1Tc?Zj9J zs|`RrZ)~}&d#Nje%S|jgn5_{)$X#{?)ZIF1bLTf$xPCp!1`PC!_V#>1c&@<1X8Upz z)VEqK^Q*UK&x6t;45Bij(O^1=vH}^W6`6LWZ&ZZiy z8O@phNc~{6)Ev9}>4lH+)UDk;-K4CZYRb`CRp-02uMn9wrHcgY5JT1yGw5MnJj^X$ zJ~MOaD$HC1_l|cqG?``bi9CvZ4@*Y|{|fh0+GNc2e82f-lNrly(#qD4@=N$`^2dmc z-#7T9DHGR-?e9N?Ci*c*2(m`$L%JgluMRl?O^i=2QcE)b={U?CdNXifz#-?}jT$p8 zjQ5sbk(z^mSIG*2R|8Nu{tNzHwEDjEx2+N+U!HEMAsAWs67Xo)E~lSVmpGW9jN0kq z;kry_PWcs^ik^rn!o$PKgu#?cx6O(&W+WX6;pLxuUQZ&UbiaXaoVZk$ZYTW`u6Z0@ zT9_u9J7v9Pf0WuiQItP65PEw!lEaun4bhv0l|o*rvu2b)mNQ_WU;BcwLnsE(9s1P5 zDE6hOwNiU+c>{S(9}fSuvOp#5(T7aRINZKTO)WG?s1-feUNcLxH{-+cgh88XYq$ue8WtaW8KN-zska{OYv5vk(MqC^A0b5-7 zoyFLeW$KE|cRE$qA@gjJQg`nMa%){y)GEBTACGkN(x@MOSw>D*twi5(8@5NqaQ1IW z;<+6N)HB)6$y=&gHKKRAX2QZm37v!#!sB{b7w!bB@s>95RdCFOt1wsjjQCx2lFW zx;{!UnQ(0G156Ov)YNJ{=sv3oHc)`auVd#>5kg0LVqCOlWMdL+4bS@DEMQ3z0#8eF zM6~YWS9eYyY*f98hAYy(RQ366ZI(O5=Fp?exb&s^!PS0{2CHuG{7V-(CEYD?088vv zaP$w~gt;0EE)vz|&&@Ys9p{cWACU-Hm3ZMf)>+mgBqP_(7?8q9lfkc10<8jF;iMa$ z-+zN9I#i}8^%FW!<7Q+wMQt}(MI)V9s4{m(1q$4G-QMn$kUO64QqT8a4ZhmdLY}Esj}x z?rKINZsi_8B?1JHPczgx9p~Xi&?))rL;gK7pR??UVKT zag(#6=?H)B(eN{MF7~^>+o$G!ks&}!gI?R)h7}u`mk$lLdcZC;uX!POC>)>1&l$Bd zh*-zajn2jzXSPL|BYb}}s_@@UNluyj^KyiZUe^lEr^sHbFEu%sU(`Gm&E(>*!|Jf_ za@sNl`Ne9G=I7Ghu7Dmz3&Tbi10?p7b%I>}VbFk0Nor!?+35lUq>SO@Lj+}tZhzld zYW>;A2D;^w?ySF4pi$O<=f?2tWK!tbeNSdtfqe&lnV?Vz5_CfH`d8aFg5o^7(xSw6 ze<%!+IX6`lzMo~g`n=0l`!RSN1r(rh?h3v0D_rW%Q2u4g0Hc|=n~sD_uB@62StWjPWM}GwO%W7J?vm$|NNLu19c(kz%pD$6KoDG*-l?}|5f1;FpDoV)9M4}KUHn0gFB;$lcPr?M=; zSUkT|Sp3y*R_~BI?px7stYev?;HNZ`X_o}7QLZ4-&Ku|c{eb`l)^6!-TX!tMrU;VKUw_0W z5>X*__2iA)2wB&N?zF5jMs&#(V<^EMTYL|T&&hDa*QcP|atamkne`gj-q~Ib$OZ;5$I;Xe9rZd8IEM;5h3KrLI?w7)rdN zrml``80b~tdr*3qMl2xQCBY`Bdi03xn)0a#-CeRNHYh-3JoOGl7&_~C?!xOZ-hMyA z>u@G`QiL#xE0}_G4N~85j~;;D`H^fv{R&`6hkfL7HbhyWd)1LM-9RhToxOJcpCE)C zR35e!kxW9M+FzH^L7%RU!ah2V*IGI}Bk&r=G@8;-N_lLVGci@es$oQo@W8)C*RZCW z$TF+j;0&Zld1S*#f7a^wH`jGa44@p}Dg!bk6t(B-+eG{xpX zP&IIQefYz}c1di*`lJ5H^6L|ZifhM^w0E5{tMpM_;p993sLozF`)5c$Z7uc*SC^k* zqbv$l>ikBq@u%ly z3)bZk3))91oD2A%sF%OCls%96Qvy_8jv@q(c465R--DmFRl)kqB-*9chkecb zAO`M=mu!fsKOMfo>ViTGz9y)Sb+Ckvi|Y&DcgAd{SRwUr_@~O80GQgKzr1MJ08>M7 zeT@zm8l-gjNR;7Z4mn@Pwq1PB3YkI(t)!R#uZ3A5myi=2&Fpwm(74!wYyQX6fd5qJ zm_l`Fq9mv~Kh`XzFvyQsj}+2I|M_amb53hY#tugLX{KH1-9cHiI}4$GD|Yx7M{U0b z@+`d6Tbm%5!68NWLebmRdS}IPn#5-xQO$#2(by?hr(#Hqk|1&$_<0ITr3(bTQrGy#JxL4ug+e!TK-zwJuGFq+DZ^ z+&ipC@OlHD(7&F&TRt*CZ67Bl7b{#LVddH!x^`6kPkDWck2)TmEaI$j-CEx-X4==J zH8>FbK4kQ&nSF_`Ca1TvQ@^sT7KG6o0I5(PJ3j3 z$txZ1N*^kkY4bmr$z-Xn3*uaru^NG$&^_f9q-bNe;{)uxe;cJoq zVAkETOtvJmWwsr6NMzmL6_j$Bg`pB<=kP>WSh#l&3lt`EXNr;58O>3_^WLZkPCzon zB|xL*D;5eYrOKsV$$c2DnG;#2%QbcOqSj7CQjQpecH8=Or-?RuRGrV7A!fb1WM-M5 zz@njf!;HX7k`hhXLzC7jMZjw=g{4sKoK%g!@%_3BC_U}5%bfgwP4zxtetk zWe$)=y%zXo_JW-5gnq_QcMmMunDQ1RjNfN((NB*xW z-{j_XxqtTX2v4x6S#7?kV;Ie>X)_^o6qt@Lc86LgyP8F2hT1Gcc&rPp(5!fj7{F7_ zhx-^Zxoog~swX5-AubWXQ@N0JucB!!Sb{(SbxUOZZjm`vy9U=zwH&-)hkl)BC}DV# z31mLj$v!dQ0O2=&aV%C~uSuiY)O)sk&2|2nOf#OW=ONz3yT11;nR8CwlZ#BJQgZn` zn@=PP2jfE2l6Q7W@AlCsA$ngh(dV-ftCk_(IL{sS%(lkrsb8QlWx(g5hVCTni^&(k~t`+B~kJhU+Bx|W+1#<=wm1JHo zV>6+G-G2z*j%k3sH4tr{TfZh5*U&b4lnA@9$bhJC!!}6G9Sq!->(mcC-X_$Re#*^w zuI@Wez;n;X4f^lV3>`7oO*5GCh?YZ23+^Y8e*VLgL~3n}bbb92U_+E~Q@G_|L8;3=?P%r_ z#4ui=kmls@Zbv;0$y2QS4sD#QjmIS+EJRrH#}P4Vw68CJ!jgKo#eH8E96Rq8UCD;6 zE#pM+-qrMz&?b;(RIJO6+=|aEgz)&(uAEQxpkJM<&>uT`JefQF9>^n#ahgxc0Seoe2mrl4dRf8*v)IMFf4BF53O=B zaWa;QzHsBqD-zF;eekxM(3KS=WGXBsMWB1#wIhQhwH_>|WJY-2W-&vf4{aNL+-#%g zH(L2dGYF2u^XmnyrH%MC__*tsqKOwxBpmGm9b33QXZ1H#j~3MKsi|19eGKlY4KDsF zAFUd#4Fj3)G*73U|Hq6t^fi`vEV*0X{kd1{2j9chn6C%c!rc9!o*thu!sA~ua}!x^ z`t5+ZB-Zq_!FbcAZmN5!)RkxZ($irc>2$1CK2yD8k-PW#?197F)dMNoJcH;9->(6^ z&s}&Yo^^gY4LfVqu2g7yigN#e|Rx>(m(wIVg?W8LG<47d|N3T0~?@k{Sd z@+cc`Zp?&MJcFIY3CLWDu{Fcj=fN?hh z8tD1AB1G0zj9~iKuFwD_YV?1G#gEeCx7h4@*Vmw5HQ#LiLb^?%foCUi( z3c_Hsj5I3k!&wMmNuU_7Er3=e_R?644!t409K~mz-Rc)9+nW69_<3cRA-LziS%Bxncv_mqf&7ZSq||2beljfRsmEst&pU7&>}DA!9;^X7 zN$R=Wb-wp(*&u2gPN9p+b|fyADtpMT5K7V68vIB)f&DFvVg-R~ujz2fjK6lj#Y_M{ zv#;#0*PL%Nj4mkYdoNx>U81>c0=sKGM{B47$;UPPJBHNh$*Xz;9KYH>m=J{cPSj)T z>Wvb?Sy!0q;AIs(tKVV&7UJEYv*L4AqUNZtc&fWYLNBH6wyH4iY?lj|Is}qG5s*z* zZzh;=33VuNMABcrVmRauLWda0+!M0!G*0|jOE4pK;O|D6{jJHUd4t1StUUDhhxVWE zmUzmknHg?SmsmgV$P6ul-Z!;YN1->-3R~OLe&X@)Bx&%=w@Z$4|JZ(k_-B}Z5 z>%xfQTb#@SJFsy1vxHQK{yJ43yV{qTt4`zj5L0N8JdgN`ezgAdgwR!G(stq~m9L#z zzGwKc3(=``>LXJ<)zaN}Nf43@-j-}XNVw0gLh%N9ps>djs zsF@#E%{w@>8JB+B|LN*_cYZ@6&Rp(1Y9PgYrLC!0mPM|?cJEC+7@7-o+^=nw%*=L? z+at$L{2v|uEo6#-j6&)wxXShx$%goH5{1 znT02*$$o=OyHvDseAQM9oV{!{cI2lrzC_L{s=#v$kzkvL200>974#^3cW@@gy)W(z z#T^}FoRMhTqNw@-=9|{~UZa;ZOoO^rgb+rYOsZ-vt-slZsSj0?9h?R7;0Ilh&+Dg= z#P~o-m=)G)HC_ilFaP3E(dTtJNQPG-~`4HSvA!pSMttjym0nGaj`#E%gTO+K!A^3$qUnPct8$H?Y z9Uu+-Y6!dF){a~Qh-6cI>rtnO{jcs9tu0~6O_kTr-Jx8JEKKK^qBdy?LO|Kuwbsb} zUOyDdsIXsDl!s7ww`<4s=4Ae=sLXGabC#U<%*iBPE>a*}#44C91`oPu?e#K5-M&%p zJCw(|#&o7_((JHc?aUZF>K&Lif;cnCHiRS*ZgnL3)hw2W>K)Qe>Ev~ohr;k1>#2a@ zY*)2^s4B9&X@M^A|CI3xy~(E8x56?1Fa346L#FOpC)wa}@T;yu=)ySKz{>m$YXew3 zIgQ%-il9Ya+8yA{jE^7o!3Rs>ug9O%-Lc$E0bv!APa1lIuu;B8v-8Hv;R5C2g{GCT zys2GBnUIL_z7KbX#moVoi%&A7+1bXl58NHr)xjkFRq%(PA-XD9W<)_--Rf-quJILPX!tKGHy$IL<=o9?| zcxjLIApIGV_yiYk(~!j>jyhgxmhp)ozQtNVTpXduwmO>oMYucU`#Ymo9r^rmJ7d6o zy4^ohcUnQ{a(7@o62c?U1?l2TPb|wUs#y_@S#C_2wIoCBWI%GlPO0z{@g{i2uB&a zz4q^MspQp{1^Fz;h+}J#s(n({K2LL_Ea80VxzPyb&%9VZBeusUwzc@rRDo}-N2jDe z7`ly~MA(@%!|iJ5|Ev6n0jf@15<$xXLWyu^x3kDynN;_)DkebqCw86vq}yLQfwI<) zAIH4vNT?H53~G7f=B}gzu>YdPxjd^FiMt2n;HQ(L4pVK7{Cy6I7cq15U-{srbB>3A zI3PR8;0aSPXm(T}n+jAXpf^k2==}w&ZVK=>E@E-@I}y63ecIH4fSyTJXEC_Prmt-F zM`M4`aMyYlXcTe{C&-p&Cu;h7Aa9z`e5+_J5mtvIeerwW{5252Hs_}qA|vbAAe*5+^Pl!K(9F?L0;(Hy zGk^MAqo;}sdYN+NBykJj&0lsIBcxbv!%=zIjBB#c22c3e95US1sivOMCotho4%RBz ziio7!rCRQhR_(2%UDWceU5ErIQP8{zTLo)l<{qy#Ht{oyqF^)@)wI+Z%vi+tHpBnY z+md<)u^#Pn@;sPSY6=hS$=NLW{zMEWJ?tUu+n0?X!sg9o;H4T!<0<~xItegY3f5bU zbQ#KQEstfoDbmV*(V zl;%~U$0wHQnGF!Imp@Ov>k#0yQGM8WEF_fOuASHgB-n-bd&Lgp<-cNUqV$PF0M-El*9Z4UgAU`>x+!5$h-@MdnbDVF@Q*iO$BC6j5hj zZM5_CFQyw|>PKoUmz)^+KC)|Dv9gM;ASdLp9gfVBV;?TuI|}OmWAG9pI$?lUHc5k4jnScp@nWbD!b&hGf)A7V{}2B^H76+||M%wpSugEqzIf1igTdX=+_cXs@G|d9Sh;NS66rt(s)w&VTDqI5hiwdoE>K9A3RZ)Z51 zl7hnFXZ>1>bh*{(`m5dk#}}uyG-|~xG*NJ~Vm3>L zLm-*_{$w&Ko0*uH7)0>v{i$W=hCF&i?}zBon~Tn0Nrc=C3=D{aTRk7kmr@Pn1w0Pq z!eLR&NSTegnjMyFso+PpCVw^<8n)Y|@_QZ~&Sc{;>Lh50*D?{pTg?{|^ zHo}NszWsfTj*cF@|E^fm?xA5#-C#O6@bUa-CZldtEY({c+2-7knEhtgO`~z|(OiCX z4o78%*69@R=gmgBEZQQac-KrQyw}w>ajbGak2-_gvZs9D<@ZX(bTW7!VSI-wK}LCe z@ThAfB90s|0Fo~%mlafnB0+?M!^6YCa~iA4$-$4$NW`W3Z2r%F|GA&a{_*!3iKzTa zjb;@QzefrgJOMFq5Lh)v-A1LZKKmb^Yf>xJ%Vm`FxDaB4|Ngn5LImE}o;Kd?GVb%e znM$RUGa3lY1)dXM`PekzyrJ{Wz0_@YM9=r|YbKh=bBTO9jeeVrGqB*-yQ8BcBeTX? zO#0t}scW^KvA76F6N%|qTwK(9J4jbm$>&Mzd^xLYYJT1B58#Kinav43OifKy-WxXA z_~N|p^=lxgN~O?XF!=B5WiKlY&BUo!5&dc8r1!=L+8VDizEii895 zK<{;{ZMO3V)9JiUtLTJ;UuPt7_?8ySWna|zXo4**E$1jHQ7q%$H-QRH7JZwVAs6@n zhYAL6|2!`oC;Ikmd9ycOsgOxn!^YXH;eNJ6Z^wubmSV-#k#;njd*?3XG!^)?<->%P z2;!Ysr!Ddg)0&TV4jXG4e9P0mS+gz9t!4K-nsr=hL?Pg)P$?AXgJ!Qu7Wq>xmr5Z& z3p<818FBHW&(E`vGHImo!w~R4se$#7P z9E5v>JVRjAoNXGMn>Kp3TxSkVesh>@dW%W)X{FIP)ET2CubR7v%D8`<6>aqxK~N_aomD zf>!HvG0v(OjYjji+$5O5*pq#30}2QJvKe~li$n_OgM-U!o(iso7!IS(n6J@r7>pmn z#CRMIBP@nI*9V)fznk5j3$ju*pOtc772Qm!k-Dp(rvd>-{zyB2!j@v z<2aQ`^S?g{MdwJ!yTUp0cy`1u3dc9r)vDE^-yLvXZ+`(sEzfVtW{CbbH0GLNtjaXt zqNBnJqJ>;)5|7!S-F<%o=&ih&mH+@pI40r{3ORJi>s=g*fq{rOVes~DU1qU$9~T9% z<-n-3Wt+(%Q7pGwE9z0>8;utCfirbY=#6{Y&)s)4Q1ICxMuw4Ef<~iIjH8b~J@3MC zI%`tRf`p`|P@rUv+)Ki*2H)QnN+nZ^c$^KgS&WT3qv?+c?|^2bUu9F1rlu3mjCnxiHkachz02!_WLaQ*Q@NQ0f2}Nzc>+K0;piOI}({1 z6BCoe=T3nM@bp|ZD=DVAxw+^&m=lxRVX0cbjpii`fMDU*-)(XL#8bI$_W_?Bx1f@S zI-%C^!)tnXAkdi#hhMzyc9Al-|AGVuXSvB#lnP+yC4kSU045$$3=0o04*p}mLaq5( zNj{fqn9ToqH#!xc!)nShSy(2F>=|CrUZ$;$a<%7>m=ZD();`80gYI|%4TOM^aHVg*U(}!7&y(F zeYMs5^sr(&cs1~0Eb3W-;^WzDHy2g=JIosFt^Uq?ES}$#Ia6&g4`)s zx0>L;54vMs5|Wa;^$kYdm`LP|*I&G^woy18=JL4pzPHXF@k)SQScDKwGtNaoH_Ed>!%UvKWK!G6Mt~rL_{XUNZ!x9XdDB*?H68fbY#7 zFo6;b5$(Z${fWMM{Wa4bmSQj+=<|DA?{Jh{De(dy18{aN=(ZzP&<01<#U!+(&IlmDnvwDu zyCVbC8`qE767lezLhWj`-Th?IsE8KT$(#C;5;C4OUpds$>N?$~JV6QET~Hd?=GFq3KHl-3LM=%Xr&4!{np=`-RYgOZj&FMjC;Lz z@h~5M8oIV{W_qC`kFZi9Q#=DmCxJCzEIRK^z;*I+T(lr7|*d#zW%CgFb z{VYIKwaO0+K5$jE0@0yT*-xiYSCq+V*Xc+*Rr^1jxpe``BqTD%Y9B9@WP6(^AwD4? z0waUjkSAt5o^>FG`eLI~_F7OjiHL|>6|&p&_(%@7Y^C4-VFVN3G=<^Qr%zK0yQ9&5 zocYWx8VDoCAto&q>fM<03)KY~bdBY&F^rPQDRyhE)HS~7!R#ZEzX0WX!xN*o0r5(aRfdcqbK>OY7 z=Y^4Vm1R?DUsr|l_c^PH#`IWMN=>KJqD?&W&%t8QKP6%{>-#eQ{tWm4^3WJ=sk7~X zD`Jtr=PvjCI9z6jOVn^AD7X)k56^rOeFdgwHJ=v*;cmlu1{BGq!6H9SRpf<=<|s?iduIr;0E%{GpnzRmPWFV`UZdkjJ2OM7bC?r$aB?Tg!Y<&Y6UP9w z*sXU5$I!+`;14G-sFz9E+0pqw1Cp&28)!$5En?Ia!0GHhiHDPk0r0!JYGgPN=%;7s z(zXP2G>$}wCK%A0iGs|@ z!E1n#oELrX0}L~W*Trj#M1=C2V9+10BElyM2E0E%k<3Aj-`x>l27!Y44%}nS4hp!zJLxCz zu)Q8`Gsi4t$wu1~9N;}rE#orip_N0E#HKdC!PAFY-vg`P+TW%EnVZk=X#?aMbJe&~ zh_>v}qa``OXOFY98$^dn{I>X$&^4W7`2sM9?I~n&&?A9uEJ_&=VE{F_KKCus5bm{6 zA`%g}Bm2Ru7YPixaY;56&TYA7ORTGoFj*=}iMZuNf;jD@ujrf9ER29OL*p1ij+}n0 z)mpbFt?Ms946SVWT&!DvuG6lYK9Kc zt8m)t$?WuddpS1t2_1%cwVO&IU*KqkrRDy?ClX99X_JM{a6MQ^;$9y((DBO|G5!Nt;zJ7v}*n|XRWaQZ_=6pZ86|s51 zo!S+fq`e~CB$zr+hE9xAs5R4QOkCsRbVMj!0pog|e@_$m%QjM_Fj0&&80 z>XqrIzc~5iNt&%z@~a$rw@aF;H>?(hDH2m~93OUH-(If(I9Dx*q=sFG)(@pW-U|Ov zDConYRgI2`zY-q%1SB*R#&tT(1sTxfk|kT^X;;VX?U_XgpQT^uVlk1PtNxn>kQI!@ zMw15TV1a+5VZt-CZAF+qyTjv10vk330v{3036Y1&)AJ|&b|dk6yiP~#^@L-vaG3NK zE{yO^M@#Ul*3w2G+1cJVJ?B#iasNGniUPweit`AYXw+(nHU7%vO$$*~RHU`PbK|!> zN5TOTR2X3jYO9LvG;#F8r4RZDoj%4a@TXAyMT#8%mxNA)OGM=K@QvY~f`*1B;PJN! zDij*(Fby5BZk|T-I7E=BcRVi&sCnQgpU2s^ zNID%*oJD|-q@no?cm@*Do6Iw1*O;|4t}e5)uFH z?F{Ru`$btQczS6;c>#RM4wWC3(3&W5fMzM(K%IxQ zSJ^z605~WLnLy$+E+r*J*EFaDh~p}>NTkCdrNee8@6#$$bx+h1I#DPJmgqCmrU32( zNYnZaA<|<5f@Bj2&ej0d-n`gd_qtfmtXhQ)heP`pFaZgs&3sX!R4gX7iSKS?gJI{b zft2mP)UsZmlP_xZCfBwobo7uNO{jxc)%QI0AN>G{5{d3E6RVNY@m(9{Q5wQB-Gz)lh(9()Qr%gYLX(f! zbpg;H9*DcVoF`WNV9MH7N?Nhuin_`t> zh%I=(TLF5Z^p}>1l4PB{=mf>OwsEATp&F4FIf669npLX;O2Jrn_pG~?&6XtZ_Ro2fB<@CsW2gJR zj7f)jOTd#$*T#1IW~E{_uy0}R2V}WVbU&L+2Q9`CF*$Jk_2mP~uztZteV<+(;|&04 zPW}`g&6k`j-W1w&4yCNT93x5k_X}XCCxTvq^(Q}!Eh)|4*qH~kAgkdQWS@_3cX#um zvQQYLUF-s_#^mk?c`M>SwyCaLK>9`iOqPLw`XLO(^!TplL2zCam^C>jf) z>Rm=9r5~uu-5g;1MD_p`sYf$#H(_|xA41J+A6)3V@Pwd>k( zBQLF>vSPY#O`}NTnL7k*e8K7h=r;@>YS-|{oj(w*?o64H-;aCog8%+Ce-MLzy!w^Q za&V02BQ@qe7hYm(@d}vrd-Khd-AJHZQD*KArX?L9kltYafWGWfySO=lKxWVLmNfA= zj8Ub$a-iSXdM1r^O8k0uL@k$?77Hwm5&{J2yLX`r_>3Smi1Qopb7;{~P2$A_ z!AzGgszNsr1YSNL&SJy&`bYrPl;ZRN-WU40{iRh z*%VvHtT^uphEpXFkMuZu0$UPzrh%!;b0~Zk&ymPC#n)4A8VdDO)sa9FG2nBx&4%VD z22mBPDK0S~@xPN#jnnFG91r5_L7@+ay3x|pMkrnrhZ{oKwBh_V zd1DF9acu~wQvg(k>-B(506?I}N)A7SAa*^XM>t_6I&)rYy3ut)@I##y?1YC*P08KQ zIsy3t^>KkM?+%gs$h{9>@)ZjkuiI$YA?YwK#BC%hpRtG4BjQV<0;o*jQ<) zESopqSdttVU=3gGTn=k=SPoC9owZ#GO623pDLK)<_dnQ9N4!WSdUSANB9fgTZkkj&-VSukby(1wZy#jsr zOaK*w@du%Y2$|YT@g5PnZ!vnhvY7M4_kW@8Eu*qp+qO}pyOHkh?(UKhP*G_V=@u#J zmIe`#kWfUC5Tv_A8dO5MyHQg3&U>wAz2EbW{qC`U?C0BK?Efe?_nh-OkMpRR8I+=A z7VPv39>03t;@cmo*x>*QT0;m`!#B$*`zi~TrkD{p*(*{${Nj)}J@`b`B;smorcpW| z$NxZ+TQ9}v0_V(JXY5rD=Nd}5!J#qrdhM2 zP#1oo&}~8b`U_KWsK`+~v(TOzjNh!(Om@^$&tFXC(tR`r8By)-=`<||dEZ<0+}qv5 z2GM@ZS<0ce^57ok^ORM&x_Og@q2EFBdUGqu4UZ^Y{c?X2MiIV7(k~Qqr8Cufb=KKI zJ3DS!k{i#G_c}zIwYsu#{IC6194h|WnWc!FMX5X|GZ${=r1rwpl+N=fY`H<-U|Y)p z)Gl8XOXMJ-Q($HmY#oIkdTY(PWMXcg-=koPxnvboCGz{+G$j#O5!P)JD$S|{Dyu3N zXg8gXX5eyIQ{5&`_}tE< z(brpxti&t_6YG}>zKqmAa9DCe7xJxJc3l1F$!?RKVV#jV|E%$|9`CNyxlu+FYBB-i z39wfi^Bvfa73oi&x|(r3mh89-6#4Xk)$>D@;Cu|_L8lsQA_v?6MnM2r0ScVITIS>8 z+t4Eve$Z@*MzZtMZK^l zon7RMig2xw8dfkca5pZ{AWG;p{GCD9HeV9hHW2c-tBE}}$q4%$_Yf(+!=FEY1c^7? zp5IEkmYS+g5f&Tc75|E@r8%h3=8Z%&@?c&=NT{e(d+GC*J4yvK`}}UvAe$bjuVa=ShveQ5z%yHyZCnV6Y{ANF)q z{9&PuY;XM*XQ4hDAg}~?MR|ESD6(d6>4;EihyDi{BxjtZx^KKkJqCfI6(r_C9YSEGVm`!dJ?AuBNm8eqpO_^U3b;6d53Y3L ziY60~U_wazU*MHB^8Da)lF<@se~)?s%WujPP)xA?6oOBJN3-m1w*SFb-uqP#0E5yd z?8yDzneN5%$P*zMBXB{<=0w#-$O%C3nqgW#1yJ1Y1hDgy_r6tk+GH-UU;91WrLJdy zlpeq8Hbl@~vop?KqoH(yf-2ie>v^Hc@!!_{f%WkDSvnhV-tUCGQ;*6QprH}<>T!k3 ztejy2!|ZOuA^xCKHHhT}c zy(u^ZVR}9yp<~QE(6l+=sTojp+6C-78Aq@bEI6CLRtN^|+^oTScnZhsHgH>IH1T~w z*HCn`Wun6YSTp}_Yij8KUSzn*4LCDG{sr&-uE4s1tsaK>!&VG>3o`tu_BvfhoKBU< zFM`^s9KkXzt)A0KV^#J)upMA3oql#0JK(Hxn(U$mEo2Sk%XZ5Tw?F=D4h*dMK*x_f z$oB4z{s%EB_-AvC%Pd-f(ZM4L?Z-Rv_td4yyb3e_25=SD`MJS`&S&+V`b_q8qfT0`K){A z?UD``02b3}hawY+GKP<~y%38|{2~M1{9=(?Zp4rr<|v>!wFJ62Rv_mdOOqZwd-N9M zEspP$r@+t3oBOV_5{EtbcdbarUsy$R?x8EysD2yXYjt6pzMxNg4HgDw!VkbP9uN;!DjfTS&g!{w`95)-7*TQzhiQGHnlr zwXZxPjef^XV7kJ&&g0!%`@Kd&U^O9Zz1(9}*MN5LJO0$ECf0Q+vlKR+q1E{U*G!55 zhBMwNrmaroU?R_Ine-T><1ddTeLqtsahf;DuyYx`vv5Y@k0x1ZC@ncOv3jEGf4*H^ z68X@4giOo}=*MhU?dxO9HU+aXq$rd9kF#gsA)=GF}2D~MaXIz?2*|3z{hkCWNVn&w^nFFa=!(m2NlwNC8kl^G@v1Ll^n{1bw zW2JGAxSz^t$cCTTz8Cy347Iob1SqEcb^`gtjdm>hF2$&rREH`Vx{jbdoZYu@PL&ig zJk)$C-6pvZM%gDO%jup}2%eidy0mt+k}~tJ=vmwx_!tfI!b&QHVM-H3TjHkjUTfoz zpTeI;q^NE|CxqH+bxfk|t^IAe<8dhNy#7U@1A{r7o}f1W4Js?K@`imZ$Qi!3Ws{>< z$>N*VTgufQ!Y(;~40a`oxV#g-{zg*T1U!s21v`@XO1~hP3a8VV)m;S;{?_>oL@mMZ>|t2sT7-Cb&lHElv>^f;v~m->`?w z>4MWm+Q-yk-bd@kx3e)0+w?50h^_v|d!J3lK6xp;xA@qiy8Yt=5dVwDiZ>Xrw{CtS zUqM&<1N(MJ2RuM!!5^kB_P@|?t$wOe=qKv)U3vLv&%rsgPubqbKkoaQ<+Qhi%aWA> zmJ;#s&dsmK9`}A~4WfR_^N*%$q4?TWnqxjy&kkIa&2gMF-rBh1&JKNAOV&$Zrb1No z1$XQSX(fVI+Iv>~=y((odGW=r848_rU+AJ+En${a1Y*!*e^Ftf_EH(hj3|#}I0Fu$ zca$&{Cu6}k3>}ZEMMja7@~5C>TiBr7dEe)tr{}+E1+7pA2D&iuLr$tEYoyP8jXUw} z+HlZleYQW3^)aQVd(>HP(T7AaEAY*yw$?bn0;Kk>3^jmB?az&2Md$u$#z#CM3-wrE zJJV7zpOIZ)#!mP@?VhJNTYA4wj75C99Q#HnNSHMB9CLr7ya%C0T@!R=tDj z4$u6x@(nmQoSDr96y`p)9=37NnXott18(HN3yfN_r~eT$O)26RCtC_$+(e|9!uTxVjAq2(Fj+~F6%l@p02?Cw|Y4P0hIn-VopC5 z3X^O6jEqQ&*-_g_@T+~kY};We)?`IJPsLZDW%cYqRaEZKs^cb@tVO0a^-aLxy<>uA0O_34KFk##Q)c4b43kOT0h^^l_Fg%Rw|qA!7uhfxVmBtSjs{N}`Ouh-;fN~5eFPXv zp~A)^Nmzz`e@{G0l5k(b95?{&lVShA_{wUuZI*Ql+#gapFKBjp$J7jxNJO~lWs}G8 z&SCI`a51{U@lZV*FliEhF0c1Z%YKIF59>O}YydK~Yc60(-GQYNOG!(^`b z8@M;?_3PGNvmAh*L5fDaI$QV={u{lYRZi!?&m9=W7p#~sVlksJF6O>qiEB`bv}$l7 zoG;MLO;rI#^0WO9u0uTzqc*4Oy!VcPH*anJ0N%8#%RdPqq4hrMOTTGe4kRIho9xf{ z4B~7(@CU$5!uZ%@M>t&U=`hw|E~jza%!BnF#^AhNscAxmRc8!L-USs9;O1E0ileF% ztG5$-ycHAA_E~wEs~j0mEj}Q_JczWzdWFQkF7)L zLg?0(YyNmK?>pUAGZ=y0AA9hc56Gd0Y&R}JbwEI#Zy2O|CtwUsmJhrHB0)K}tO2l0 zZf*p2$=wQcuO6WBB#>hBKRZwR!e0f7yQeIEda-eXw;N2QzC{M#PHCp@=faP4qj2y= zEn1KaDyH3MU;{AS?F^1`MYd$yJq0C;pfX|*GmQhG>xISO)64aJ3lZKV1zyuNYwkYb z4(Wd<_ZFi;I0hq@VhDSMTEXZPlAJ00S(>$~j|Q_<>G?q9%c})sTD$4?v)YB=s{ng# z;9e_+xXX-;qv@|T3f3BX`RCeWf*@>`=Ot6k`c z!K2D7%DxSgaI2gL)#<>e1pqoT`7qKS+JqeDx>c@M1`rz!GZ! z77@2>13Ms!STLzTP9;sM#LCp|(4X&!m~mg~zBY?G+5^BV2k5%}#V^*3eKa0sYU4VN zDhi4ceWYY$sy$ThvIAfQNr6WoEX5~Hy+#Qk$N6}(Kw&0P8TU|`vit%p;D3GIzf?%gvY_`E`UVPm5iB~H68i|^?MtYn#Q+DM z#ckJxNtfow)6f3!kZ4c`=#+P-@lpqv=6n-OKw%CiiQ;fWUWu-~3-?o>Czw9z{I&$w zFgxA>INSPM{=ge7>MRlx6xRt0=R+9fd8FtL3G`Ba^z>mhXp8l0=-8YuJmdd_j~(I+ z7;-4Xa6Z~GWia6)MeHMGCXX@U+FqHthK}iWT@|o)nH17qJh=2Mu&kn>prlBzHu})S z?kFqND=K0bpnj^W%_A|8ffaHAqxMN0zgMPqRa{=B!PiffKr%)y#>^Ih9!x7S{0;CShVn0 z+$?-adGC>Gb(G{##{AZR=h%c<1@oq%6)C5|(wi4%OrmO47Olv;r;q-G)MHz}fABRK zXn(THjvcso3*KT%*5k{F)z-rZZGIr{-<3s8?}ZFmey>!*8vGvJ$RnK(UJOsJi#KfUWLUB@e)&`v}%&OZyg|2I8(9kbPeE@L`&*BKyxSf?1~ zn@SshQ?ZYe{Ynm`P^5UE!a!qp;%kgJFao-flty1Gq8JeHF}D2xMyXnR)yw|n<^7th zaf=^@T3>VI7~$kxf8phM_jFUk}5Kii)^bVlMV zoxlENvyv^@ii6n|EHU8L4v+N9zHSf3Hn^=MpPq@ZVnnvPX$GTCo0$mvFLvQA&4c*l zsjf(;7E2*$-Gxg$!Yg%8^S|^*-P_`cHWB)l9c;B|2>lV9oB&}=AE`|O-~-RTh7Qsz zwb^R(CjVN={sL-x1eMeL1UdIf1}?7mpf47%nP}IH;=r23Pksm* z<>^7EPMYh^R4vR4wy7G>K|yrnKSi#_Z3a3={$dY)Vp-hjr%JX^EzCJkCLRuC)&fBT zYpp=x{1Gn+yKWdu5?7IrD7dD)l05|??6cl#V>zEXFc)=WWjs%y`{6 z7P>C=Ai*FW^L^N~&reyI9ARut16Ki`vWFy?h3Fkp-J37B;E;%9@tF{3V3><$&u-bC z?nOHD22O3g+aFLx&^Y10RWNiF_;+a4x`0@ z#LeLx(a^}TW!L;my+q%+U#~B9H_V;Ae>&{b+)CzJY8;lN_a4Jm7I^oB+$zb_!@!l zkWSWj?#v%>5ExdKeq>6xwXNoihOxZqv<#n&2J<1vpNV5NHxZs)1LEN4OAiCSfQ|%? zoC?r30dZ`HYR=vNhYR>tI0&SE8DUb=*{@A&^@7#Dm!U^6L8B|btQe zKrxP+}sF=*TOD$k53a2;Sjg~Zrc`y z2+GD%QN(#_-02j-D>b)Yczm(~71FkT zWvdin4nG6mQo-92T2Xsae)Gcdrl-WPF8Aliup7^aLMmj_(RuD35eBJi9peLz zq93Y=AziGS?asx*@*p2MZ5u{xyPhlr4d1+o|acuyTeQb)jnz96cyc3{B zs~f}tl-jbC`MK@%JQpTg^ra|Yo!CT8&vj{Vd53we)M0Ov#iJD2*;x|iI^+&7>P@xp z)~?cZM3>V9F04e0WN>B(Z4xOJma#z!OT8yT>HO_dC_a)O>U45po+?3XycfUN7WswO z#&@i?YiK@OM4BrNH!&NTLnu+OS&w0G ze)l-Vh9N{W#%~Ke7>e{Ua9Intn_$J(#s0ytybP(8XgmX&YgX!fWWgy5o`h&&jk!TJ zN#3=X6mKnLm7L3Idcv0<4P?4Wi^jD0ey{a-gh@${m;5M(6y+5;`8@E63-VW|tMtS> z9KM3!R7M7i0NR+KJ0@PWUB_J_v(|B%`g^veWp`b1@Nh*| zesoR~+u;(wl%;QU04TU3(P(#@1;?`)eC9Onr&|?+2gzY5S2S7S`$7okHd_2wU@ot{ z=x`E_cd}*}%dD?tiZ>M*3V*5?}@TnI-jK^@KY=d!v0q8j6R9osWNe@7vGQdgs_pOS}DMj3+uZ6uL87U zgedG4o87Eo$tNDU(VuH8L7J%$6zar%=f)xGKF-)O#q<0n!x~ph-4>*Il{T!%dAG9r zN8!lYLs|OQ#dEBHE-kRCyS*AxA2#oLs3(R_>2ZS#+%Tfou*9l^(IHl~1jzD@5z=su z)MG9y0}i4ktm{lYXb&S#?X(IeImh38s>9s-`P#N-w)m!NZP}C)W`YCWF-tcSzoj4H zXbPnrvW!7A&a-p89kc4IeZE$_Mi#7l9$Yd>P6ww+fyp`CZEMm~s8cUZ$(7zqSW0=W zIMK)7ZwpNi=`4R>K(N@7tfU`0f_~x|bPlA)jfT8dP z!DeVDvK;L|h=zb;%mdnMZ?VsO1~Mhf{czAyqw=>BafQ1us0&SM-AMy2x4qiEkKKuy zE)IIf%>3|>F;Xx#&=+y8amJt3re&oD#(2wUOWx0~A^4h@IRML8T+egw2sKuZD*LeD zDZ0KzeWDXMH|FIm9#9<{8w5~J5^Z7RO7FjJIu&VwJ%vyM@U>7S(i6Wa7fw8d>WHFr>3#A?a*tO>uB-p5la$#sB@n6**}XvgQGUyNIxf% zXl^z6wV>}bAJ@sZ7Mi10vR=HurBfb@-WDzQr+I_3vwk)KZ+Gi-z#t{)A2EkqZ8TNl#@}iBVyvyUg#o{Co_<~}u3k_|Sc=T~V2F7uD%kY{ z217sjZJDN8D?SmAwK~eeK!74OnFU>ogm=_1)X=BeCL!AR#RURejhSt|?jO|0O@#?~ zySkBz%0#B<&N!MGb$m1t3Z1@3KZTI6+d>C8X!A!;8p;w74kimRpE{Kx^-oQnZBFfJ0#zBF zCrznG`!5PSBqHQ$?Hg1=ROF~%S!w)vv<5(p)BYRJ^ds`M9EM!z>8V^672Z6vIW|N=qux{ z;C9d;6e6@@#R{1d?$Cmyn(}`Xmz&VJzyPbq%$rW^KWLEvbgu5n`)5+aVSd`0;+ zQbkoYJUsmL^z`L7zPFqZ{<;v|oIGqbPXQ^itE&qg4ecwtgRp>0)!-X|RpTdwKS!IM`eolLw`dJPpiaR1 zoR9l5M4vs9f($^Eq}!qsxcKN=DB;O{nEgwoI}s2mhV{EqySh}1f#LrxgL;KttQY3I z)^f%fHf_`%*H zQ;_k#^r9&$LxjNQk?a}~iSl>8RNd>jQ<~`;oPdcT5h-{j@~D0w5wsZWX23noUp@=) zy?$Co1E7_Pib@K+XF!s@G(5o$xxFTuFxk!R$B0RAgXnLLuSGzz<%? z7LewE9_xqXuqVVk8$~$PmDiSlmvI~^z)FRT$!##rFPv_f`|o!Gh$R4roOtMQm^>Ir zzXk?C$n-?`ZiS@KU*WMJ@km1jIY5IakQS=fwQ)hFCsb1AJFKq@J^&`j4}5uVYb!y} z(e-YoDifFXTnoDOc;ma`u!Wb8%w?veheS2xqUv8B0^3puA=vS1K=fej2sgjz6CT{l zktq^Kp|1j;JsN3EIM4m6*cXH8f}#JAc2?W4s+;Oj(b2`@T8Ba$j&V<2NllTTd%c=P z_cVgdL~S{159{&)p|J49+Pr{OI5@~{`v=`Q?2t4YQ zzk=0B`)$NgM0rYUF&cg^876xvee&!xU!Z*LK7{O7Da;AaHT~+ie$J1e)2%M2ch7+7 zPqKeu`H%f;6@+G5`tu*nG>d%F!YE+99bm4N#r^yY1NQh}y; zafMK-5N^bWkztm?hx*#2VBinI@V&h7k;9*IYC?`GdUfB52l=Inv*z6>Fk&$>=Kp)P zK*zrVOrw7W(XuBfS8$I>P+t*hcWsl~9T85oH_~i?mTDv0<~9^Z^i0tgcwj*70gzET zHIdkYldiwEfyhRU{2qv(BMmw+2=4L*RyGqBWza>f6H-x|%VJmDM;qg?G4yl%oA1H( zf+YC3qXCDU?}k|^Iv@EaQ5bpz!5}M+sGw?0@bq`c)yPRZ(vML_SiV7I2w?8+CmT|t%B3)H*pv6oDh%h#Y=e(5 z`ieI-g^oVALGUZkr;APN#lTD1umK8uK`L@!3bPeF&a8u2_`;}Wv72H%{(B!AXdLATH5HFtQ%cCkvL8&=vSK zx&Ebu5@`5SACah7_Q?;+4)u?72&lKZVXUB@)skzr_0u%ldn&0ZaOn5RM z^Kw#Q6TxvVJ}U;laqN%xVeDi=NWPlHl`BTxOp_pkUa|D)5c~*|s^L=#9jD}e279&Z{`?DIF)O??V*nsTO_|hV1E5$~d`Xk$pBNuu_AO?l{5PYW z0eUfYfI9|?=30P0hsW9%`{J1S*2hN=etQx&TLdcvw(z4r)#!{EuD6I~=%*WneSHsy znrr@Ae>kRgt7Y(;P(j7`OQkuJYLz>YMAyy-Je8)c#$D+&ksl>p`-cnQRLx7^Q8FQX zJKyrH@pxwQk9|7%QvGgIJHJ{zVGP@HS{)q;5yxl}_`gZHZhXC_C@A)6?i*u_%TL>A zWb$O?oBB6wDcyCI(82oneoha?!+Y{|0O8|aElzZlnSz}S0aw>2%kNOp3mfH!Vy`jp z2<&xRoWH(ei0dZJWMCmQd-y73VHqnTxwiBRA%SP)AC-4VpRS3nkCoD2hRLI~w?5Xk zrH@aju%^Kdlmmae^B_rihd03;#)h~(61ASbNL4|Z-9Pp%?v@{eNv&pqLCU?#Plwpy z`^_ZqV1a$afln^pXMKcKOGtvJzOuC80K0_RNGMu5kD=_>Nh=Pnbb2l;qcvo4g8xna zq!0e`^x{GWwPpA*k)~oO+v5b)7YeTASv_y(oFrPCw+db#_Pr7(SX?fU67XdxxK>3R zsa+Ol_p^-1GK07*LMC2swL1v~Wuqj)8KooL(zYg=S)})6s0={laT&o(!Isi?nPuiJ&A zyY*f|&=W93neb}yUs9EZM0pemwgt_RV^N|}oA_#Ro*u4#DW#0vV~n(3OZm{H&7!eX z@$FCWk&@W^)p}bSV`B=Lw;^aaY!3Wk0fYv@it{&j4Uq6LXEBz(0SgvL7HSfQl#&sPy|r_9jK#P8hdn3{|HYRiBCE>5Eq* z@fK*TB;)u1q|q=uspo%3{lGbvA=R*#NiqmN{xE-C|5&p6)B`zWrTaM96BV6Eo_hUH z?Spataokq64o?7ts2NhuArMqVxZj{ECi*|!R%Cm;?Q{nc90_A~IxL;~Y8HPJsQYpi zB`y=7#zCIBkFpL;G0?LzIWP0*0xg4Bt)yc9J6^#{##DK%*@kRT#voVczc;6t?IH*D zI}m1YKFpsE$ji&~p846`-3^#8$^b9M=Wj<`rOWJ$i8nZ$fL3K1hRFioJcK0bVK#N7 z0mNfc)F7~Z#7Y~Ri_C6&@X;4_6d_|C-LWFkOU_7l1Y!zAzqP_O;17YHg`;j+N@vq) z4%np#(u{Ac=%}cBsVp*+k2e$rZ`Q#Fn|eGCsesz=>Irn6IWna*dOJ&5u!@WsK^ip@ zb$%c>>-qOB9@9_h+=MYB{{nC%BfvRs!b+t{_gVM=REM~(g7JjPCmi2L^x@wr3?-0oBM9i_;3uIm z=#VsGYq&36Fuw@~5*e^zJo>L&02*mh(jqDVasY8r3Rob?FdXUw{y;btdLUE=!;wuV z143P0CTL%k%icn*fN?k?dl}{=NMjEv%>oM3o&GLiCS;%rHb10caBU|_OfO&2WSBbDBY0YF26*UAz@6~T&cUhjn`o3{FjRdk;R;cEK6 z4IJZgXiA2761#pFk|m>1=uW?n!s|!^e7m`R!oxP7{=4i19E7+^wwdyk**vd#Bpmhi z2}f*NfvoKnHeU>ZJpyf%=7uEc%O{d=FbN3MoqgEct{<^tuTe>dh9s&1TG@`)^{1xL zVz=g8S5Z-Ut<8KB5~gDll*3m5&|@wGmwU)Y^C2I>%y9{{OwtIlSq+G%DuIN=Agt2k z@@0SZf<56R3;Z9O!{W34D9Z>kGqG!jT{knx@z>S_NnjgAFkg)haTc^m;XhVB+1qrL zkO(=1gqviRZZ<7-o7?ZLyYJ8se3rV2s?(FODoev~Kse6p2+EDzYWy{N|6&!`U=%bF z^<}kqnrPg`dv0lS+g9WFtQ+472}rT+h{GyX__;Zm>_{XKInQXkM#z{$dfl~n=<~RR z+p9fa*sWwfE`rAIgXL=tSq*xhB_axa{p&Tn#^ai9FbJZ)1MOw0Xu+8JEcG;W7C;jW z>?|5DLrc9$eN)8ds`&EqO@2_{{*^ z%DFgS$!KEC(4a4BrSV8Y%Y;D{b&R8p5b%tdE9;#%XI_~376FF=0xT0t0xDzNuy!)` z>2MK?vBD1&4o(E7wxN1|E!^F-*YHj#gzS=q9=%p?KsAaZWB-tL@@vsTV(OK_RrO0TEo=njEYjBicM-9! zw@XDQZMe&2nGPZ2!oIN?i##sF$m{suN$ug-9(+SCqH8Ian z(b0Ve@4LDRT&Q^d>U>6iNHq6(z8ZAfhSu?NYgj|nHze6;`kkxcg%&sM5A}qDp8Hy? zG2%A+9NNU9yzbUe&L&iRCF>`KrIe9-hsVySq(fMQi=7oMw&s`qo^q&J)n91=I6b8= zn7EG4cbl18E%QO-Ss>511Djr#1r5{{eF2!8=w9SK=LlDS57lygYqmMZ$T%zY&O=eN zE;cgcE)dUDL-Ms{cEuFZ8zPW{3qbpj{HR{vhk^E5(NWyeg2)|r>>y5jMq!w6vaO9Y z;Sa(frJej2^ED&(j$UQ@Q?g62d>erXq((^dr{SOr`FKr!=f@rMH{O;?wphNN@L<$Q z=?i!e?kggrYzuq_*Rf`SWfC~Jo@$6V{Y(`P)oA^t?L7lnevZd+jDcW_P_Y|M%Xrj< z2{@@bHQ}Teb)J$iR!&W0VCO(1c13}6I9@=kizF!$PHQHb_`Lp1NfHOaHjR+PG~45& z-~ZLr(A1I8A{U>Nvx-!+Uiz{{p=F#>iG6Rtn1MmrRnPb?1K|+9K`yJeJ%zW>6A%~# zl;o#UB)f18L+bg0GAxGTLZ>KxX{TSSu`af1xsmAG<^dZrCNbmd_>=`qigV>yNzP7B z?yOBQESv$a%-RcRnF_Z1YDb~fjowA*=7l@hs-=V+>Iu0w21N~RM;WD5p%YEY*jxWM ztqu+dYcd6P#Mh~`$nbDgs7qilQYyoqXE(khRbF)<68DPU-jKU-ryAcA>&AI2YS9?);$FeC=lzg6#V511Q#6Y>>H2 zf{BSaciKu1gQ>mu-TVYXWKR%2U^k#@|f(m#D zmV*6)=ZJD~-JX?sOF zWfQ&p%_ey&STs&RDaiczc&oOUFN5I(yU|Lsd0NB&6_7p9irVfIfS~o#9tElp(8&2q zoEbp#P=Ap_IiVe@NupY{O5n=!CMnpFa%6nmp{1b`E7W#L< zvJY3{m8p!YLNFW*i!yiP9CY`d@y-|TCqw-Xm<5nGB18^soUuMHaEH!9vz`Q)uk<-S zxGNUPnu#dxk^P%J%UFwVtsF6o@Y(_gU?ZA7hnsC{KmjdLZ5-_qf0M|UpA_R&k`Tsq z9%BnSY*V6Xijh4C3PY76-7vlP{h=ZRG<2L6xUnbgwxBYa4;K(!mZpTHD7rx}QzCe0 z8hQ^5%*Y0w;h9um-<;DI&mpzJ5en+~%QcJdMq}`819tf9GbElHkim8i7LMwL@NeQf zliE+4?%m(iW58bU5(l_#2s%VCi0k#?kl;4oUOw<1)ZRZz^{^73o)KSf4~??-o~I_t_-<@4Wjl6@W9K#O?2IBy_j93O1gW`#|wNx zhGo2#i3s*@l16Oo)!Xz_jZK3ws0HgCHLDtoe1{+J!&RUi2>vmaH2%77Oc>&WqqauE z!-MEjBIbF$aV^!P?=;`?wnB2T7+5#h*~eo9-QtwNQa^k{ncvKRU$u&7DyTlvyqoX} ztC@h2MT-h*WEN2iNYt>21#UQBw_^Q=3ve~_s&4_iF_I2&REa8hDWW)Og) zO{(ENuXUI-Aq=;zmf>@wM3XDF}doYgvR%#?>-nDYk__p>WtcwDRV>)Amd)WKO!$&*Vst!dq=cPBZ?8 zEMP$;vzXZEtxngwfEKVenK?smgMABxnlcrcl1?s_XN-75^#t8ru+roy#a0>KzjRIV}18f8U5)lp(^&!h+filb%_TaL3me z+xR*Zh=b~)S($-#8;WQV$@;}=2n?iRBdpwecy$^uSyO;tK-AQx@9pgY(>av&yZ~;- zRGzyBpbmf-!UX@B6$3J?V&EM{92%Tt1@=|<%Rtx2{vB|6aVj&>0KK==KskVXK}HON zi{nlS&6^OTyP9(_q5sT<5+vGwd)tpV09+*yzY5*+6v3pyj;xVDA;|RHSEZ;rIUT^V z4;1&gvcdZEukv7!jTm7@K%1f360E}Kr10w}A(sXQM35_fLx9Kd{eB!vFhWq;Yr}zQ z1&D2jjm~>67{(~{Oa}P}53)o;QRpmuAxXP? z%L}JfcVN_b|+Ln7&Y-HT4wwem(Az#^D$Ol#dArfV#eVzo`< z;--RvvaqWE5FZq5SH zpm+&qbaH+(8HgfpIxM~dc5c^(^UjWL0}y$pm=jfD^VtS>@ibV_N8tE_yPyN1l0F5yI|eR=>&c#_ z77=_-ddM8|u+d=q>;TY(2e9um$fCiwZhf}DWhNSM;SHDYxu+c~MBLXPmbfb7D~+28 zP+l)bj<(Sk9=C!vy>SZw#TV>F&gS3Ts?6r@`JCu%R-*T~ONPNG8E`3{S zuN1lG^MkL%G?B?)Au{2-f{Kw-dIEn7gF#|5@DUU^KD?z;o@+yp#Dp7A4$7B(k9V>} zvtfs=E4f$i^|44D%2;;37m*a^GJvaT*%sedqHRfrk{`tfK|2+Kj5IGLyPL?U3|X6Y zyRZ*(uqky6_rJTXq0tR-t7ZURDa6G9&kcnn11=;sZvuGW8OrAGwZ#G zH_A*(lH@)hk6q(5DF)v_!qFqvmwbA#`arM5$F((EV?M`~t*Kg)4CGMEb@+-a2o=5$ zt(M<`CgpGd^tqdeQm?yPZPe|KJ|My+%?ZjOIV{7r)n$7RI1_IlN5|rv9C}vD!v=ta zAy1DXt70Lu12(oV?hmrVu@v;K&UfX#1ZvX-&fuF6g0+=H8<+zLyk0Bl z0nT%r+XRl8Vf6~{CFWfvOkT8WhQZ6EBnwtKH7LzNd3{V98+xyH2hE37vF03RAUxj~ zlVRTwWjh~O_F0;Pa?p{1G+stcZOg=?p`|+r&Q9QvU|ENbR@k7}-k^aF{7I^`h%G9k zVj4twNdvxDwQ&wK*ra?W=_GHXTskq%nj1e^~a*zuzhf9I(_>*FQD zY2Ssz9hfm(6zl3aS4>)!Z!!2 zId`7CafoY8?J}4pR;yf~PsY-qd?t=Ya^x|h5GZ;UH2hC!sDzy2V~{0JGIFJTq@D)` z&=szZW(G?Z%qR4)TdgRhZ$?qX;*5nWDk=`WfSC5DZRMWlq1PF{_XoBK2_1g~xi|ox zPX|8BBzKgzJuo=>P}*EVoIbnGD}6&o7HEQFFH3*eeRTjKI8`*IGiZ-DfTfQEzU5k+Cp`h%ZZnSm$ih&KbkT~P)s?cegzE-2sY_~0_aGFBr*(-IayjW8x# zP;DrHnQ$brI;-w1(lt1tO>!k}pfuoLOU4N>IjeZ#uqqe>{Arh4- z^Ep1;&Ucxj5Vbd|cAkbeM4OSoCh|8%nDZSrm|*XhUm({2+=Tbgx_$78)AQ|)T<{|y z-n`(ivLV{4`*Y4!!uR(UR^Z2t!~|8KsdXk+U)1)zP5`?q( zO@`lR$Ywtjl2Ro*8FwXCTvL1fec1A(_<{MrIW@%senX8w>| zq*ZR|q2D=%-4!3f=I`ywC+{B7pJ6{_5K{7?5(_xm%A*MOsaHqoD8Zma^GA9*yjIXZ%&~-8$rv--0`)N76> z8e41Y17~h#*-rb8Jy~Oddxmmv%U#A^&?q-~_M;qi55K9dP?)cgzk2C%p?ebZ7$Y(! zt8!>x!_RvDY`Mx#e&*9|xc;N*h=J>R6u|y&eXu_6H6owqH;64QsR`Gz4o8sN&5WGb10OW^c%B zjR#DW{|?I^MCw@zJUl6T^=Z}9YxkMy0{)M>ii%C`lDn=))GHTr)L*{r->V2LbnEk$ z?taN!ZCSM3PyeKZ*TH$>_*-;*4!LHxNm+rBO}Sb_%q&ChWo1T^J;o2B zR+E9M4ZU7PnG(08XFf-66Ms0L=EnVl*xGXY%ya8?ZOYT{($zE%1_PtQC*}OxFVDTT zt{tZe1w4CE`;f7ZPi`#J9P8?aa~vgOH4Em<&G)FR2M%8Rm+mV)DU83Oga-1H2}Ib^ zSVYg}if1!p(p<0eTH+?YTqJsKpCLvRMJwJre%bZ-kwPL7Gr#fo-{*S8>H~fsBq!zY zR(q@L%U8ciCX4-f*!jM4SfADVe84KgW}?K*%Vtnh@ukZIkAe*~c`}lb-G)%d^F$RU z;AAPysay`U8@ zKl-5TB#E0+CHb9(;J8Yr$b#0x=We|T&WCLnuUy;q&oDB}jyG5C@Rt7h(^N$k_-#dW zfa^2fkGWgsO}lqWYn&#`o!Q;wKwJ*J+kEoaK{0xMYw8)w%x}%vvmf27V}FP;ajr6d zY$P%i;8Lh}Y8!U3=4%j3J7n4p5f8I6FI!2y%y$oKEzMcUs3PV}>2dAFnO)ra{;jpN zz``UNi2Ds=|6|Fk^A1?Snfx>{ zokGej%zb%(-x7`S$I^%GbF<8h{OL|}WCe?NDwG7hMDEy_46`A7J`rM7Xsvg;zi9ry zdLhrynl=(6W7ijZWk=0(sSF0pqKJCxC$c(28p+_+mAkkeUjwgFn7XbNX5Q+8Fe+1n z>6KbFEY@`pEy#(>l0v=)nu=P7p8$58@ic7XSNLwgCqHI>HUne zGl@}i3_`5j@z>lQw!epFh2p;egw%k3NN*)LFY?6szFCXD;{VfldCIKnSPoO1i{pkM zL6-c8|GMXDzNnU3B(HgsiLxxyM;i{!?qC!QNT$|1PfJ}u;0-~Xae}1}{K3w^&hFiZ z0#Yq%0DJee5q;}8FGb*^;)ee}n|5q@5j}OYAmf0wv>KGKp&@-(yWjj@h?e!3w+UL1 zeyfDPb%+@;I{*D;Rw;t?&mj!=ueVugJ@J-$-HY?$;JO4|`gWdS(;X&EPWI~lyCMho zN)8K|*#evQ6U;ZpO0OViXMd9M3M4cj&tP?)%MraF?$*r9eaqCWnhbSzLH+w)%gXd% zbwZPyH7Gu?6f@5z4bQkq|NT0v5^~<>Pe(481A^iE`>8J`cHuvEdqS7y-rvkiw>mN|xzFs?iX0_5^f0lMeA)hJkF+*ciE78H=-WJs+)-m<>k@m+bNM8V zOOHTAC@oXM{=V3t#`yLCUn4KUV~grpYtdNRXKAh%6*`y_KJn|*|XJcetEn5&6!sV{O={2&sqd8`MLb~foo$DIWsfB4t65W6yzvq|o?KW4*(Zhnq3$7r z{gVFTKLC0kOf?={X@imcAnRi4F)Mxda?oDfF8<@$Gair28=Fey=7>TS=R z+)=9W7neG7&vta|WYQ&!*BX1f*IJglSSKK!6D6Im`lwL8@oJx{PB|Lhk{OhNdgn!u z=fv0j919=mn96`ok*cx%Q*OwtQ8{kRuTd#uueiUX)J^j>iOy?W{b+f~I23h{9(^Bc?)kptR4qx6H}>|79xRqiN~!~W@Z#ei-C_=?sqI;Mr4*Y4%-8UE zwwfcAp`rUS;uw{lZ?676mnYm5QkC4{lEkR`Y%X)1J(PF%)Z<-t*3!xNrcqF-bH&Zz zRkCVU=)sKa^WKc^v7M`?-=2s59$B_0796};^pZX-ldP?1s2eN6tTLFdD5BRoC8NjB)Z$;p$>Hs@Dmwvc zH|G0R2J-x?@6xhV{F4+GQ7Ww#7wWmJwRYNI(Z1gewbW+vyLYf+Ktf$Y4u3a3 z-N5hzS;ncwY`5qW%a^~ZTF?YXQ{F&uK0al@lSsdAo7T7BHQ1)&T$Q@NM7Mv2Pir<5 z?>b@huEWZzK}+DQ$Eu6aR=+Iu*oM%xd%|dA1pkCI(v2&SS)bY2nPGz<7HCiCy;JS? z3e|1<;R)()9`h(?uW&Rrpvy2@z?)7$<1m1oKB0297dT1`U>6aS*I*wIZu_CBQUyFh_x-^uOp6%*x%f_jt%x- z*T{A5m$80|uoSs-kkhmqCPP`H7xKcz)&`@3S|N_MTLo=ZoenW|zPj4@*YfOJ!B#0h zt-G+QWj*jk5{2o-QFlE7hRS9=a*ood46em%{DKy5V!3$ z=e3`W8dk;JvwVNY)Q2+gU%*UB@eyM2U<*aPoqd?~)(G{HOIt^xYv|PVQrztt`Pgq* z2QZ$Yp7)*9#_VbBYSj4C8HW_;avV-65Xvt5EcAKD=OnOouBLemO;QpveF816hsKH( zTN$2Ds5H@E4tNpA@svqf)I3e_;ads*ihI)|lRojw2lY=v_*xg3npI_rgA^Wn(=QU{ zf)=jpNf^ix*z8tLOYjhO=j}$27b0lf<*$ES6VH;5h~Lq)T3)~eH+fpQeCVCJH+#9? zaMn=)YwX=Il=P|TV85^UPRJAT`xo)AJ`{AN8pa~LrRm+1*cfhf)hWo8rK_JZ*vjoZ zR31Spq39pC%gToi^hx>-u_hNfbe0-tU_$rxCK9Ev&-v894h6=K>qh4#rQTrXj>c85 zU(ww+&*<8@aWvB(-t|F%arN~zd9Cq2G~)^nj}PX(Ex+R8UJvSgq9BE@2<|uA9JB8V|8srkumi&2&S$J z%8UHWYqy1wb_r*occ+(w3`3210$gs`8U^=&7@4Oa4uw z`VEe|euhowa&l9AT`~sl0cVQ>Q7TvqtyP%-OHIwlpAD^Fqgvah;5+a?vvtNuj~hs< zq`~L{Mx**spST#~=0LZ1#&6+aT?u>)@20KCD*<6vyDCeqh1~T=4+{-q_B~L?Zd_}* zI6ZL2ooGexN`DAo67ed4%~y*-&DRW;1VJRn@~g$rh12J10%r=qucb6MKy>Fdfgggq z!s_7_n8m73Fd5UC+fB)B0 z(OY^_&l9coMcdeXW0-B}Ypyj6B;mVYLe?$U+5q!vm8uzEd2JvJe;OM63+*r-f+^9J z3VThXI1nz+jKC%OnYYlj#3D)OlC?_iSOd~c{=*xP`9n@Y0pbTEqX$8<)ii0*oXMnY zQiX!S5*Aj}WIeK!!Bg6>9Xt4_C))7~-`LWsLIEB_QuHs#(Q z7KmdKiVb09XD7+QvhgIXAecy2K$AD^*JFGu$+G;JIvV*1M>^O+t2BC3FSt6Q5k_W5 zj^~b_qR5S(GeD3-AHNbjHX3z+wgvu*L{3*)IK2hDUk041AVCbqYz4}~Z^XKFHYccZ zf+i8y!}8;TUAG!}^nY&HT1c=pg{FRQxU}a?Bxo#o)%O52)W+LZP8mB2$asts@|7$E zzQm5M0XfnDruY|Gf4+lZ1I!8#)i%nyVuOsBy$%MB8rIbebZ+6~tQ_4*vX3!*Kj9{k zaw3{g56Qa~vpy+zmNdbeZto23sY?ks@z$?ZPM-24Bnx2Y z*e`-VOZ&x^k|;3&?eIKGJDpJv5Q*k}2CfDf@^J1J<_eY;3B3lJ@g?DUlCSx z>*dZqYUIoXr>fM?YQ8s!ETvDyo<2Z^zoHa#&bo1Hu6SwX30XYdr7@5#eMYG_p017V z2Iel-j#a>bYgHKca5_!ix=O4#=OTSq42wq8s$*kz7WmmBn%6#mzvkoU4@h2P08E$vJjsb{e>1po7#Eka`(mH;#iQjV5@PY z9=K{dVKZIzBrp>o#g>-_0Y;5Evq$CTxS%V&e3RgHdTLRSA z7BAHs&V7Un$I$tP5wUPK_n^jqaa_x!oJpSjD;K#vqCWh=+V96-Yr}>NL3O(eO(=so z&N6dH2237eU3=sQSW<#hNt9H_yTn|k<)erQo4ipNLZiP`)2Ir0`Hc&H;W9Jq@|$&J zn_)D%WtEgQKaejJJ^@l@z#*iSO~rylDj<4MN#j1a1z;h}%+p2EFdF$|XLnb}!;zuR z^CQgmdLO_bU7&f31HJc0Zf!?DMVZ8kl%L(~1vN|sXrLD6DtMSWUMdnHrmzyU&ugsF z!jSvXVB&=SO5&5MQRAF?z1%X;hxh|FG&-K=F5F$*0=cJ!lo^Y-kwl|0Jc5RUDc}iy z^9s43sthRt%j~%LnKL>0`Z{8*{6{gg+b}GKrxgZkYfFRrEH0#hYemeN|0n<;RIOvi z=L)azb+eZqpUYXg432i@n7CVjfDAJGZrlDiURfuN*$q@Dilz5R&~hZVKF_nDS(ds6XeWV0asE>n>Wq41Df_Gs*DJur%fDD0|pFdfFAIE8j z1aeaIMl0-$_S-i34B^y(K=ag+&%^b1Zby@0Aa;y9yo!t{3v<<`#K8E`<+wn9l)v z;Kc7V&lTKJe2B{?MajW5`>BH;2&@O8?P91oll1lW`+(elt=#Kr86&2P0@b2XKTobK zp>SfNXu>8H8VT!;UI8zPi^EF}MyGT(&BP+NpuKk^_BM?{iZ408QkJ@tnE3{ABZfeZ zH|g)Vi&b8mgG}3@T+xivl?d`ki9L)!R`F=85 zMu^kU>}zcf>VXQW!2bY~*7d~m1~*de*ZYY8^AnEgG+tBPrt`h8t|W|2_71Xz7YnqEkXTa z-_Ec(*)T<*pTk+FI7VwdCTQ~Gq8%tM#|@vv@eYP!2Id2iZ_X*R>(E+VCaFwlmZ(#N z>Pg9{Ijo~a-=@xE9LaijIq zF`ppz6Dr&l3fg)>eE$tsxpe$rL96*Wu_$WTZU{_0&=dR#yg?5qk^a1Eigx#NKSILs?$!ZV3TOb*y?_0U0jIpZE!I~38RrtP!%z(@ z)FLse|6pbgT)ZIQO0{(P>S#tT@xF^p4nPu4WR!rCu9(XF=G4irJj%$8v300qh9>*K zBm z@UaaZiyeNHH8z9m=Yv6SEZcjASA9wSyrm)Vps+E#D^yJLOLgt;_@!!J7Ogae~%Ux187F+=V27>kfFUXw?el0eUVqv#_ zjkJ3KUK0dNSU#+IW^B4GW_r$lzBG*BuhoZ@bjzFvs0!eypFc9Uqt#&r`;7@azY%k9 z8%!I37O4XW7`VUaId>Y9B zz9nfhkzNI?{-EvX@p*(r-B1G51 zsiF?L%H>=sKcM4ogcqNbBZZ7CP$QjCD}ei7vOD}3(q@~)tr+#WXGY=mYSXqok>zja zopZm=uYgL?8Hh1bU4qnvm0>?J4ot@jQ%^+xz+Wks@IR*Ptvm_${CU-CD5vo^e%DLh zJxA9GAwRhIKNDr_FoPd#Gp0AVZ?k_67GKnfVl$pab$0xe}8 zBqhb{F}Qldm4a<>&>1L<#N>pt3K=nC#r^j5W_lKm2(49mP_nSH>2%NxkV7dD1o6(|ncBDHJUhN?788RjE08 z^e^W>*Bt87MzB3Bt~#{%GPTpzJvH-r>96|R+K7f@83=*nfn=lPc$6*%$A7OVZMujg z=DtRXq>z~*BRN18$lwWwK(*poTJ>k8#xI7sv!bX(sW|ku1;GsNR7x}5P@x_*n&H^7 zW91h3&A~D_vR2j2ONU$f@VXm38`>rvv0RQnWgENS5k!9`s8`)fR8lHfSd8W=&rQm` zS_gSbf(k^s)=z+sLobCCPAjORQ8P6i_LEh zq>woNf@$G|w&V$~V?^KK+D6nT+Ja<~5&0OcnFG7dFI|qHUXJlj9P_T;pNpW?lh_}W zeGzL1N#0gtAUBE2IT0DGdLnJm_1W9AnRgaX8wMl!7!sLw!t?kid&tPBstxsZEbb&7 ze?jw2g)i{t%R*(zw@JQZo*|(OoMx%N9W%!pPdzoU_CgGMnS~&=12?8^idM75L~6F- z)LZaN_kl1EP(_PBG$@3E%j(1*@)g`|4{UetpLv(cn|YtRX=gT(q~hb$ zeIarU9{yH_C)=H_kte3bEf=^NFmGd~^lx3z(|0GqY5q)Vv3T`8+srFSW^0vummb}d z7qXjaCBOkB#~AE{vo~e?Uc{j()VMTE=xba3pMsSzpgg2xB#VWFTvb(z(fj2$%|!ce z51q0~GqVoVN*9wf{Tn2&U>th<)XRo8k!;;3^lu`mEhT79$~^yj#yt8@C)4O;>)n{a zTZQ^-64USR{Qf>^+y7+)`WH{^Ik0DK>g;`*X#A3bH!(irk>t8*KGe>U8yp_0SfTWV zwR&@T2BlT#>`=r+eIXOqrRR>NKp*bk(TtbhlPFo1G8N_{ z&O`4aP?r5+E9gu}OQz3Jgh+cj@ANaHTP55JxGdXJ$Bx+FF8G@sS8*98#cG*%vT6pz zkqkfqX?b61NZgedhoSD&IJ$7_}f5Ysz@n`pBX>LH7S$6z_0$%d_ z{H8kd3EM?LbqkBzH1wNe@M~P`GkI(ut86%$xz0rK7tzd1* zIMpq8*s*Y{SI@Xm+?T~)7S6w3*Tz6|U7b1%CoV@$`;2)1MmamB@|8f`gZDt>etK`} zI=S0xiMMLdlt%LMMJ!rn- zt!WPrO+mY0p(wM>pI_({Kfv*X+Z8fxPQH2eaXs5lCN8>A$ak(?UO5pdE@DN;=7lA9 zD|i*v&ImGTZ$pzZ+9$$497WG0RtlO4QJEIMuw~Y~3&x@|BiWyd=R|Qo;zv2@C3l`# zMfItDPD+dz6eL%UCpf8hl{oU;mB}K=E(IK$qUF@=I>cjiF;{xV1;P$brSV2dc1Bl*WPMaozJ*#WxitDABS%( z@{_o2DsAgG5rsDnp}bwl60hi_mV%~RGf7jzW_k3pQDIFasE%k@46LuSwHj`+odY$r$xnVS4qF2M%47O z;EBxZb-tM?B}A4NhN}v%>4hF;y!!R+rn#-p?%F~r{zR+5F4UQ(7)!wxS17k{KMxco(*PyB@V`5?|F61-*&{MCvZJHxM-r6q;y7vjrXa({C`9ys S^_+%x$PCY$>SJ{sqy7sp-)imv literal 0 HcmV?d00001 diff --git a/docs/screenshots/memory-mobile.png b/docs/screenshots/memory-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..36266d0f52de0701397347252a077b0be4c995e0 GIT binary patch literal 61110 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 z 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 S^CtL&MD?kbV)5hW@BbTgeNn*x literal 0 HcmV?d00001 diff --git a/package.json b/package.json index ff19e72..5e18432 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "type": "module", "private": true, - "packageManager": "bun@1.3.9", + "packageManager": "bun@1.3.10", "workspaces": [ "apps/*", "packages/*" @@ -23,23 +23,31 @@ "test": "turbo run test", "clean": "rm -rf node_modules apps/*/node_modules packages/*/node_modules .turbo apps/*/.turbo packages/*/.turbo apps/*/dist packages/*/dist apps/*/build packages/*/build packages/convex/_generated bun.lock", "clean:install": "bun run clean && bun install", - "ngrok": "turbo run dev --filter=@clairvoyant/ngrok" + "ngrok": "turbo run dev --filter=@clairvoyant/ngrok", + "prepare": "husky" }, "dependencies": { - "convex": "^1.31.7", - "elysia": "^1.4.24" + "convex": "^1.32.0", + "elysia": "^1.4.26" }, "overrides": { "elysia": "$elysia", "esbuild": "0.25.12" }, + "lint-staged": { + "*.{ts,tsx,js,jsx,json,css}": [ + "bunx biome check --write --no-errors-on-unmatched" + ] + }, "devDependencies": { "@biomejs/biome": "2.1.2", "@boundaryml/baml": "0.215.0", "@types/bun": "latest", - "@types/node": "^24.10.13", + "@types/node": "^24.10.15", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", "tsx": "^4.21.0", - "turbo": "^2.8.7", + "turbo": "^2.8.11", "typescript": "^5.9.3" } } diff --git a/packages/convex/_generated/api.d.ts b/packages/convex/_generated/api.d.ts index 0d89eb7..3c5d346 100644 --- a/packages/convex/_generated/api.d.ts +++ b/packages/convex/_generated/api.d.ts @@ -17,10 +17,14 @@ import type * as cronManagement from "../cronManagement.js"; import type * as dailySummaries from "../dailySummaries.js"; import type * as dailySynthesis from "../dailySynthesis.js"; import type * as displayQueue from "../displayQueue.js"; +import type * as emailEntitlements from "../emailEntitlements.js"; +import type * as emailEntitlementsNode from "../emailEntitlementsNode.js"; import type * as emailEvents from "../emailEvents.js"; import type * as emailNotes from "../emailNotes.js"; import type * as emailReply from "../emailReply.js"; import type * as emailThreadMessages from "../emailThreadMessages.js"; +import type * as emails_EmailThreadPaywall from "../emails/EmailThreadPaywall.js"; +import type * as emails_OptOutCheckout from "../emails/OptOutCheckout.js"; import type * as emails_SessionNote from "../emails/SessionNote.js"; import type * as followups from "../followups.js"; import type * as followupsChat from "../followupsChat.js"; @@ -31,6 +35,7 @@ import type * as http from "../http.js"; import type * as inboundEmail from "../inboundEmail.js"; import type * as init from "../init.js"; import type * as notes from "../notes.js"; +import type * as optOut from "../optOut.js"; import type * as payments from "../payments.js"; import type * as resendClient from "../resendClient.js"; import type * as sessionSummaries from "../sessionSummaries.js"; @@ -38,40 +43,45 @@ import type * as tavilySearch from "../tavilySearch.js"; import type * as users from "../users.js"; import type { - ApiFromModules, - FilterApi, - FunctionReference, + ApiFromModules, + FilterApi, + FunctionReference, } from "convex/server"; declare const fullApi: ApiFromModules<{ - analytics: typeof analytics; - bamlActions: typeof bamlActions; - chat: typeof chat; - chatQueries: typeof chatQueries; - conversationLogs: typeof conversationLogs; - cronManagement: typeof cronManagement; - dailySummaries: typeof dailySummaries; - dailySynthesis: typeof dailySynthesis; - displayQueue: typeof displayQueue; - emailEvents: typeof emailEvents; - emailNotes: typeof emailNotes; - emailReply: typeof emailReply; - emailThreadMessages: typeof emailThreadMessages; - "emails/SessionNote": typeof emails_SessionNote; - followups: typeof followups; - followupsChat: typeof followupsChat; - followupsChatQueries: typeof followupsChatQueries; - honcho: typeof honcho; - honchoSessions: typeof honchoSessions; - http: typeof http; - inboundEmail: typeof inboundEmail; - init: typeof init; - notes: typeof notes; - payments: typeof payments; - resendClient: typeof resendClient; - sessionSummaries: typeof sessionSummaries; - tavilySearch: typeof tavilySearch; - users: typeof users; + analytics: typeof analytics; + bamlActions: typeof bamlActions; + chat: typeof chat; + chatQueries: typeof chatQueries; + conversationLogs: typeof conversationLogs; + cronManagement: typeof cronManagement; + dailySummaries: typeof dailySummaries; + dailySynthesis: typeof dailySynthesis; + displayQueue: typeof displayQueue; + emailEntitlements: typeof emailEntitlements; + emailEntitlementsNode: typeof emailEntitlementsNode; + emailEvents: typeof emailEvents; + emailNotes: typeof emailNotes; + emailReply: typeof emailReply; + emailThreadMessages: typeof emailThreadMessages; + "emails/EmailThreadPaywall": typeof emails_EmailThreadPaywall; + "emails/OptOutCheckout": typeof emails_OptOutCheckout; + "emails/SessionNote": typeof emails_SessionNote; + followups: typeof followups; + followupsChat: typeof followupsChat; + followupsChatQueries: typeof followupsChatQueries; + honcho: typeof honcho; + honchoSessions: typeof honchoSessions; + http: typeof http; + inboundEmail: typeof inboundEmail; + init: typeof init; + notes: typeof notes; + optOut: typeof optOut; + payments: typeof payments; + resendClient: typeof resendClient; + sessionSummaries: typeof sessionSummaries; + tavilySearch: typeof tavilySearch; + users: typeof users; }>; /** @@ -83,8 +93,8 @@ declare const fullApi: ApiFromModules<{ * ``` */ export declare const api: FilterApi< - typeof fullApi, - FunctionReference + typeof fullApi, + FunctionReference >; /** @@ -96,752 +106,752 @@ export declare const api: FilterApi< * ``` */ export declare const internal: FilterApi< - typeof fullApi, - FunctionReference + typeof fullApi, + FunctionReference >; export declare const components: { - polar: { - lib: { - createProduct: FunctionReference< - "mutation", - "internal", - { - product: { - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - }; - }, - any - >; - createSubscription: FunctionReference< - "mutation", - "internal", - { - subscription: { - amount: number | null; - cancelAtPeriodEnd: boolean; - checkoutId: string | null; - createdAt: string; - currency: string | null; - currentPeriodEnd: string | null; - currentPeriodStart: string; - customerCancellationComment?: string | null; - customerCancellationReason?: string | null; - customerId: string; - endedAt: string | null; - id: string; - metadata: Record; - modifiedAt: string | null; - priceId?: string; - productId: string; - recurringInterval: "day" | "week" | "month" | "year" | null; - startedAt: string | null; - status: string; - }; - }, - any - >; - getCurrentSubscription: FunctionReference< - "query", - "internal", - { userId: string }, - { - amount: number | null; - cancelAtPeriodEnd: boolean; - checkoutId: string | null; - createdAt: string; - currency: string | null; - currentPeriodEnd: string | null; - currentPeriodStart: string; - customerCancellationComment?: string | null; - customerCancellationReason?: string | null; - customerId: string; - endedAt: string | null; - id: string; - metadata: Record; - modifiedAt: string | null; - priceId?: string; - product: { - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - }; - productId: string; - recurringInterval: "day" | "week" | "month" | "year" | null; - startedAt: string | null; - status: string; - } | null - >; - getCustomerByUserId: FunctionReference< - "query", - "internal", - { userId: string }, - { id: string; metadata?: Record; userId: string } | null - >; - getProduct: FunctionReference< - "query", - "internal", - { id: string }, - { - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - } | null - >; - getSubscription: FunctionReference< - "query", - "internal", - { id: string }, - { - amount: number | null; - cancelAtPeriodEnd: boolean; - checkoutId: string | null; - createdAt: string; - currency: string | null; - currentPeriodEnd: string | null; - currentPeriodStart: string; - customerCancellationComment?: string | null; - customerCancellationReason?: string | null; - customerId: string; - endedAt: string | null; - id: string; - metadata: Record; - modifiedAt: string | null; - priceId?: string; - productId: string; - recurringInterval: "day" | "week" | "month" | "year" | null; - startedAt: string | null; - status: string; - } | null - >; - insertCustomer: FunctionReference< - "mutation", - "internal", - { id: string; metadata?: Record; userId: string }, - string - >; - listCustomerSubscriptions: FunctionReference< - "query", - "internal", - { customerId: string }, - Array<{ - amount: number | null; - cancelAtPeriodEnd: boolean; - checkoutId: string | null; - createdAt: string; - currency: string | null; - currentPeriodEnd: string | null; - currentPeriodStart: string; - customerCancellationComment?: string | null; - customerCancellationReason?: string | null; - customerId: string; - endedAt: string | null; - id: string; - metadata: Record; - modifiedAt: string | null; - priceId?: string; - productId: string; - recurringInterval: "day" | "week" | "month" | "year" | null; - startedAt: string | null; - status: string; - }> - >; - listProducts: FunctionReference< - "query", - "internal", - { includeArchived?: boolean }, - Array<{ - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - priceAmount?: number; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - }> - >; - listUserSubscriptions: FunctionReference< - "query", - "internal", - { userId: string }, - Array<{ - amount: number | null; - cancelAtPeriodEnd: boolean; - checkoutId: string | null; - createdAt: string; - currency: string | null; - currentPeriodEnd: string | null; - currentPeriodStart: string; - customerCancellationComment?: string | null; - customerCancellationReason?: string | null; - customerId: string; - endedAt: string | null; - id: string; - metadata: Record; - modifiedAt: string | null; - priceId?: string; - product: { - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - } | null; - productId: string; - recurringInterval: "day" | "week" | "month" | "year" | null; - startedAt: string | null; - status: string; - }> - >; - syncProducts: FunctionReference< - "action", - "internal", - { polarAccessToken: string; server: "sandbox" | "production" }, - any - >; - updateProduct: FunctionReference< - "mutation", - "internal", - { - product: { - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - }; - }, - any - >; - updateProducts: FunctionReference< - "mutation", - "internal", - { - polarAccessToken: string; - products: Array<{ - createdAt: string; - description: string | null; - id: string; - isArchived: boolean; - isRecurring: boolean; - medias: Array<{ - checksumEtag: string | null; - checksumSha256Base64: string | null; - checksumSha256Hex: string | null; - createdAt: string; - id: string; - isUploaded: boolean; - lastModifiedAt: string | null; - mimeType: string; - name: string; - organizationId: string; - path: string; - publicUrl: string; - service?: string; - size: number; - sizeReadable: string; - storageVersion: string | null; - version: string | null; - }>; - metadata?: Record; - modifiedAt: string | null; - name: string; - organizationId: string; - prices: Array<{ - amountType?: string; - createdAt: string; - id: string; - isArchived: boolean; - maximumAmount?: number | null; - minimumAmount?: number | null; - modifiedAt: string | null; - presetAmount?: number | null; - priceAmount?: number; - priceCurrency?: string; - productId: string; - recurringInterval?: "day" | "week" | "month" | "year" | null; - type?: string; - }>; - recurringInterval?: "day" | "week" | "month" | "year" | null; - }>; - }, - any - >; - updateSubscription: FunctionReference< - "mutation", - "internal", - { - subscription: { - amount: number | null; - cancelAtPeriodEnd: boolean; - checkoutId: string | null; - createdAt: string; - currency: string | null; - currentPeriodEnd: string | null; - currentPeriodStart: string; - customerCancellationComment?: string | null; - customerCancellationReason?: string | null; - customerId: string; - endedAt: string | null; - id: string; - metadata: Record; - modifiedAt: string | null; - priceId?: string; - productId: string; - recurringInterval: "day" | "week" | "month" | "year" | null; - startedAt: string | null; - status: string; - }; - }, - any - >; - upsertCustomer: FunctionReference< - "mutation", - "internal", - { id: string; metadata?: Record; userId: string }, - string - >; - }; - }; - crons: { - public: { - del: FunctionReference< - "mutation", - "internal", - { identifier: { id: string } | { name: string } }, - null - >; - get: FunctionReference< - "query", - "internal", - { identifier: { id: string } | { name: string } }, - { - args: Record; - functionHandle: string; - id: string; - name?: string; - schedule: - | { kind: "interval"; ms: number } - | { cronspec: string; kind: "cron"; tz?: string }; - } | null - >; - list: FunctionReference< - "query", - "internal", - {}, - Array<{ - args: Record; - functionHandle: string; - id: string; - name?: string; - schedule: - | { kind: "interval"; ms: number } - | { cronspec: string; kind: "cron"; tz?: string }; - }> - >; - register: FunctionReference< - "mutation", - "internal", - { - args: Record; - functionHandle: string; - name?: string; - schedule: - | { kind: "interval"; ms: number } - | { cronspec: string; kind: "cron"; tz?: string }; - }, - string - >; - }; - }; - resend: { - lib: { - cancelEmail: FunctionReference< - "mutation", - "internal", - { emailId: string }, - null - >; - cleanupAbandonedEmails: FunctionReference< - "mutation", - "internal", - { olderThan?: number }, - null - >; - cleanupOldEmails: FunctionReference< - "mutation", - "internal", - { olderThan?: number }, - null - >; - createManualEmail: FunctionReference< - "mutation", - "internal", - { - from: string; - headers?: Array<{ name: string; value: string }>; - replyTo?: Array; - subject: string; - to: Array | string; - }, - string - >; - get: FunctionReference< - "query", - "internal", - { emailId: string }, - { - bcc?: Array; - bounced?: boolean; - cc?: Array; - clicked?: boolean; - complained: boolean; - createdAt: number; - deliveryDelayed?: boolean; - errorMessage?: string; - failed?: boolean; - finalizedAt: number; - from: string; - headers?: Array<{ name: string; value: string }>; - html?: string; - opened: boolean; - replyTo: Array; - resendId?: string; - segment: number; - status: - | "waiting" - | "queued" - | "cancelled" - | "sent" - | "delivered" - | "delivery_delayed" - | "bounced" - | "failed"; - subject?: string; - template?: { - id: string; - variables?: Record; - }; - text?: string; - to: Array; - } | null - >; - getStatus: FunctionReference< - "query", - "internal", - { emailId: string }, - { - bounced: boolean; - clicked: boolean; - complained: boolean; - deliveryDelayed: boolean; - errorMessage: string | null; - failed: boolean; - opened: boolean; - status: - | "waiting" - | "queued" - | "cancelled" - | "sent" - | "delivered" - | "delivery_delayed" - | "bounced" - | "failed"; - } | null - >; - handleEmailEvent: FunctionReference< - "mutation", - "internal", - { event: any }, - null - >; - sendEmail: FunctionReference< - "mutation", - "internal", - { - bcc?: Array; - cc?: Array; - from: string; - headers?: Array<{ name: string; value: string }>; - html?: string; - options: { - apiKey: string; - initialBackoffMs: number; - onEmailEvent?: { fnHandle: string }; - retryAttempts: number; - testMode: boolean; - }; - replyTo?: Array; - subject?: string; - template?: { - id: string; - variables?: Record; - }; - text?: string; - to: Array; - }, - string - >; - updateManualEmail: FunctionReference< - "mutation", - "internal", - { - emailId: string; - errorMessage?: string; - resendId?: string; - status: - | "waiting" - | "queued" - | "cancelled" - | "sent" - | "delivered" - | "delivery_delayed" - | "bounced" - | "failed"; - }, - null - >; - }; - }; + polar: { + lib: { + createProduct: FunctionReference< + "mutation", + "internal", + { + product: { + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + }; + }, + any + >; + createSubscription: FunctionReference< + "mutation", + "internal", + { + subscription: { + amount: number | null; + cancelAtPeriodEnd: boolean; + checkoutId: string | null; + createdAt: string; + currency: string | null; + currentPeriodEnd: string | null; + currentPeriodStart: string; + customerCancellationComment?: string | null; + customerCancellationReason?: string | null; + customerId: string; + endedAt: string | null; + id: string; + metadata: Record; + modifiedAt: string | null; + priceId?: string; + productId: string; + recurringInterval: "day" | "week" | "month" | "year" | null; + startedAt: string | null; + status: string; + }; + }, + any + >; + getCurrentSubscription: FunctionReference< + "query", + "internal", + { userId: string }, + { + amount: number | null; + cancelAtPeriodEnd: boolean; + checkoutId: string | null; + createdAt: string; + currency: string | null; + currentPeriodEnd: string | null; + currentPeriodStart: string; + customerCancellationComment?: string | null; + customerCancellationReason?: string | null; + customerId: string; + endedAt: string | null; + id: string; + metadata: Record; + modifiedAt: string | null; + priceId?: string; + product: { + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + }; + productId: string; + recurringInterval: "day" | "week" | "month" | "year" | null; + startedAt: string | null; + status: string; + } | null + >; + getCustomerByUserId: FunctionReference< + "query", + "internal", + { userId: string }, + { id: string; metadata?: Record; userId: string } | null + >; + getProduct: FunctionReference< + "query", + "internal", + { id: string }, + { + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + } | null + >; + getSubscription: FunctionReference< + "query", + "internal", + { id: string }, + { + amount: number | null; + cancelAtPeriodEnd: boolean; + checkoutId: string | null; + createdAt: string; + currency: string | null; + currentPeriodEnd: string | null; + currentPeriodStart: string; + customerCancellationComment?: string | null; + customerCancellationReason?: string | null; + customerId: string; + endedAt: string | null; + id: string; + metadata: Record; + modifiedAt: string | null; + priceId?: string; + productId: string; + recurringInterval: "day" | "week" | "month" | "year" | null; + startedAt: string | null; + status: string; + } | null + >; + insertCustomer: FunctionReference< + "mutation", + "internal", + { id: string; metadata?: Record; userId: string }, + string + >; + listCustomerSubscriptions: FunctionReference< + "query", + "internal", + { customerId: string }, + Array<{ + amount: number | null; + cancelAtPeriodEnd: boolean; + checkoutId: string | null; + createdAt: string; + currency: string | null; + currentPeriodEnd: string | null; + currentPeriodStart: string; + customerCancellationComment?: string | null; + customerCancellationReason?: string | null; + customerId: string; + endedAt: string | null; + id: string; + metadata: Record; + modifiedAt: string | null; + priceId?: string; + productId: string; + recurringInterval: "day" | "week" | "month" | "year" | null; + startedAt: string | null; + status: string; + }> + >; + listProducts: FunctionReference< + "query", + "internal", + { includeArchived?: boolean }, + Array<{ + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + priceAmount?: number; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + }> + >; + listUserSubscriptions: FunctionReference< + "query", + "internal", + { userId: string }, + Array<{ + amount: number | null; + cancelAtPeriodEnd: boolean; + checkoutId: string | null; + createdAt: string; + currency: string | null; + currentPeriodEnd: string | null; + currentPeriodStart: string; + customerCancellationComment?: string | null; + customerCancellationReason?: string | null; + customerId: string; + endedAt: string | null; + id: string; + metadata: Record; + modifiedAt: string | null; + priceId?: string; + product: { + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + } | null; + productId: string; + recurringInterval: "day" | "week" | "month" | "year" | null; + startedAt: string | null; + status: string; + }> + >; + syncProducts: FunctionReference< + "action", + "internal", + { polarAccessToken: string; server: "sandbox" | "production" }, + any + >; + updateProduct: FunctionReference< + "mutation", + "internal", + { + product: { + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + }; + }, + any + >; + updateProducts: FunctionReference< + "mutation", + "internal", + { + polarAccessToken: string; + products: Array<{ + createdAt: string; + description: string | null; + id: string; + isArchived: boolean; + isRecurring: boolean; + medias: Array<{ + checksumEtag: string | null; + checksumSha256Base64: string | null; + checksumSha256Hex: string | null; + createdAt: string; + id: string; + isUploaded: boolean; + lastModifiedAt: string | null; + mimeType: string; + name: string; + organizationId: string; + path: string; + publicUrl: string; + service?: string; + size: number; + sizeReadable: string; + storageVersion: string | null; + version: string | null; + }>; + metadata?: Record; + modifiedAt: string | null; + name: string; + organizationId: string; + prices: Array<{ + amountType?: string; + createdAt: string; + id: string; + isArchived: boolean; + maximumAmount?: number | null; + minimumAmount?: number | null; + modifiedAt: string | null; + presetAmount?: number | null; + priceAmount?: number; + priceCurrency?: string; + productId: string; + recurringInterval?: "day" | "week" | "month" | "year" | null; + type?: string; + }>; + recurringInterval?: "day" | "week" | "month" | "year" | null; + }>; + }, + any + >; + updateSubscription: FunctionReference< + "mutation", + "internal", + { + subscription: { + amount: number | null; + cancelAtPeriodEnd: boolean; + checkoutId: string | null; + createdAt: string; + currency: string | null; + currentPeriodEnd: string | null; + currentPeriodStart: string; + customerCancellationComment?: string | null; + customerCancellationReason?: string | null; + customerId: string; + endedAt: string | null; + id: string; + metadata: Record; + modifiedAt: string | null; + priceId?: string; + productId: string; + recurringInterval: "day" | "week" | "month" | "year" | null; + startedAt: string | null; + status: string; + }; + }, + any + >; + upsertCustomer: FunctionReference< + "mutation", + "internal", + { id: string; metadata?: Record; userId: string }, + string + >; + }; + }; + crons: { + public: { + del: FunctionReference< + "mutation", + "internal", + { identifier: { id: string } | { name: string } }, + null + >; + get: FunctionReference< + "query", + "internal", + { identifier: { id: string } | { name: string } }, + { + args: Record; + functionHandle: string; + id: string; + name?: string; + schedule: + | { kind: "interval"; ms: number } + | { cronspec: string; kind: "cron"; tz?: string }; + } | null + >; + list: FunctionReference< + "query", + "internal", + {}, + Array<{ + args: Record; + functionHandle: string; + id: string; + name?: string; + schedule: + | { kind: "interval"; ms: number } + | { cronspec: string; kind: "cron"; tz?: string }; + }> + >; + register: FunctionReference< + "mutation", + "internal", + { + args: Record; + functionHandle: string; + name?: string; + schedule: + | { kind: "interval"; ms: number } + | { cronspec: string; kind: "cron"; tz?: string }; + }, + string + >; + }; + }; + resend: { + lib: { + cancelEmail: FunctionReference< + "mutation", + "internal", + { emailId: string }, + null + >; + cleanupAbandonedEmails: FunctionReference< + "mutation", + "internal", + { olderThan?: number }, + null + >; + cleanupOldEmails: FunctionReference< + "mutation", + "internal", + { olderThan?: number }, + null + >; + createManualEmail: FunctionReference< + "mutation", + "internal", + { + from: string; + headers?: Array<{ name: string; value: string }>; + replyTo?: Array; + subject: string; + to: Array | string; + }, + string + >; + get: FunctionReference< + "query", + "internal", + { emailId: string }, + { + bcc?: Array; + bounced?: boolean; + cc?: Array; + clicked?: boolean; + complained: boolean; + createdAt: number; + deliveryDelayed?: boolean; + errorMessage?: string; + failed?: boolean; + finalizedAt: number; + from: string; + headers?: Array<{ name: string; value: string }>; + html?: string; + opened: boolean; + replyTo: Array; + resendId?: string; + segment: number; + status: + | "waiting" + | "queued" + | "cancelled" + | "sent" + | "delivered" + | "delivery_delayed" + | "bounced" + | "failed"; + subject?: string; + template?: { + id: string; + variables?: Record; + }; + text?: string; + to: Array; + } | null + >; + getStatus: FunctionReference< + "query", + "internal", + { emailId: string }, + { + bounced: boolean; + clicked: boolean; + complained: boolean; + deliveryDelayed: boolean; + errorMessage: string | null; + failed: boolean; + opened: boolean; + status: + | "waiting" + | "queued" + | "cancelled" + | "sent" + | "delivered" + | "delivery_delayed" + | "bounced" + | "failed"; + } | null + >; + handleEmailEvent: FunctionReference< + "mutation", + "internal", + { event: any }, + null + >; + sendEmail: FunctionReference< + "mutation", + "internal", + { + bcc?: Array; + cc?: Array; + from: string; + headers?: Array<{ name: string; value: string }>; + html?: string; + options: { + apiKey: string; + initialBackoffMs: number; + onEmailEvent?: { fnHandle: string }; + retryAttempts: number; + testMode: boolean; + }; + replyTo?: Array; + subject?: string; + template?: { + id: string; + variables?: Record; + }; + text?: string; + to: Array; + }, + string + >; + updateManualEmail: FunctionReference< + "mutation", + "internal", + { + emailId: string; + errorMessage?: string; + resendId?: string; + status: + | "waiting" + | "queued" + | "cancelled" + | "sent" + | "delivered" + | "delivery_delayed" + | "bounced" + | "failed"; + }, + null + >; + }; + }; }; diff --git a/packages/convex/conversationLogs.ts b/packages/convex/conversationLogs.ts index 3c4e235..6a230bb 100644 --- a/packages/convex/conversationLogs.ts +++ b/packages/convex/conversationLogs.ts @@ -10,6 +10,11 @@ export const logConversation = mutation({ response: v.optional(v.string()), }, handler: async (ctx, args) => { + const user = await ctx.db.get(args.userId); + if (user?.optedOutOfTraining) { + return null; + } + return await ctx.db.insert("conversationLogs", { userId: args.userId, sessionId: args.sessionId, diff --git a/packages/convex/emailEntitlements.ts b/packages/convex/emailEntitlements.ts new file mode 100644 index 0000000..ac5fc78 --- /dev/null +++ b/packages/convex/emailEntitlements.ts @@ -0,0 +1,117 @@ +import { v } from "convex/values"; +import { internalMutation, internalQuery, query } from "./_generated/server"; + +export const FREE_EMAIL_THREAD_LIMIT = 10; + +function currentPeriodKey(): string { + const now = new Date(); + const month = String(now.getUTCMonth() + 1).padStart(2, "0"); + return `${now.getUTCFullYear()}-${month}`; +} + +export const getEmailThreadStatus = query({ + args: { mentraUserId: v.string() }, + handler: async (ctx, args) => { + const user = await ctx.db + .query("users") + .withIndex("by_mentra_id", (q) => q.eq("mentraUserId", args.mentraUserId)) + .first(); + + if (!user) { + return null; + } + + const periodKey = currentPeriodKey(); + const usage = await ctx.db + .query("emailThreadUsage") + .withIndex("by_user_period", (q) => + q.eq("userId", user._id).eq("periodKey", periodKey), + ) + .first(); + + const used = usage?.outboundCount ?? 0; + const limit = FREE_EMAIL_THREAD_LIMIT; + + return { + periodKey, + paidEmailThreads: user.paidEmailThreads ?? false, + used, + limit, + remaining: Math.max(0, limit - used), + }; + }, +}); + +export const getUsageByUserPeriod = internalQuery({ + args: { + userId: v.id("users"), + periodKey: v.string(), + }, + handler: async (ctx, args) => { + return await ctx.db + .query("emailThreadUsage") + .withIndex("by_user_period", (q) => + q.eq("userId", args.userId).eq("periodKey", args.periodKey), + ) + .first(); + }, +}); + +export const incrementOutboundUsage = internalMutation({ + args: { + userId: v.id("users"), + periodKey: v.optional(v.string()), + }, + handler: async (ctx, args) => { + const periodKey = args.periodKey ?? currentPeriodKey(); + const existing = await ctx.db + .query("emailThreadUsage") + .withIndex("by_user_period", (q) => + q.eq("userId", args.userId).eq("periodKey", periodKey), + ) + .first(); + + if (existing) { + await ctx.db.patch(existing._id, { + outboundCount: existing.outboundCount + 1, + }); + return existing._id; + } + + return await ctx.db.insert("emailThreadUsage", { + userId: args.userId, + periodKey, + outboundCount: 1, + }); + }, +}); + +export const markPaywallSent = internalMutation({ + args: { + userId: v.id("users"), + periodKey: v.string(), + }, + handler: async (ctx, args) => { + const existing = await ctx.db + .query("emailThreadUsage") + .withIndex("by_user_period", (q) => + q.eq("userId", args.userId).eq("periodKey", args.periodKey), + ) + .first(); + + const timestamp = new Date().toISOString(); + if (existing) { + await ctx.db.patch(existing._id, { + paywallEmailSentAt: timestamp, + }); + return existing._id; + } + + return await ctx.db.insert("emailThreadUsage", { + userId: args.userId, + periodKey: args.periodKey, + outboundCount: FREE_EMAIL_THREAD_LIMIT, + paywallEmailSentAt: timestamp, + }); + }, +}); diff --git a/packages/convex/emailEntitlementsNode.ts b/packages/convex/emailEntitlementsNode.ts new file mode 100644 index 0000000..40046a9 --- /dev/null +++ b/packages/convex/emailEntitlementsNode.ts @@ -0,0 +1,96 @@ +"use node"; + +import { render } from "@react-email/render"; +import { v } from "convex/values"; +import { internal } from "./_generated/api"; +import { internalAction } from "./_generated/server"; +import { FREE_EMAIL_THREAD_LIMIT } from "./emailEntitlements"; +import { EmailThreadPaywallEmail } from "./emails/EmailThreadPaywall"; +import { resend } from "./resendClient"; + +const EMAIL_DOMAIN = process.env.EMAIL_DOMAIN || "notes.example.com"; + +function currentPeriodKey(): string { + const now = new Date(); + const month = String(now.getUTCMonth() + 1).padStart(2, "0"); + return `${now.getUTCFullYear()}-${month}`; +} + +export const preflightOutboundEmail = internalAction({ + args: { userId: v.id("users") }, + handler: async ( + ctx, + args, + ): Promise<{ allowed: boolean; trackUsage: boolean; reason?: string }> => { + const user = await ctx.runQuery(internal.users.getByIdInternal, { + userId: args.userId, + }); + if (!user) { + return { + allowed: false as const, + trackUsage: false, + reason: "user_not_found", + }; + } + + if (user.paidEmailThreads) { + return { allowed: true as const, trackUsage: false }; + } + + const periodKey = currentPeriodKey(); + const usage = await ctx.runQuery( + internal.emailEntitlements.getUsageByUserPeriod, + { + userId: args.userId, + periodKey, + }, + ); + + const used = usage?.outboundCount ?? 0; + if (used < FREE_EMAIL_THREAD_LIMIT) { + return { allowed: true as const, trackUsage: true }; + } + + if (!usage?.paywallEmailSentAt && user.email) { + try { + const checkout = await ctx.runAction( + internal.payments.createFeatureCheckoutLinkInternal, + { + userId: args.userId, + feature: "emailThreads", + }, + ); + + const html = await render( + EmailThreadPaywallEmail({ + checkoutUrl: checkout.url, + limit: FREE_EMAIL_THREAD_LIMIT, + }), + ); + + await resend.sendEmail(ctx, { + from: `Clairvoyant `, + to: user.email, + subject: "Continue your Clairvoyant email thread", + html, + }); + + await ctx.runMutation(internal.emailEntitlements.markPaywallSent, { + userId: args.userId, + periodKey, + }); + } catch (error) { + console.error( + "[EmailEntitlements] Failed to send paywall email:", + error, + ); + } + } + + return { + allowed: false as const, + trackUsage: false, + reason: "limit_reached", + }; + }, +}); diff --git a/packages/convex/emailReply.ts b/packages/convex/emailReply.ts index f98c46e..dbd73ef 100644 --- a/packages/convex/emailReply.ts +++ b/packages/convex/emailReply.ts @@ -261,22 +261,25 @@ export const processEmailReply = internalAction({ const diatribePeer = await honchoClient.peer(`${user._id}-diatribe`, { metadata: { name: "Diatribe", - description: "A peer that listens to the raw translations of the users' speech.", + description: + "A peer that listens to the raw translations of the users' speech.", }, }); const synthesisPeer = await honchoClient.peer(`${user._id}-synthesis`, { metadata: { name: "Synthesis Peer", - description: "A peer that captures synthesized knowledge from the user's speech.", + description: + "A peer that captures synthesized knowledge from the user's speech.", }, }); await session.addPeers([diatribePeer, synthesisPeer]); // Add user email message + extracted facts to diatribe peer - const userContent = interpretation.extractedFacts.length > 0 - ? `${textContent}\n\nExtracted facts:\n${interpretation.extractedFacts.map((f) => `• ${f}`).join("\n")}` - : textContent; + const userContent = + interpretation.extractedFacts.length > 0 + ? `${textContent}\n\nExtracted facts:\n${interpretation.extractedFacts.map((f) => `• ${f}`).join("\n")}` + : textContent; await session.addMessages([ { @@ -290,7 +293,9 @@ export const processEmailReply = internalAction({ }, }, ]); - console.log(`[EmailReply] ✓ Added user message to diatribe peer${interpretation.extractedFacts.length > 0 ? ` with ${interpretation.extractedFacts.length} facts` : ""}`); + console.log( + `[EmailReply] ✓ Added user message to diatribe peer${interpretation.extractedFacts.length > 0 ? ` with ${interpretation.extractedFacts.length} facts` : ""}`, + ); // Add assistant response to synthesis peer await session.addMessages([ @@ -305,7 +310,9 @@ export const processEmailReply = internalAction({ }, }, ]); - console.log(`[EmailReply] ✓ Added assistant response to synthesis peer`); + console.log( + `[EmailReply] ✓ Added assistant response to synthesis peer`, + ); } catch (error) { console.warn( `[EmailReply] ✗ Failed to update Honcho memory: ${error instanceof Error ? error.message : String(error)}`, @@ -356,6 +363,16 @@ export const processEmailReply = internalAction({ // Step 9: Build and send reply email with proper threading headers console.log("[EmailReply] Step 9: Building and sending reply email..."); + const access = await ctx.runAction( + internal.emailEntitlementsNode.preflightOutboundEmail, + { + userId: user._id, + }, + ); + if (!access.allowed) { + return { success: false, error: access.reason ?? "email_limit_reached" }; + } + const newMessageId = generateMessageId(); const inReplyTo = inboundMessageId; @@ -415,6 +432,15 @@ Sent by Clairvoyant`; resendEmailId, textContent: replyContent, }); + + if (access.trackUsage) { + await ctx.runMutation( + internal.emailEntitlements.incrementOutboundUsage, + { + userId: user._id, + }, + ); + } console.log(`[EmailReply] ✓ Stored outbound message in thread`); const totalTime = Date.now() - startTime; diff --git a/packages/convex/emails/EmailThreadPaywall.tsx b/packages/convex/emails/EmailThreadPaywall.tsx new file mode 100644 index 0000000..e2dd22b --- /dev/null +++ b/packages/convex/emails/EmailThreadPaywall.tsx @@ -0,0 +1,117 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Preview, + Section, + Text, +} from "@react-email/components"; + +interface EmailThreadPaywallEmailProps { + checkoutUrl: string; + limit: number; +} + +export function EmailThreadPaywallEmail({ + checkoutUrl, + limit, +}: EmailThreadPaywallEmailProps) { + return ( + + + Your Clairvoyant email thread limit was reached + + + Email Thread Limit Reached + +

+ + You have reached your free monthly limit of {limit} email thread + messages. + + + Subscribe to continue receiving threaded email responses. + +
+ +
+ +
+ +
+ +
+ + Sent by Clairvoyant + + + + ); +} + +const main = { + backgroundColor: "#f6f9fc", + fontFamily: + '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif', +}; + +const container = { + backgroundColor: "#ffffff", + margin: "0 auto", + padding: "40px 20px", + maxWidth: "560px", + borderRadius: "8px", +}; + +const heading = { + fontSize: "24px", + fontWeight: "600", + color: "#1a1a1a", + margin: "0 0 24px", + padding: "0", +}; + +const paragraph = { + fontSize: "14px", + lineHeight: "24px", + color: "#333333", + margin: "0 0 16px", + padding: "0", +}; + +const hr = { + borderColor: "#e6e6e6", + margin: "24px 0", +}; + +const buttonContainer = { + textAlign: "center" as const, +}; + +const button = { + backgroundColor: "#1a1a1a", + borderRadius: "6px", + color: "#ffffff", + fontSize: "16px", + fontWeight: "600", + textDecoration: "none", + textAlign: "center" as const, + display: "inline-block", + padding: "12px 24px", +}; + +const footer = { + fontSize: "12px", + color: "#999999", + textAlign: "center" as const, + margin: "0", + padding: "0", +}; + +export default EmailThreadPaywallEmail; diff --git a/packages/convex/emails/OptOutCheckout.tsx b/packages/convex/emails/OptOutCheckout.tsx new file mode 100644 index 0000000..fb5abd5 --- /dev/null +++ b/packages/convex/emails/OptOutCheckout.tsx @@ -0,0 +1,114 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Hr, + Html, + Preview, + Section, + Text, +} from "@react-email/components"; + +interface OptOutCheckoutEmailProps { + checkoutUrl: string; +} + +export function OptOutCheckoutEmail({ checkoutUrl }: OptOutCheckoutEmailProps) { + return ( + + + Enable paid opt-out for Clairvoyant training + + + Opt Out Of Training + +
+ + You requested to opt out of Clairvoyant model training. This is a + paid privacy feature. + + + Activate this subscription and your new conversations will no + longer be logged for training. + +
+ +
+ +
+ +
+ +
+ + Sent by Clairvoyant +
+ + + ); +} + +const main = { + backgroundColor: "#f6f9fc", + fontFamily: + '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif', +}; + +const container = { + backgroundColor: "#ffffff", + margin: "0 auto", + padding: "40px 20px", + maxWidth: "560px", + borderRadius: "8px", +}; + +const heading = { + fontSize: "24px", + fontWeight: "600", + color: "#1a1a1a", + margin: "0 0 24px", + padding: "0", +}; + +const paragraph = { + fontSize: "14px", + lineHeight: "24px", + color: "#333333", + margin: "0 0 16px", + padding: "0", +}; + +const hr = { + borderColor: "#e6e6e6", + margin: "24px 0", +}; + +const buttonContainer = { + textAlign: "center" as const, +}; + +const button = { + backgroundColor: "#1a1a1a", + borderRadius: "6px", + color: "#ffffff", + fontSize: "16px", + fontWeight: "600", + textDecoration: "none", + textAlign: "center" as const, + display: "inline-block", + padding: "12px 24px", +}; + +const footer = { + fontSize: "12px", + color: "#999999", + textAlign: "center" as const, + margin: "0", + padding: "0", +}; + +export default OptOutCheckoutEmail; diff --git a/packages/convex/http.ts b/packages/convex/http.ts index cbfddc2..13d7f1d 100644 --- a/packages/convex/http.ts +++ b/packages/convex/http.ts @@ -14,6 +14,7 @@ polar.registerRoutes(http, { event.data.customer?.externalId ?? (metadataUserId ? String(metadataUserId) : undefined); const customerId = event.data.customer?.id; + const productId = event.data.productId; if (!userId) { console.warn( @@ -23,9 +24,23 @@ polar.registerRoutes(http, { } console.log( - `[Polar Webhook] Subscription created for user ${userId}, customer ${customerId}`, + `[Polar Webhook] Subscription created for user ${userId}, customer ${customerId}, product ${productId}`, ); + if (productId === polar.products.optOut) { + await ctx.runMutation(internal.users.setOptOutStatus, { + userId: userId as import("./_generated/dataModel").Id<"users">, + optedOut: true, + }); + } + + if (productId === polar.products.emailThreads) { + await ctx.runMutation(internal.users.setPaidEmailThreadsStatus, { + userId: userId as import("./_generated/dataModel").Id<"users">, + paidEmailThreads: true, + }); + } + await ctx.runMutation( internal.payments.scheduleSubscriptionCreatedHandler, { @@ -34,6 +49,38 @@ polar.registerRoutes(http, { }, ); }, + onSubscriptionUpdated: async (ctx, event) => { + const metadataUserId = event.data.customer?.metadata?.userId; + const userId = + event.data.customer?.externalId ?? + (metadataUserId ? String(metadataUserId) : undefined); + if (!userId) { + return; + } + + const productId = event.data.productId; + const endedStatuses = new Set([ + "canceled", + "past_due", + "unpaid", + "revoked", + ]); + const isActive = !endedStatuses.has(event.data.status); + + if (productId === polar.products.optOut) { + await ctx.runMutation(internal.users.setOptOutStatus, { + userId: userId as import("./_generated/dataModel").Id<"users">, + optedOut: isActive, + }); + } + + if (productId === polar.products.emailThreads) { + await ctx.runMutation(internal.users.setPaidEmailThreadsStatus, { + userId: userId as import("./_generated/dataModel").Id<"users">, + paidEmailThreads: isActive, + }); + } + }, }); http.route({ diff --git a/packages/convex/notes.ts b/packages/convex/notes.ts index 0fe6ada..f239fba 100644 --- a/packages/convex/notes.ts +++ b/packages/convex/notes.ts @@ -44,6 +44,16 @@ export const sendNoteEmail = action({ return { success: false, reason: "no_email_configured" }; } + const access = await ctx.runAction( + internal.emailEntitlementsNode.preflightOutboundEmail, + { + userId: user._id, + }, + ); + if (!access.allowed) { + return { success: false, reason: access.reason ?? "email_limit_reached" }; + } + const sessionDate = new Date().toLocaleDateString("en-US", { weekday: "long", year: "numeric", @@ -93,6 +103,15 @@ export const sendNoteEmail = action({ textContent, }); + if (access.trackUsage) { + await ctx.runMutation( + internal.emailEntitlements.incrementOutboundUsage, + { + userId: user._id, + }, + ); + } + console.log( `[Notes] Email queued successfully to ${user.email} (noteId: ${emailNoteId}, resendId: ${resendEmailId})`, ); diff --git a/packages/convex/optOut.ts b/packages/convex/optOut.ts new file mode 100644 index 0000000..38505de --- /dev/null +++ b/packages/convex/optOut.ts @@ -0,0 +1,52 @@ +"use node"; + +import { render } from "@react-email/render"; +import { v } from "convex/values"; +import { api, internal } from "./_generated/api"; +import { action } from "./_generated/server"; +import { OptOutCheckoutEmail } from "./emails/OptOutCheckout"; +import { resend } from "./resendClient"; + +const EMAIL_DOMAIN = process.env.EMAIL_DOMAIN || "notes.example.com"; + +export const requestOptOutCheckoutEmail = action({ + args: { mentraUserId: v.string() }, + handler: async (ctx, args) => { + const user = await ctx.runQuery(api.users.getByMentraId, { + mentraUserId: args.mentraUserId, + }); + + if (!user) { + return { success: false as const, reason: "user_not_found" }; + } + + if (!user.email) { + return { success: false as const, reason: "no_email_configured" }; + } + + if (user.optedOutOfTraining) { + return { success: true as const, alreadyOptedOut: true }; + } + + const checkout = await ctx.runAction( + internal.payments.createFeatureCheckoutLinkInternal, + { + userId: user._id, + feature: "optOut", + }, + ); + + const html = await render( + OptOutCheckoutEmail({ checkoutUrl: checkout.url }), + ); + + await resend.sendEmail(ctx, { + from: `Clairvoyant `, + to: user.email, + subject: "Complete your paid opt-out setup", + html, + }); + + return { success: true as const, alreadyOptedOut: false }; + }, +}); diff --git a/packages/convex/package.json b/packages/convex/package.json index c9dd274..dcc8a44 100644 --- a/packages/convex/package.json +++ b/packages/convex/package.json @@ -17,14 +17,14 @@ "@convex-dev/resend": "^0.2.3", "@honcho-ai/sdk": "^1.6.0", "@polar-sh/sdk": "^0.41.5", - "@react-email/components": "^1.0.7", + "@react-email/components": "^1.0.8", "@react-email/render": "^2.0.4", - "convex": "^1.31.7", + "convex": "^1.32.0", "groq-sdk": "^0.18.0", "react": "^19.2.4", "react-dom": "^19.2.4", "react-email": "^5.2.8", - "svix": "^1.84.1", + "svix": "^1.86.0", "zod": "^3.25.76" }, "devDependencies": { diff --git a/packages/convex/payments.ts b/packages/convex/payments.ts index bfb939a..7a2e454 100644 --- a/packages/convex/payments.ts +++ b/packages/convex/payments.ts @@ -10,6 +10,12 @@ import { query, } from "./_generated/server"; +const DEFAULT_SETTINGS_URL = process.env.WEB_APP_URL + ? `${process.env.WEB_APP_URL.replace(/\/$/, "")}/settings` + : "https://clairvoyant.app/settings"; + +type PaidFeatureProduct = "optOut" | "emailThreads"; + // ============================================================================= // Polar Types (inferred from polar.listProducts return type) // ============================================================================= @@ -69,6 +75,10 @@ export type PolarProduct = { // ============================================================================= export const polar = new Polar(components.polar, { + products: { + optOut: process.env.POLAR_OPT_OUT_PRODUCT_ID ?? "", + emailThreads: process.env.POLAR_EMAIL_THREADS_PRODUCT_ID ?? "", + }, getUserInfo: async (ctx): Promise<{ userId: Id<"users">; email: string }> => { const user = await ctx.runQuery(api.users.getCurrentUser); return { @@ -190,6 +200,32 @@ export const getCustomerInfo = action({ }, }); +export const createFeatureCheckoutLink = action({ + args: { + mentraUserId: v.string(), + feature: v.union(v.literal("optOut"), v.literal("emailThreads")), + successUrl: v.optional(v.string()), + }, + handler: async (ctx, args): Promise<{ url: string }> => { + const user = await ctx.runQuery(api.users.getByMentraId, { + mentraUserId: args.mentraUserId, + }); + + if (!user) { + throw new Error("User not found"); + } + + return await ctx.runAction( + internal.payments.createFeatureCheckoutLinkInternal, + { + userId: user._id, + feature: args.feature, + successUrl: args.successUrl, + }, + ); + }, +}); + // ============================================================================= // Internal Mutations // ============================================================================= @@ -312,3 +348,60 @@ export const handleSubscriptionCreated = internalAction({ } }, }); + +export const createFeatureCheckoutLinkInternal = internalAction({ + args: { + userId: v.id("users"), + feature: v.union(v.literal("optOut"), v.literal("emailThreads")), + successUrl: v.optional(v.string()), + }, + handler: async (ctx, args): Promise<{ url: string }> => { + const user = await ctx.runQuery(internal.users.getByIdInternal, { + userId: args.userId, + }); + if (!user) { + throw new Error("User not found"); + } + + const accessToken = + process.env.POLAR_ACCESS_TOKEN ?? process.env.POLAR_ORGANIZATION_TOKEN; + if (!accessToken) { + throw new Error( + "POLAR_ACCESS_TOKEN or POLAR_ORGANIZATION_TOKEN environment variable is not set", + ); + } + + const productId = getFeatureProductId(args.feature); + if (!productId) { + throw new Error( + `Polar product is not configured for feature: ${args.feature}`, + ); + } + + const polarSDK = new PolarSDK({ + accessToken, + server: process.env.POLAR_SERVER as "production" | "sandbox" | undefined, + }); + + const checkout = await polarSDK.checkouts.create({ + products: [productId], + externalCustomerId: user._id, + customerEmail: user.email, + successUrl: args.successUrl ?? DEFAULT_SETTINGS_URL, + metadata: { + userId: user._id, + feature: args.feature, + }, + }); + + return { url: checkout.url }; + }, +}); + +function getFeatureProductId(feature: PaidFeatureProduct): string { + if (feature === "optOut") { + return polar.products.optOut; + } + + return polar.products.emailThreads; +} diff --git a/packages/convex/schema.ts b/packages/convex/schema.ts index 3740084..f92f9db 100644 --- a/packages/convex/schema.ts +++ b/packages/convex/schema.ts @@ -6,6 +6,8 @@ export default defineSchema({ mentraUserId: v.string(), mentraToken: v.optional(v.string()), email: v.optional(v.string()), + optedOutOfTraining: v.optional(v.boolean()), + paidEmailThreads: v.optional(v.boolean()), billingName: v.optional(v.string()), billingAddress: v.optional( v.object({ @@ -91,6 +93,14 @@ export default defineSchema({ }) .index("by_email_note", ["emailNoteId"]) .index("by_resend_email_id", ["resendEmailId"]), + emailThreadUsage: defineTable({ + userId: v.id("users"), + periodKey: v.string(), + outboundCount: v.number(), + paywallEmailSentAt: v.optional(v.string()), + }) + .index("by_user", ["userId"]) + .index("by_user_period", ["userId", "periodKey"]), chatMessages: defineTable({ userId: v.id("users"), dailySummaryId: v.optional(v.id("dailySummaries")), diff --git a/packages/convex/tsconfig.json b/packages/convex/tsconfig.json index a84f928..575c600 100644 --- a/packages/convex/tsconfig.json +++ b/packages/convex/tsconfig.json @@ -10,6 +10,7 @@ "moduleResolution": "Bundler", "jsx": "react-jsx", "skipLibCheck": true, + "types": [], "allowSyntheticDefaultImports": true, /* These compiler options are required by Convex */ diff --git a/packages/convex/users.ts b/packages/convex/users.ts index 6c0b25b..880ac6d 100644 --- a/packages/convex/users.ts +++ b/packages/convex/users.ts @@ -96,6 +96,26 @@ export const getEmail = query({ }, }); +export const getOptOutStatus = query({ + args: { mentraUserId: v.string() }, + handler: async (ctx, args) => { + const user = await getByMentraIdInternal(ctx, args.mentraUserId); + return { + optedOut: user?.optedOutOfTraining ?? false, + }; + }, +}); + +export const getEmailThreadsPaidStatus = query({ + args: { mentraUserId: v.string() }, + handler: async (ctx, args) => { + const user = await getByMentraIdInternal(ctx, args.mentraUserId); + return { + paidEmailThreads: user?.paidEmailThreads ?? false, + }; + }, +}); + // ============================================================================= // Public Queries - Preferences // ============================================================================= @@ -164,9 +184,11 @@ export const getOrCreate = mutation({ if (existing) { return existing._id; } + const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(args.mentraUserId); const userId = await ctx.db.insert("users", { mentraUserId: args.mentraUserId, mentraToken: args.mentraToken, + ...(isEmail ? { email: args.mentraUserId } : {}), }); await ctx.db.insert("preferences", { @@ -405,3 +427,44 @@ export const updateDefaultLocation = internalMutation({ }); }, }); + +export const setOptOutStatus = internalMutation({ + args: { + userId: v.id("users"), + optedOut: v.boolean(), + }, + handler: async (ctx, args) => { + await ctx.db.patch(args.userId, { + optedOutOfTraining: args.optedOut, + }); + return { success: true }; + }, +}); + +export const backfillEmailsFromMentraId = internalMutation({ + handler: async (ctx) => { + const users = await ctx.db.query("users").collect(); + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + let updated = 0; + for (const user of users) { + if (!user.email && emailRegex.test(user.mentraUserId)) { + await ctx.db.patch(user._id, { email: user.mentraUserId }); + updated++; + } + } + return { updated, total: users.length }; + }, +}); + +export const setPaidEmailThreadsStatus = internalMutation({ + args: { + userId: v.id("users"), + paidEmailThreads: v.boolean(), + }, + handler: async (ctx, args) => { + await ctx.db.patch(args.userId, { + paidEmailThreads: args.paidEmailThreads, + }); + return { success: true }; + }, +});