a tool for shared writing and social publishing

Compare changes

Choose any two refs to compare.

+1369 -812
-9
.claude/settings.local.json
··· 1 - { 2 - "permissions": { 3 - "allow": [ 4 - "mcp__acp__Edit", 5 - "mcp__acp__Write", 6 - "mcp__acp__Bash" 7 - ] 8 - } 9 - }
···
+298
.claude/skills/lexicons.md
···
··· 1 + # Lexicon System 2 + 3 + ## Overview 4 + 5 + Lexicons define the schema for AT Protocol records. This project has two namespaces: 6 + - **`pub.leaflet.*`** - Leaflet-specific lexicons (documents, publications, blocks, etc.) 7 + - **`site.standard.*`** - Standard site lexicons for interoperability 8 + 9 + The lexicons are defined as TypeScript in `lexicons/src/`, built to JSON in `lexicons/pub/leaflet/` and `lexicons/site/standard/`, and TypeScript types are generated in `lexicons/api/`. 10 + 11 + ## Key Files 12 + 13 + - **`lexicons/src/*.ts`** - Source definitions for `pub.leaflet.*` lexicons 14 + - **`lexicons/site/standard/**/*.json`** - JSON definitions for `site.standard.*` lexicons (manually maintained) 15 + - **`lexicons/build.ts`** - Builds TypeScript sources to JSON 16 + - **`lexicons/api/`** - Generated TypeScript types and client 17 + - **`package.json`** - Contains `lexgen` script 18 + 19 + ## Running Lexicon Generation 20 + 21 + ```bash 22 + npm run lexgen 23 + ``` 24 + 25 + This runs: 26 + 1. `tsx ./lexicons/build.ts` - Builds `pub.leaflet.*` JSON from TypeScript 27 + 2. `lex gen-api` - Generates TypeScript types from all JSON lexicons 28 + 3. `tsx ./lexicons/fix-extensions.ts` - Fixes import extensions 29 + 30 + ## Adding a New pub.leaflet Lexicon 31 + 32 + ### 1. Create the Source Definition 33 + 34 + Create a file in `lexicons/src/` (e.g., `lexicons/src/myLexicon.ts`): 35 + 36 + ```typescript 37 + import { LexiconDoc } from "@atproto/lexicon"; 38 + 39 + export const PubLeafletMyLexicon: LexiconDoc = { 40 + lexicon: 1, 41 + id: "pub.leaflet.myLexicon", 42 + defs: { 43 + main: { 44 + type: "record", // or "object" for non-record types 45 + key: "tid", 46 + record: { 47 + type: "object", 48 + required: ["field1"], 49 + properties: { 50 + field1: { type: "string", maxLength: 1000 }, 51 + field2: { type: "integer", minimum: 0 }, 52 + optionalRef: { type: "ref", ref: "other.lexicon#def" }, 53 + }, 54 + }, 55 + }, 56 + // Additional defs for sub-objects 57 + subType: { 58 + type: "object", 59 + properties: { 60 + nested: { type: "string" }, 61 + }, 62 + }, 63 + }, 64 + }; 65 + ``` 66 + 67 + ### 2. Add to Build 68 + 69 + Update `lexicons/build.ts`: 70 + 71 + ```typescript 72 + import { PubLeafletMyLexicon } from "./src/myLexicon"; 73 + 74 + const lexicons = [ 75 + // ... existing lexicons 76 + PubLeafletMyLexicon, 77 + ]; 78 + ``` 79 + 80 + ### 3. Update lexgen Command (if needed) 81 + 82 + If your lexicon is at the top level of `pub/leaflet/` (not in a subdirectory), add it to the `lexgen` script in `package.json`: 83 + 84 + ```json 85 + "lexgen": "tsx ./lexicons/build.ts && lex gen-api ./lexicons/api ./lexicons/pub/leaflet/document.json ./lexicons/pub/leaflet/myLexicon.json ./lexicons/pub/leaflet/*/* ..." 86 + ``` 87 + 88 + Note: Files in subdirectories (`pub/leaflet/*/*`) are automatically included. 89 + 90 + ### 4. Add to authFullPermissions (for record types) 91 + 92 + If your lexicon is a record type that users should be able to create/update/delete, add it to the `authFullPermissions` permission set in `lexicons/src/authFullPermissions.ts`: 93 + 94 + ```typescript 95 + import { PubLeafletMyLexicon } from "./myLexicon"; 96 + 97 + // In the permissions collection array: 98 + collection: [ 99 + // ... existing lexicons 100 + PubLeafletMyLexicon.id, 101 + ], 102 + ``` 103 + 104 + ### 5. Regenerate Types 105 + 106 + ```bash 107 + npm run lexgen 108 + ``` 109 + 110 + ### 6. Use the Generated Types 111 + 112 + ```typescript 113 + import { PubLeafletMyLexicon } from "lexicons/api"; 114 + 115 + // Type for the record 116 + type MyRecord = PubLeafletMyLexicon.Record; 117 + 118 + // Validation 119 + const result = PubLeafletMyLexicon.validateRecord(data); 120 + if (result.success) { 121 + // result.value is typed 122 + } 123 + 124 + // Type guard 125 + if (PubLeafletMyLexicon.isRecord(data)) { 126 + // data is typed as Record 127 + } 128 + ``` 129 + 130 + ## Adding a New site.standard Lexicon 131 + 132 + ### 1. Create the JSON Definition 133 + 134 + Create a file in `lexicons/site/standard/` (e.g., `lexicons/site/standard/myType.json`): 135 + 136 + ```json 137 + { 138 + "lexicon": 1, 139 + "id": "site.standard.myType", 140 + "defs": { 141 + "main": { 142 + "type": "record", 143 + "key": "tid", 144 + "record": { 145 + "type": "object", 146 + "required": ["field1"], 147 + "properties": { 148 + "field1": { 149 + "type": "string", 150 + "maxLength": 1000 151 + } 152 + } 153 + } 154 + } 155 + } 156 + } 157 + ``` 158 + 159 + ### 2. Regenerate Types 160 + 161 + ```bash 162 + npm run lexgen 163 + ``` 164 + 165 + The `site/*/* site/*/*/*` globs in the lexgen command automatically pick up new files. 166 + 167 + ## Common Lexicon Patterns 168 + 169 + ### Referencing Other Lexicons 170 + 171 + ```typescript 172 + // Reference another lexicon's main def 173 + { type: "ref", ref: "pub.leaflet.publication" } 174 + 175 + // Reference a specific def within a lexicon 176 + { type: "ref", ref: "pub.leaflet.publication#theme" } 177 + 178 + // Reference within the same lexicon 179 + { type: "ref", ref: "#myDef" } 180 + ``` 181 + 182 + ### Union Types 183 + 184 + ```typescript 185 + { 186 + type: "union", 187 + refs: [ 188 + "pub.leaflet.pages.linearDocument", 189 + "pub.leaflet.pages.canvas", 190 + ], 191 + } 192 + 193 + // Open union (allows unknown types) 194 + { 195 + type: "union", 196 + closed: false, // default is true 197 + refs: ["pub.leaflet.content"], 198 + } 199 + ``` 200 + 201 + ### Blob Types (for images/files) 202 + 203 + ```typescript 204 + { 205 + type: "blob", 206 + accept: ["image/*"], // or specific types like ["image/png", "image/jpeg"] 207 + maxSize: 1000000, // bytes 208 + } 209 + ``` 210 + 211 + ### Color Types 212 + 213 + The project has color types defined: 214 + - `pub.leaflet.theme.color#rgb` / `#rgba` 215 + - `site.standard.theme.color#rgb` / `#rgba` 216 + 217 + ```typescript 218 + // In lexicons/src/theme.ts 219 + export const ColorUnion = { 220 + type: "union", 221 + refs: [ 222 + "pub.leaflet.theme.color#rgba", 223 + "pub.leaflet.theme.color#rgb", 224 + ], 225 + }; 226 + ``` 227 + 228 + ## Normalization Between Formats 229 + 230 + Use `lexicons/src/normalize.ts` to convert between `pub.leaflet` and `site.standard` formats: 231 + 232 + ```typescript 233 + import { 234 + normalizeDocument, 235 + normalizePublication, 236 + isLeafletDocument, 237 + isStandardDocument, 238 + getDocumentPages, 239 + } from "lexicons/src/normalize"; 240 + 241 + // Normalize a document from either format 242 + const normalized = normalizeDocument(record); 243 + if (normalized) { 244 + // normalized is always in site.standard.document format 245 + console.log(normalized.title, normalized.site); 246 + 247 + // Get pages if content is pub.leaflet.content 248 + const pages = getDocumentPages(normalized); 249 + } 250 + 251 + // Normalize a publication 252 + const pub = normalizePublication(record); 253 + if (pub) { 254 + console.log(pub.name, pub.url); 255 + } 256 + ``` 257 + 258 + ## Handling in Appview (Firehose Consumer) 259 + 260 + When processing records from the firehose in `appview/index.ts`: 261 + 262 + ```typescript 263 + import { ids } from "lexicons/api/lexicons"; 264 + import { PubLeafletMyLexicon } from "lexicons/api"; 265 + 266 + // In filterCollections: 267 + filterCollections: [ 268 + ids.PubLeafletMyLexicon, 269 + // ... 270 + ], 271 + 272 + // In handleEvent: 273 + if (evt.collection === ids.PubLeafletMyLexicon) { 274 + if (evt.event === "create" || evt.event === "update") { 275 + let record = PubLeafletMyLexicon.validateRecord(evt.record); 276 + if (!record.success) return; 277 + 278 + // Store in database 279 + await supabase.from("my_table").upsert({ 280 + uri: evt.uri.toString(), 281 + data: record.value as Json, 282 + }); 283 + } 284 + if (evt.event === "delete") { 285 + await supabase.from("my_table").delete().eq("uri", evt.uri.toString()); 286 + } 287 + } 288 + ``` 289 + 290 + ## Publishing Lexicons 291 + 292 + To publish lexicons to an AT Protocol PDS: 293 + 294 + ```bash 295 + npm run publish-lexicons 296 + ``` 297 + 298 + This runs `lexicons/publish.ts` which publishes lexicons to the configured PDS.
+144
.claude/skills/notifications.md
···
··· 1 + # Notification System 2 + 3 + ## Overview 4 + 5 + Notifications are stored in the database and hydrated with related data before being rendered. The system supports multiple notification types (comments, subscriptions, etc.) that are processed in parallel. 6 + 7 + ## Key Files 8 + 9 + - **`src/notifications.ts`** - Core notification types and hydration logic 10 + - **`app/(home-pages)/notifications/NotificationList.tsx`** - Renders all notification types 11 + - **`app/(home-pages)/notifications/Notification.tsx`** - Base notification component 12 + - Individual notification components (e.g., `CommentNotification.tsx`, `FollowNotification.tsx`) 13 + 14 + ## Adding a New Notification Type 15 + 16 + ### 1. Update Notification Data Types (`src/notifications.ts`) 17 + 18 + Add your type to the `NotificationData` union: 19 + 20 + ```typescript 21 + export type NotificationData = 22 + | { type: "comment"; comment_uri: string; parent_uri?: string } 23 + | { type: "subscribe"; subscription_uri: string } 24 + | { type: "your_type"; your_field: string }; // Add here 25 + ``` 26 + 27 + Add to the `HydratedNotification` union: 28 + 29 + ```typescript 30 + export type HydratedNotification = 31 + | HydratedCommentNotification 32 + | HydratedSubscribeNotification 33 + | HydratedYourNotification; // Add here 34 + ``` 35 + 36 + ### 2. Create Hydration Function (`src/notifications.ts`) 37 + 38 + ```typescript 39 + export type HydratedYourNotification = Awaited< 40 + ReturnType<typeof hydrateYourNotifications> 41 + >[0]; 42 + 43 + async function hydrateYourNotifications(notifications: NotificationRow[]) { 44 + const yourNotifications = notifications.filter( 45 + (n): n is NotificationRow & { data: ExtractNotificationType<"your_type"> } => 46 + (n.data as NotificationData)?.type === "your_type", 47 + ); 48 + 49 + if (yourNotifications.length === 0) return []; 50 + 51 + // Fetch related data with joins 52 + const { data } = await supabaseServerClient 53 + .from("your_table") 54 + .select("*, related_table(*)") 55 + .in("uri", yourNotifications.map((n) => n.data.your_field)); 56 + 57 + return yourNotifications.map((notification) => ({ 58 + id: notification.id, 59 + recipient: notification.recipient, 60 + created_at: notification.created_at, 61 + type: "your_type" as const, 62 + your_field: notification.data.your_field, 63 + yourData: data?.find((d) => d.uri === notification.data.your_field)!, 64 + })); 65 + } 66 + ``` 67 + 68 + Add to `hydrateNotifications` parallel array: 69 + 70 + ```typescript 71 + const [commentNotifications, subscribeNotifications, yourNotifications] = await Promise.all([ 72 + hydrateCommentNotifications(notifications), 73 + hydrateSubscribeNotifications(notifications), 74 + hydrateYourNotifications(notifications), // Add here 75 + ]); 76 + 77 + const allHydrated = [...commentNotifications, ...subscribeNotifications, ...yourNotifications]; 78 + ``` 79 + 80 + ### 3. Trigger the Notification (in your action file) 81 + 82 + ```typescript 83 + import { Notification, pingIdentityToUpdateNotification } from "src/notifications"; 84 + import { v7 } from "uuid"; 85 + 86 + // When the event occurs: 87 + const recipient = /* determine who should receive it */; 88 + if (recipient !== currentUser) { 89 + const notification: Notification = { 90 + id: v7(), 91 + recipient, 92 + data: { 93 + type: "your_type", 94 + your_field: "value", 95 + }, 96 + }; 97 + await supabaseServerClient.from("notifications").insert(notification); 98 + await pingIdentityToUpdateNotification(recipient); 99 + } 100 + ``` 101 + 102 + ### 4. Create Notification Component 103 + 104 + Create a new component (e.g., `YourNotification.tsx`): 105 + 106 + ```typescript 107 + import { HydratedYourNotification } from "src/notifications"; 108 + import { Notification } from "./Notification"; 109 + 110 + export const YourNotification = (props: HydratedYourNotification) => { 111 + // Extract data from props.yourData 112 + 113 + return ( 114 + <Notification 115 + timestamp={props.created_at} 116 + href={/* link to relevant page */} 117 + icon={/* icon or avatar */} 118 + actionText={<>Message to display</>} 119 + content={/* optional additional content */} 120 + /> 121 + ); 122 + }; 123 + ``` 124 + 125 + ### 5. Update NotificationList (`NotificationList.tsx`) 126 + 127 + Import and render your notification type: 128 + 129 + ```typescript 130 + import { YourNotification } from "./YourNotification"; 131 + 132 + // In the map function: 133 + if (n.type === "your_type") { 134 + return <YourNotification key={n.id} {...n} />; 135 + } 136 + ``` 137 + 138 + ## Example: Subscribe Notifications 139 + 140 + See the implementation in: 141 + - `src/notifications.ts:88-125` - Hydration logic 142 + - `app/lish/subscribeToPublication.ts:55-68` - Trigger 143 + - `app/(home-pages)/notifications/FollowNotification.tsx` - Component 144 + - `app/(home-pages)/notifications/NotificationList.tsx:40-42` - Rendering
+3
.gitignore
··· 12 .env.local 13 .wrangler 14 tsconfig.tsbuildinfo
··· 12 .env.local 13 .wrangler 14 tsconfig.tsbuildinfo 15 + 16 + # Claude 17 + .claude/settings.local.json
+10
app/api/inngest/client.ts
··· 51 documentUris?: string[]; 52 }; 53 }; 54 }; 55 56 // Create a client to send and receive events
··· 51 documentUris?: string[]; 52 }; 53 }; 54 + "user/write-records-to-pds": { 55 + data: { 56 + did: string; 57 + records: Array<{ 58 + collection: string; 59 + rkey: string; 60 + record: unknown; 61 + }>; 62 + }; 63 + }; 64 }; 65 66 // Create a client to send and receive events
+70
app/api/inngest/functions/write_records_to_pds.ts
···
··· 1 + import { inngest } from "../client"; 2 + import { restoreOAuthSession } from "src/atproto-oauth"; 3 + import { AtpBaseClient } from "lexicons/api"; 4 + 5 + // Batch size to avoid Inngest payload limits and PDS rate limits 6 + const BATCH_SIZE = 50; 7 + 8 + // Helper to create authenticated agent - must be called fresh in each step 9 + // (OAuth sessions cannot be serialized across Inngest steps) 10 + async function createAuthenticatedAgent(did: string): Promise<AtpBaseClient> { 11 + const result = await restoreOAuthSession(did); 12 + if (!result.ok) { 13 + throw new Error(`Failed to restore OAuth session: ${result.error.message}`); 14 + } 15 + return new AtpBaseClient(result.value.fetchHandler.bind(result.value)); 16 + } 17 + 18 + export const write_records_to_pds = inngest.createFunction( 19 + { id: "write-records-to-pds" }, 20 + { event: "user/write-records-to-pds" }, 21 + async ({ event, step }) => { 22 + const { did, records } = event.data; 23 + 24 + // Step 1: Verify OAuth session is valid before proceeding 25 + await step.run("verify-oauth-session", async () => { 26 + const result = await restoreOAuthSession(did); 27 + if (!result.ok) { 28 + throw new Error(`OAuth restore failed: ${result.error.message}`); 29 + } 30 + return { success: true }; 31 + }); 32 + 33 + // Step 2: Write records to PDS in batches 34 + // Split records into batches to avoid payload limits and rate limiting 35 + const batches: typeof records[] = []; 36 + for (let i = 0; i < records.length; i += BATCH_SIZE) { 37 + batches.push(records.slice(i, i + BATCH_SIZE)); 38 + } 39 + 40 + let totalWritten = 0; 41 + for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) { 42 + const batch = batches[batchIndex]; 43 + const batchWritten = await step.run( 44 + `write-batch-${batchIndex}`, 45 + async () => { 46 + const agent = await createAuthenticatedAgent(did); 47 + let written = 0; 48 + for (const rec of batch) { 49 + await agent.com.atproto.repo.putRecord({ 50 + repo: did, 51 + collection: rec.collection, 52 + rkey: rec.rkey, 53 + record: rec.record as Record<string, unknown>, 54 + validate: false, 55 + }); 56 + written++; 57 + } 58 + return written; 59 + }, 60 + ); 61 + totalWritten += batchWritten; 62 + } 63 + 64 + return { 65 + success: true, 66 + recordsWritten: totalWritten, 67 + batchCount: batches.length, 68 + }; 69 + }, 70 + );
+2
app/api/inngest/route.tsx
··· 12 cleanup_expired_oauth_sessions, 13 check_oauth_session, 14 } from "./functions/cleanup_expired_oauth_sessions"; 15 16 export const { GET, POST, PUT } = serve({ 17 client: inngest, ··· 26 fix_standard_document_postref, 27 cleanup_expired_oauth_sessions, 28 check_oauth_session, 29 ], 30 });
··· 12 cleanup_expired_oauth_sessions, 13 check_oauth_session, 14 } from "./functions/cleanup_expired_oauth_sessions"; 15 + import { write_records_to_pds } from "./functions/write_records_to_pds"; 16 17 export const { GET, POST, PUT } = serve({ 18 client: inngest, ··· 27 fix_standard_document_postref, 28 cleanup_expired_oauth_sessions, 29 check_oauth_session, 30 + write_records_to_pds, 31 ], 32 });
+1 -1
app/lish/[did]/[publication]/[rkey]/BskyPostContent.tsx
··· 114 {showBlueskyLink && ( 115 <> 116 <a 117 - className="text-tertiary hover:text-accent-contrast" 118 target="_blank" 119 href={url} 120 >
··· 114 {showBlueskyLink && ( 115 <> 116 <a 117 + className="text-tertiary relative hover:text-accent-contrast" 118 target="_blank" 119 href={url} 120 >
+1 -1
app/lish/[did]/[publication]/[rkey]/QuoteHandler.tsx
··· 172 <div className="">Share via</div> 173 174 <a 175 - className="flex gap-1 items-center hover:font-bold px-1 hover:no-underline!" 176 role="link" 177 href={`https://bsky.app/intent/compose?text=${encodeURIComponent(url)}`} 178 target="_blank"
··· 172 <div className="">Share via</div> 173 174 <a 175 + className="flex relative gap-1 items-center hover:font-bold px-1 hover:no-underline!" 176 role="link" 177 href={`https://bsky.app/intent/compose?text=${encodeURIComponent(url)}`} 178 target="_blank"
+24
appview/index.ts
··· 11 PubLeafletComment, 12 PubLeafletPollVote, 13 PubLeafletPollDefinition, 14 SiteStandardDocument, 15 SiteStandardPublication, 16 SiteStandardGraphSubscription, ··· 48 ids.PubLeafletComment, 49 ids.PubLeafletPollVote, 50 ids.PubLeafletPollDefinition, 51 // ids.AppBskyActorProfile, 52 "app.bsky.feed.post", 53 ids.SiteStandardDocument, ··· 206 if (evt.event === "delete") { 207 await supabase 208 .from("atp_poll_records") 209 .delete() 210 .eq("uri", evt.uri.toString()); 211 }
··· 11 PubLeafletComment, 12 PubLeafletPollVote, 13 PubLeafletPollDefinition, 14 + PubLeafletInteractionsRecommend, 15 SiteStandardDocument, 16 SiteStandardPublication, 17 SiteStandardGraphSubscription, ··· 49 ids.PubLeafletComment, 50 ids.PubLeafletPollVote, 51 ids.PubLeafletPollDefinition, 52 + ids.PubLeafletInteractionsRecommend, 53 // ids.AppBskyActorProfile, 54 "app.bsky.feed.post", 55 ids.SiteStandardDocument, ··· 208 if (evt.event === "delete") { 209 await supabase 210 .from("atp_poll_records") 211 + .delete() 212 + .eq("uri", evt.uri.toString()); 213 + } 214 + } 215 + if (evt.collection === ids.PubLeafletInteractionsRecommend) { 216 + if (evt.event === "create" || evt.event === "update") { 217 + let record = PubLeafletInteractionsRecommend.validateRecord(evt.record); 218 + if (!record.success) return; 219 + await supabase 220 + .from("identities") 221 + .upsert({ atp_did: evt.did }, { onConflict: "atp_did" }); 222 + let { error } = await supabase.from("recommends_on_documents").upsert({ 223 + uri: evt.uri.toString(), 224 + recommender_did: evt.did, 225 + document: record.value.subject, 226 + record: record.value as Json, 227 + }); 228 + if (error) console.log("Error upserting recommend:", error); 229 + } 230 + if (evt.event === "delete") { 231 + await supabase 232 + .from("recommends_on_documents") 233 .delete() 234 .eq("uri", evt.uri.toString()); 235 }
+22 -10
components/ActionBar/Publications.tsx
··· 62 </> 63 )} 64 65 - {identity.publications?.map((d) => { 66 - return ( 67 - <PublicationOption 68 - {...d} 69 - key={d.uri} 70 - record={d.record} 71 - current={d.uri === props.currentPubUri} 72 - /> 73 - ); 74 - })} 75 <Link 76 href={"/lish/createPub"} 77 className="pubListCreateNew text-accent-contrast text-sm place-self-end hover:text-accent-contrast"
··· 62 </> 63 )} 64 65 + {identity.publications 66 + ?.filter((p) => { 67 + let record = p.record as any; 68 + if (record.preferences?.greengale) return false; 69 + if ( 70 + record.theme && 71 + record.theme.$type && 72 + record.theme.$type !== "pub.leaflet.publication#theme" 73 + ) 74 + return false; 75 + return true; 76 + }) 77 + .map((d) => { 78 + return ( 79 + <PublicationOption 80 + {...d} 81 + key={d.uri} 82 + record={d.record} 83 + current={d.uri === props.currentPubUri} 84 + /> 85 + ); 86 + })} 87 <Link 88 href={"/lish/createPub"} 89 className="pubListCreateNew text-accent-contrast text-sm place-self-end hover:text-accent-contrast"
+1 -1
components/Blocks/useBlockKeyboardHandlers.ts
··· 70 areYouSure, 71 setAreYouSure, 72 }); 73 - undoManager.endGroup(); 74 }; 75 window.addEventListener("keydown", listener); 76 return () => window.removeEventListener("keydown", listener);
··· 70 areYouSure, 71 setAreYouSure, 72 }); 73 + setTimeout(() => undoManager.endGroup(), 100); 74 }; 75 window.addEventListener("keydown", listener); 76 return () => window.removeEventListener("keydown", listener);
+1 -1
components/ProfilePopover.tsx
··· 33 className="max-w-sm p-0! text-center" 34 trigger={ 35 <div 36 - className="no-underline" 37 onPointerEnter={(e) => { 38 if (hoverTimeout.current) { 39 window.clearTimeout(hoverTimeout.current);
··· 33 className="max-w-sm p-0! text-center" 34 trigger={ 35 <div 36 + className="no-underline relative" 37 onPointerEnter={(e) => { 38 if (hoverTimeout.current) { 39 window.clearTimeout(hoverTimeout.current);
+97
lexicons/api/index.ts
··· 41 import * as PubLeafletContent from './types/pub/leaflet/content' 42 import * as PubLeafletDocument from './types/pub/leaflet/document' 43 import * as PubLeafletGraphSubscription from './types/pub/leaflet/graph/subscription' 44 import * as PubLeafletPagesCanvas from './types/pub/leaflet/pages/canvas' 45 import * as PubLeafletPagesLinearDocument from './types/pub/leaflet/pages/linearDocument' 46 import * as PubLeafletPollDefinition from './types/pub/leaflet/poll/definition' ··· 87 export * as PubLeafletContent from './types/pub/leaflet/content' 88 export * as PubLeafletDocument from './types/pub/leaflet/document' 89 export * as PubLeafletGraphSubscription from './types/pub/leaflet/graph/subscription' 90 export * as PubLeafletPagesCanvas from './types/pub/leaflet/pages/canvas' 91 export * as PubLeafletPagesLinearDocument from './types/pub/leaflet/pages/linearDocument' 92 export * as PubLeafletPollDefinition from './types/pub/leaflet/poll/definition' ··· 408 publication: PubLeafletPublicationRecord 409 blocks: PubLeafletBlocksNS 410 graph: PubLeafletGraphNS 411 pages: PubLeafletPagesNS 412 poll: PubLeafletPollNS 413 richtext: PubLeafletRichtextNS ··· 417 this._client = client 418 this.blocks = new PubLeafletBlocksNS(client) 419 this.graph = new PubLeafletGraphNS(client) 420 this.pages = new PubLeafletPagesNS(client) 421 this.poll = new PubLeafletPollNS(client) 422 this.richtext = new PubLeafletRichtextNS(client) ··· 523 'com.atproto.repo.deleteRecord', 524 undefined, 525 { collection: 'pub.leaflet.graph.subscription', ...params }, 526 { headers }, 527 ) 528 }
··· 41 import * as PubLeafletContent from './types/pub/leaflet/content' 42 import * as PubLeafletDocument from './types/pub/leaflet/document' 43 import * as PubLeafletGraphSubscription from './types/pub/leaflet/graph/subscription' 44 + import * as PubLeafletInteractionsRecommend from './types/pub/leaflet/interactions/recommend' 45 import * as PubLeafletPagesCanvas from './types/pub/leaflet/pages/canvas' 46 import * as PubLeafletPagesLinearDocument from './types/pub/leaflet/pages/linearDocument' 47 import * as PubLeafletPollDefinition from './types/pub/leaflet/poll/definition' ··· 88 export * as PubLeafletContent from './types/pub/leaflet/content' 89 export * as PubLeafletDocument from './types/pub/leaflet/document' 90 export * as PubLeafletGraphSubscription from './types/pub/leaflet/graph/subscription' 91 + export * as PubLeafletInteractionsRecommend from './types/pub/leaflet/interactions/recommend' 92 export * as PubLeafletPagesCanvas from './types/pub/leaflet/pages/canvas' 93 export * as PubLeafletPagesLinearDocument from './types/pub/leaflet/pages/linearDocument' 94 export * as PubLeafletPollDefinition from './types/pub/leaflet/poll/definition' ··· 410 publication: PubLeafletPublicationRecord 411 blocks: PubLeafletBlocksNS 412 graph: PubLeafletGraphNS 413 + interactions: PubLeafletInteractionsNS 414 pages: PubLeafletPagesNS 415 poll: PubLeafletPollNS 416 richtext: PubLeafletRichtextNS ··· 420 this._client = client 421 this.blocks = new PubLeafletBlocksNS(client) 422 this.graph = new PubLeafletGraphNS(client) 423 + this.interactions = new PubLeafletInteractionsNS(client) 424 this.pages = new PubLeafletPagesNS(client) 425 this.poll = new PubLeafletPollNS(client) 426 this.richtext = new PubLeafletRichtextNS(client) ··· 527 'com.atproto.repo.deleteRecord', 528 undefined, 529 { collection: 'pub.leaflet.graph.subscription', ...params }, 530 + { headers }, 531 + ) 532 + } 533 + } 534 + 535 + export class PubLeafletInteractionsNS { 536 + _client: XrpcClient 537 + recommend: PubLeafletInteractionsRecommendRecord 538 + 539 + constructor(client: XrpcClient) { 540 + this._client = client 541 + this.recommend = new PubLeafletInteractionsRecommendRecord(client) 542 + } 543 + } 544 + 545 + export class PubLeafletInteractionsRecommendRecord { 546 + _client: XrpcClient 547 + 548 + constructor(client: XrpcClient) { 549 + this._client = client 550 + } 551 + 552 + async list( 553 + params: OmitKey<ComAtprotoRepoListRecords.QueryParams, 'collection'>, 554 + ): Promise<{ 555 + cursor?: string 556 + records: { uri: string; value: PubLeafletInteractionsRecommend.Record }[] 557 + }> { 558 + const res = await this._client.call('com.atproto.repo.listRecords', { 559 + collection: 'pub.leaflet.interactions.recommend', 560 + ...params, 561 + }) 562 + return res.data 563 + } 564 + 565 + async get( 566 + params: OmitKey<ComAtprotoRepoGetRecord.QueryParams, 'collection'>, 567 + ): Promise<{ 568 + uri: string 569 + cid: string 570 + value: PubLeafletInteractionsRecommend.Record 571 + }> { 572 + const res = await this._client.call('com.atproto.repo.getRecord', { 573 + collection: 'pub.leaflet.interactions.recommend', 574 + ...params, 575 + }) 576 + return res.data 577 + } 578 + 579 + async create( 580 + params: OmitKey< 581 + ComAtprotoRepoCreateRecord.InputSchema, 582 + 'collection' | 'record' 583 + >, 584 + record: Un$Typed<PubLeafletInteractionsRecommend.Record>, 585 + headers?: Record<string, string>, 586 + ): Promise<{ uri: string; cid: string }> { 587 + const collection = 'pub.leaflet.interactions.recommend' 588 + const res = await this._client.call( 589 + 'com.atproto.repo.createRecord', 590 + undefined, 591 + { collection, ...params, record: { ...record, $type: collection } }, 592 + { encoding: 'application/json', headers }, 593 + ) 594 + return res.data 595 + } 596 + 597 + async put( 598 + params: OmitKey< 599 + ComAtprotoRepoPutRecord.InputSchema, 600 + 'collection' | 'record' 601 + >, 602 + record: Un$Typed<PubLeafletInteractionsRecommend.Record>, 603 + headers?: Record<string, string>, 604 + ): Promise<{ uri: string; cid: string }> { 605 + const collection = 'pub.leaflet.interactions.recommend' 606 + const res = await this._client.call( 607 + 'com.atproto.repo.putRecord', 608 + undefined, 609 + { collection, ...params, record: { ...record, $type: collection } }, 610 + { encoding: 'application/json', headers }, 611 + ) 612 + return res.data 613 + } 614 + 615 + async delete( 616 + params: OmitKey<ComAtprotoRepoDeleteRecord.InputSchema, 'collection'>, 617 + headers?: Record<string, string>, 618 + ): Promise<void> { 619 + await this._client.call( 620 + 'com.atproto.repo.deleteRecord', 621 + undefined, 622 + { collection: 'pub.leaflet.interactions.recommend', ...params }, 623 { headers }, 624 ) 625 }
+26
lexicons/api/lexicons.ts
··· 1517 }, 1518 }, 1519 }, 1520 PubLeafletPagesCanvas: { 1521 lexicon: 1, 1522 id: 'pub.leaflet.pages.canvas', ··· 2418 PubLeafletContent: 'pub.leaflet.content', 2419 PubLeafletDocument: 'pub.leaflet.document', 2420 PubLeafletGraphSubscription: 'pub.leaflet.graph.subscription', 2421 PubLeafletPagesCanvas: 'pub.leaflet.pages.canvas', 2422 PubLeafletPagesLinearDocument: 'pub.leaflet.pages.linearDocument', 2423 PubLeafletPollDefinition: 'pub.leaflet.poll.definition',
··· 1517 }, 1518 }, 1519 }, 1520 + PubLeafletInteractionsRecommend: { 1521 + lexicon: 1, 1522 + id: 'pub.leaflet.interactions.recommend', 1523 + defs: { 1524 + main: { 1525 + type: 'record', 1526 + key: 'tid', 1527 + description: 'Record representing a recommend on a document', 1528 + record: { 1529 + type: 'object', 1530 + required: ['subject', 'createdAt'], 1531 + properties: { 1532 + subject: { 1533 + type: 'string', 1534 + format: 'at-uri', 1535 + }, 1536 + createdAt: { 1537 + type: 'string', 1538 + format: 'datetime', 1539 + }, 1540 + }, 1541 + }, 1542 + }, 1543 + }, 1544 + }, 1545 PubLeafletPagesCanvas: { 1546 lexicon: 1, 1547 id: 'pub.leaflet.pages.canvas', ··· 2443 PubLeafletContent: 'pub.leaflet.content', 2444 PubLeafletDocument: 'pub.leaflet.document', 2445 PubLeafletGraphSubscription: 'pub.leaflet.graph.subscription', 2446 + PubLeafletInteractionsRecommend: 'pub.leaflet.interactions.recommend', 2447 PubLeafletPagesCanvas: 'pub.leaflet.pages.canvas', 2448 PubLeafletPagesLinearDocument: 'pub.leaflet.pages.linearDocument', 2449 PubLeafletPollDefinition: 'pub.leaflet.poll.definition',
+32
lexicons/api/types/pub/leaflet/interactions/recommend.ts
···
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { type ValidationResult, BlobRef } from '@atproto/lexicon' 5 + import { CID } from 'multiformats/cid' 6 + import { validate as _validate } from '../../../../lexicons' 7 + import { 8 + type $Typed, 9 + is$typed as _is$typed, 10 + type OmitKey, 11 + } from '../../../../util' 12 + 13 + const is$typed = _is$typed, 14 + validate = _validate 15 + const id = 'pub.leaflet.interactions.recommend' 16 + 17 + export interface Record { 18 + $type: 'pub.leaflet.interactions.recommend' 19 + subject: string 20 + createdAt: string 21 + [k: string]: unknown 22 + } 23 + 24 + const hashRecord = 'main' 25 + 26 + export function isRecord<V>(v: V) { 27 + return is$typed(v, id, hashRecord) 28 + } 29 + 30 + export function validateRecord<V>(v: V) { 31 + return validate<Record & V>(v, id, hashRecord, true) 32 + }
+2
lexicons/build.ts
··· 3 import { PubLeafletDocument } from "./src/document"; 4 import * as PublicationLexicons from "./src/publication"; 5 import * as PollLexicons from "./src/polls"; 6 import { ThemeLexicons } from "./src/theme"; 7 8 import * as fs from "fs"; ··· 31 ...BlockLexicons, 32 ...Object.values(PublicationLexicons), 33 ...Object.values(PollLexicons), 34 ]; 35 36 // Write each lexicon to a file
··· 3 import { PubLeafletDocument } from "./src/document"; 4 import * as PublicationLexicons from "./src/publication"; 5 import * as PollLexicons from "./src/polls"; 6 + import * as InteractionsLexicons from "./src/interactions"; 7 import { ThemeLexicons } from "./src/theme"; 8 9 import * as fs from "fs"; ··· 32 ...BlockLexicons, 33 ...Object.values(PublicationLexicons), 34 ...Object.values(PollLexicons), 35 + ...Object.values(InteractionsLexicons), 36 ]; 37 38 // Write each lexicon to a file
+2 -1
lexicons/pub/leaflet/authFullPermissions.json
··· 21 "pub.leaflet.comment", 22 "pub.leaflet.poll.definition", 23 "pub.leaflet.poll.vote", 24 - "pub.leaflet.graph.subscription" 25 ] 26 } 27 ]
··· 21 "pub.leaflet.comment", 22 "pub.leaflet.poll.definition", 23 "pub.leaflet.poll.vote", 24 + "pub.leaflet.graph.subscription", 25 + "pub.leaflet.interactions.recommend" 26 ] 27 } 28 ]
+28
lexicons/pub/leaflet/interactions/recommend.json
···
··· 1 + { 2 + "lexicon": 1, 3 + "id": "pub.leaflet.interactions.recommend", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "Record representing a recommend on a document", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "subject", 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "subject": { 17 + "type": "string", 18 + "format": "at-uri" 19 + }, 20 + "createdAt": { 21 + "type": "string", 22 + "format": "datetime" 23 + } 24 + } 25 + } 26 + } 27 + } 28 + }
+2
lexicons/src/authFullPermissions.ts
··· 6 } from "./publication"; 7 import { PubLeafletComment } from "./comment"; 8 import { PubLeafletPollDefinition, PubLeafletPollVote } from "./polls"; 9 10 export const PubLeafletAuthFullPermissions: LexiconDoc = { 11 lexicon: 1, ··· 28 PubLeafletPollDefinition.id, 29 PubLeafletPollVote.id, 30 PubLeafletPublicationSubscription.id, 31 ], 32 }, 33 ],
··· 6 } from "./publication"; 7 import { PubLeafletComment } from "./comment"; 8 import { PubLeafletPollDefinition, PubLeafletPollVote } from "./polls"; 9 + import { PubLeafletInteractionsRecommend } from "./interactions"; 10 11 export const PubLeafletAuthFullPermissions: LexiconDoc = { 12 lexicon: 1, ··· 29 PubLeafletPollDefinition.id, 30 PubLeafletPollVote.id, 31 PubLeafletPublicationSubscription.id, 32 + PubLeafletInteractionsRecommend.id, 33 ], 34 }, 35 ],
+21
lexicons/src/interactions/index.ts
···
··· 1 + import { LexiconDoc } from "@atproto/lexicon"; 2 + 3 + export const PubLeafletInteractionsRecommend: LexiconDoc = { 4 + lexicon: 1, 5 + id: "pub.leaflet.interactions.recommend", 6 + defs: { 7 + main: { 8 + type: "record", 9 + key: "tid", 10 + description: "Record representing a recommend on a document", 11 + record: { 12 + type: "object", 13 + required: ["subject", "createdAt"], 14 + properties: { 15 + subject: { type: "string", format: "at-uri" }, 16 + createdAt: { type: "string", format: "datetime" }, 17 + }, 18 + }, 19 + }, 20 + }, 21 + };
+469 -358
package-lock.json
··· 12 "@atproto/api": "^0.16.9", 13 "@atproto/common": "^0.4.8", 14 "@atproto/identity": "^0.4.6", 15 - "@atproto/lexicon": "^0.5.1", 16 "@atproto/oauth-client-node": "^0.3.8", 17 "@atproto/sync": "^0.1.34", 18 "@atproto/syntax": "^0.3.3", ··· 236 } 237 }, 238 "node_modules/@atproto/api/node_modules/@atproto/syntax": { 239 - "version": "0.4.1", 240 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.1.tgz", 241 - "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==", 242 - "license": "MIT" 243 }, 244 "node_modules/@atproto/api/node_modules/multiformats": { 245 "version": "9.9.0", ··· 265 } 266 }, 267 "node_modules/@atproto/common-web": { 268 - "version": "0.4.10", 269 - "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.10.tgz", 270 - "integrity": "sha512-TLDZSgSKzT8ZgOrBrTGK87J1CXve9TEuY6NVVUBRkOMzRRtQzpFb9/ih5WVS/hnaWVvE30CfuyaetRoma+WKNw==", 271 "license": "MIT", 272 "dependencies": { 273 - "@atproto/lex-data": "0.0.6", 274 - "@atproto/lex-json": "0.0.6", 275 "zod": "^3.23.8" 276 } 277 }, 278 "node_modules/@atproto/common/node_modules/multiformats": { 279 "version": "9.9.0", 280 "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", ··· 464 } 465 }, 466 "node_modules/@atproto/lex-cli/node_modules/@atproto/syntax": { 467 - "version": "0.4.1", 468 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.1.tgz", 469 - "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==", 470 "dev": true, 471 - "license": "MIT" 472 }, 473 "node_modules/@atproto/lex-client": { 474 "version": "0.0.7", ··· 614 "license": "MIT" 615 }, 616 "node_modules/@atproto/lexicon": { 617 - "version": "0.5.1", 618 - "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.5.1.tgz", 619 - "integrity": "sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A==", 620 "license": "MIT", 621 "dependencies": { 622 - "@atproto/common-web": "^0.4.3", 623 - "@atproto/syntax": "^0.4.1", 624 "iso-datestring-validator": "^2.2.2", 625 "multiformats": "^9.9.0", 626 "zod": "^3.23.8" 627 } 628 }, 629 "node_modules/@atproto/lexicon/node_modules/@atproto/syntax": { 630 - "version": "0.4.1", 631 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.1.tgz", 632 - "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==", 633 - "license": "MIT" 634 }, 635 "node_modules/@atproto/lexicon/node_modules/multiformats": { 636 "version": "9.9.0", ··· 715 } 716 }, 717 "node_modules/@atproto/repo/node_modules/@atproto/common": { 718 - "version": "0.5.6", 719 - "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.5.6.tgz", 720 - "integrity": "sha512-rbWoZwHQNP8jcwjCREVecchw8aaoM5A1NCONyb9PVDWOJLRLCzojYMeIS8IbFqXo6NyIByOGddupADkkLeVBGQ==", 721 "license": "MIT", 722 "dependencies": { 723 - "@atproto/common-web": "^0.4.10", 724 - "@atproto/lex-cbor": "0.0.6", 725 - "@atproto/lex-data": "0.0.6", 726 "iso-datestring-validator": "^2.2.2", 727 "multiformats": "^9.9.0", 728 "pino": "^8.21.0" ··· 731 "node": ">=18.7.0" 732 } 733 }, 734 - "node_modules/@atproto/repo/node_modules/@atproto/lexicon": { 735 - "version": "0.6.0", 736 - "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.6.0.tgz", 737 - "integrity": "sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ==", 738 "license": "MIT", 739 "dependencies": { 740 - "@atproto/common-web": "^0.4.7", 741 - "@atproto/syntax": "^0.4.2", 742 - "iso-datestring-validator": "^2.2.2", 743 - "multiformats": "^9.9.0", 744 - "zod": "^3.23.8" 745 } 746 }, 747 - "node_modules/@atproto/repo/node_modules/@atproto/syntax": { 748 - "version": "0.4.2", 749 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz", 750 - "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==", 751 - "license": "MIT" 752 }, 753 "node_modules/@atproto/repo/node_modules/multiformats": { 754 "version": "9.9.0", ··· 777 } 778 }, 779 "node_modules/@atproto/sync/node_modules/@atproto/syntax": { 780 - "version": "0.4.1", 781 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.1.tgz", 782 - "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==", 783 - "license": "MIT" 784 }, 785 "node_modules/@atproto/sync/node_modules/multiformats": { 786 "version": "9.9.0", ··· 812 } 813 }, 814 "node_modules/@atproto/tap/node_modules/@atproto/common": { 815 - "version": "0.5.6", 816 - "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.5.6.tgz", 817 - "integrity": "sha512-rbWoZwHQNP8jcwjCREVecchw8aaoM5A1NCONyb9PVDWOJLRLCzojYMeIS8IbFqXo6NyIByOGddupADkkLeVBGQ==", 818 "license": "MIT", 819 "dependencies": { 820 - "@atproto/common-web": "^0.4.10", 821 - "@atproto/lex-cbor": "0.0.6", 822 - "@atproto/lex-data": "0.0.6", 823 "iso-datestring-validator": "^2.2.2", 824 "multiformats": "^9.9.0", 825 "pino": "^8.21.0" ··· 828 "node": ">=18.7.0" 829 } 830 }, 831 "node_modules/@atproto/tap/node_modules/@atproto/syntax": { 832 - "version": "0.4.2", 833 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.2.tgz", 834 - "integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==", 835 - "license": "MIT" 836 }, 837 "node_modules/@atproto/tap/node_modules/multiformats": { 838 "version": "9.9.0", ··· 854 } 855 }, 856 "node_modules/@atproto/ws-client/node_modules/@atproto/common": { 857 - "version": "0.5.6", 858 - "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.5.6.tgz", 859 - "integrity": "sha512-rbWoZwHQNP8jcwjCREVecchw8aaoM5A1NCONyb9PVDWOJLRLCzojYMeIS8IbFqXo6NyIByOGddupADkkLeVBGQ==", 860 "license": "MIT", 861 "dependencies": { 862 - "@atproto/common-web": "^0.4.10", 863 - "@atproto/lex-cbor": "0.0.6", 864 - "@atproto/lex-data": "0.0.6", 865 "iso-datestring-validator": "^2.2.2", 866 "multiformats": "^9.9.0", 867 "pino": "^8.21.0" ··· 870 "node": ">=18.7.0" 871 } 872 }, 873 "node_modules/@atproto/ws-client/node_modules/multiformats": { 874 "version": "9.9.0", 875 "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", ··· 1714 } 1715 }, 1716 "node_modules/@esbuild/aix-ppc64": { 1717 - "version": "0.25.4", 1718 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 1719 - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 1720 "cpu": [ 1721 "ppc64" 1722 ], 1723 "dev": true, 1724 "optional": true, 1725 "os": [ 1726 "aix" ··· 1730 } 1731 }, 1732 "node_modules/@esbuild/android-arm": { 1733 - "version": "0.25.4", 1734 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 1735 - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 1736 "cpu": [ 1737 "arm" 1738 ], 1739 "dev": true, 1740 "optional": true, 1741 "os": [ 1742 "android" ··· 1746 } 1747 }, 1748 "node_modules/@esbuild/android-arm64": { 1749 - "version": "0.25.4", 1750 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 1751 - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 1752 "cpu": [ 1753 "arm64" 1754 ], 1755 "dev": true, 1756 "optional": true, 1757 "os": [ 1758 "android" ··· 1762 } 1763 }, 1764 "node_modules/@esbuild/android-x64": { 1765 - "version": "0.25.4", 1766 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 1767 - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 1768 "cpu": [ 1769 "x64" 1770 ], 1771 "dev": true, 1772 "optional": true, 1773 "os": [ 1774 "android" ··· 1777 "node": ">=18" 1778 } 1779 }, 1780 "node_modules/@esbuild/darwin-x64": { 1781 - "version": "0.25.4", 1782 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 1783 - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 1784 "cpu": [ 1785 "x64" 1786 ], 1787 "dev": true, 1788 "optional": true, 1789 "os": [ 1790 "darwin" ··· 1794 } 1795 }, 1796 "node_modules/@esbuild/freebsd-arm64": { 1797 - "version": "0.25.4", 1798 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 1799 - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 1800 "cpu": [ 1801 "arm64" 1802 ], 1803 "dev": true, 1804 "optional": true, 1805 "os": [ 1806 "freebsd" ··· 1810 } 1811 }, 1812 "node_modules/@esbuild/freebsd-x64": { 1813 - "version": "0.25.4", 1814 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 1815 - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 1816 "cpu": [ 1817 "x64" 1818 ], 1819 "dev": true, 1820 "optional": true, 1821 "os": [ 1822 "freebsd" ··· 1826 } 1827 }, 1828 "node_modules/@esbuild/linux-arm": { 1829 - "version": "0.25.4", 1830 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 1831 - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 1832 "cpu": [ 1833 "arm" 1834 ], 1835 "dev": true, 1836 "optional": true, 1837 "os": [ 1838 "linux" ··· 1842 } 1843 }, 1844 "node_modules/@esbuild/linux-arm64": { 1845 - "version": "0.25.4", 1846 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 1847 - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 1848 "cpu": [ 1849 "arm64" 1850 ], 1851 "dev": true, 1852 "optional": true, 1853 "os": [ 1854 "linux" ··· 1858 } 1859 }, 1860 "node_modules/@esbuild/linux-ia32": { 1861 - "version": "0.25.4", 1862 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 1863 - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 1864 "cpu": [ 1865 "ia32" 1866 ], 1867 "dev": true, 1868 "optional": true, 1869 "os": [ 1870 "linux" ··· 1874 } 1875 }, 1876 "node_modules/@esbuild/linux-loong64": { 1877 - "version": "0.25.4", 1878 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 1879 - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 1880 "cpu": [ 1881 "loong64" 1882 ], 1883 "dev": true, 1884 "optional": true, 1885 "os": [ 1886 "linux" ··· 1890 } 1891 }, 1892 "node_modules/@esbuild/linux-mips64el": { 1893 - "version": "0.25.4", 1894 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 1895 - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 1896 "cpu": [ 1897 "mips64el" 1898 ], 1899 "dev": true, 1900 "optional": true, 1901 "os": [ 1902 "linux" ··· 1906 } 1907 }, 1908 "node_modules/@esbuild/linux-ppc64": { 1909 - "version": "0.25.4", 1910 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 1911 - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 1912 "cpu": [ 1913 "ppc64" 1914 ], 1915 "dev": true, 1916 "optional": true, 1917 "os": [ 1918 "linux" ··· 1922 } 1923 }, 1924 "node_modules/@esbuild/linux-riscv64": { 1925 - "version": "0.25.4", 1926 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 1927 - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 1928 "cpu": [ 1929 "riscv64" 1930 ], 1931 "dev": true, 1932 "optional": true, 1933 "os": [ 1934 "linux" ··· 1938 } 1939 }, 1940 "node_modules/@esbuild/linux-s390x": { 1941 - "version": "0.25.4", 1942 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 1943 - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 1944 "cpu": [ 1945 "s390x" 1946 ], 1947 "dev": true, 1948 "optional": true, 1949 "os": [ 1950 "linux" ··· 1954 } 1955 }, 1956 "node_modules/@esbuild/linux-x64": { 1957 - "version": "0.25.4", 1958 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 1959 - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 1960 "cpu": [ 1961 "x64" 1962 ], ··· 1971 } 1972 }, 1973 "node_modules/@esbuild/netbsd-arm64": { 1974 - "version": "0.25.4", 1975 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 1976 - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 1977 "cpu": [ 1978 "arm64" 1979 ], 1980 "dev": true, 1981 "optional": true, 1982 "os": [ 1983 "netbsd" ··· 1987 } 1988 }, 1989 "node_modules/@esbuild/netbsd-x64": { 1990 - "version": "0.25.4", 1991 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 1992 - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 1993 "cpu": [ 1994 "x64" 1995 ], 1996 "dev": true, 1997 "optional": true, 1998 "os": [ 1999 "netbsd" ··· 2003 } 2004 }, 2005 "node_modules/@esbuild/openbsd-arm64": { 2006 - "version": "0.25.4", 2007 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 2008 - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 2009 "cpu": [ 2010 "arm64" 2011 ], 2012 "dev": true, 2013 "optional": true, 2014 "os": [ 2015 "openbsd" ··· 2019 } 2020 }, 2021 "node_modules/@esbuild/openbsd-x64": { 2022 - "version": "0.25.4", 2023 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 2024 - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 2025 "cpu": [ 2026 "x64" 2027 ], 2028 "dev": true, 2029 "optional": true, 2030 "os": [ 2031 "openbsd" ··· 2034 "node": ">=18" 2035 } 2036 }, 2037 "node_modules/@esbuild/sunos-x64": { 2038 - "version": "0.25.4", 2039 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 2040 - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 2041 "cpu": [ 2042 "x64" 2043 ], 2044 "dev": true, 2045 "optional": true, 2046 "os": [ 2047 "sunos" ··· 2051 } 2052 }, 2053 "node_modules/@esbuild/win32-arm64": { 2054 - "version": "0.25.4", 2055 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 2056 - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 2057 "cpu": [ 2058 "arm64" 2059 ], 2060 "dev": true, 2061 "optional": true, 2062 "os": [ 2063 "win32" ··· 2067 } 2068 }, 2069 "node_modules/@esbuild/win32-ia32": { 2070 - "version": "0.25.4", 2071 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 2072 - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 2073 "cpu": [ 2074 "ia32" 2075 ], 2076 "dev": true, 2077 "optional": true, 2078 "os": [ 2079 "win32" ··· 2083 } 2084 }, 2085 "node_modules/@esbuild/win32-x64": { 2086 - "version": "0.25.4", 2087 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 2088 - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 2089 "cpu": [ 2090 "x64" 2091 ], 2092 "dev": true, 2093 "optional": true, 2094 "os": [ 2095 "win32" ··· 3014 } 3015 }, 3016 "node_modules/@mdx-js/loader/node_modules/source-map": { 3017 - "version": "0.7.4", 3018 - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 3019 - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 3020 "engines": { 3021 - "node": ">= 8" 3022 } 3023 }, 3024 "node_modules/@mdx-js/mdx": { ··· 3065 } 3066 }, 3067 "node_modules/@mdx-js/mdx/node_modules/source-map": { 3068 - "version": "0.7.4", 3069 - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 3070 - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 3071 "engines": { 3072 - "node": ">= 8" 3073 } 3074 }, 3075 "node_modules/@mdx-js/react": { ··· 3160 } 3161 }, 3162 "node_modules/@next/mdx/node_modules/source-map": { 3163 - "version": "0.7.4", 3164 - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 3165 - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 3166 "engines": { 3167 - "node": ">= 8" 3168 } 3169 }, 3170 "node_modules/@next/swc-darwin-arm64": { ··· 7549 } 7550 }, 7551 "node_modules/@tailwindcss/node/node_modules/magic-string": { 7552 - "version": "0.30.19", 7553 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", 7554 - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", 7555 "dev": true, 7556 "license": "MIT", 7557 "dependencies": { ··· 7805 } 7806 }, 7807 "node_modules/@tailwindcss/oxide/node_modules/tar": { 7808 - "version": "7.5.1", 7809 - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", 7810 - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", 7811 "dev": true, 7812 - "license": "ISC", 7813 "dependencies": { 7814 "@isaacs/fs-minipass": "^4.0.0", 7815 "chownr": "^3.0.0", ··· 8142 } 8143 }, 8144 "node_modules/@types/unist": { 8145 - "version": "3.0.2", 8146 - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", 8147 - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" 8148 }, 8149 "node_modules/@types/uuid": { 8150 "version": "10.0.0", ··· 8563 } 8564 }, 8565 "node_modules/agent-base": { 8566 - "version": "7.1.1", 8567 - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 8568 - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 8569 - "dependencies": { 8570 - "debug": "^4.3.4" 8571 - }, 8572 "engines": { 8573 "node": ">= 14" 8574 } ··· 9047 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 9048 "license": "MIT" 9049 }, 9050 - "node_modules/body-parser/node_modules/qs": { 9051 - "version": "6.13.0", 9052 - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 9053 - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 9054 - "license": "BSD-3-Clause", 9055 - "dependencies": { 9056 - "side-channel": "^1.0.6" 9057 - }, 9058 - "engines": { 9059 - "node": ">=0.6" 9060 - }, 9061 - "funding": { 9062 - "url": "https://github.com/sponsors/ljharb" 9063 - } 9064 - }, 9065 "node_modules/brace-expansion": { 9066 - "version": "1.1.11", 9067 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 9068 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 9069 "dev": true, 9070 "dependencies": { 9071 "balanced-match": "^1.0.0", 9072 "concat-map": "0.0.1" ··· 9748 "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" 9749 }, 9750 "node_modules/debug": { 9751 - "version": "4.4.1", 9752 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 9753 - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 9754 "license": "MIT", 9755 "dependencies": { 9756 "ms": "^2.1.3" ··· 9904 "node": "*" 9905 } 9906 }, 9907 "node_modules/dreamopt": { 9908 "version": "0.8.0", 9909 "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", ··· 10800 } 10801 }, 10802 "node_modules/esbuild": { 10803 - "version": "0.25.4", 10804 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 10805 - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 10806 "dev": true, 10807 "hasInstallScript": true, 10808 "license": "MIT", ··· 10813 "node": ">=18" 10814 }, 10815 "optionalDependencies": { 10816 - "@esbuild/aix-ppc64": "0.25.4", 10817 - "@esbuild/android-arm": "0.25.4", 10818 - "@esbuild/android-arm64": "0.25.4", 10819 - "@esbuild/android-x64": "0.25.4", 10820 - "@esbuild/darwin-arm64": "0.25.4", 10821 - "@esbuild/darwin-x64": "0.25.4", 10822 - "@esbuild/freebsd-arm64": "0.25.4", 10823 - "@esbuild/freebsd-x64": "0.25.4", 10824 - "@esbuild/linux-arm": "0.25.4", 10825 - "@esbuild/linux-arm64": "0.25.4", 10826 - "@esbuild/linux-ia32": "0.25.4", 10827 - "@esbuild/linux-loong64": "0.25.4", 10828 - "@esbuild/linux-mips64el": "0.25.4", 10829 - "@esbuild/linux-ppc64": "0.25.4", 10830 - "@esbuild/linux-riscv64": "0.25.4", 10831 - "@esbuild/linux-s390x": "0.25.4", 10832 - "@esbuild/linux-x64": "0.25.4", 10833 - "@esbuild/netbsd-arm64": "0.25.4", 10834 - "@esbuild/netbsd-x64": "0.25.4", 10835 - "@esbuild/openbsd-arm64": "0.25.4", 10836 - "@esbuild/openbsd-x64": "0.25.4", 10837 - "@esbuild/sunos-x64": "0.25.4", 10838 - "@esbuild/win32-arm64": "0.25.4", 10839 - "@esbuild/win32-ia32": "0.25.4", 10840 - "@esbuild/win32-x64": "0.25.4" 10841 } 10842 }, 10843 "node_modules/esbuild-register": { ··· 10850 }, 10851 "peerDependencies": { 10852 "esbuild": ">=0.12 <1" 10853 - } 10854 - }, 10855 - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { 10856 - "version": "0.25.4", 10857 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 10858 - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 10859 - "cpu": [ 10860 - "arm64" 10861 - ], 10862 - "dev": true, 10863 - "optional": true, 10864 - "os": [ 10865 - "darwin" 10866 - ], 10867 - "engines": { 10868 - "node": ">=18" 10869 } 10870 }, 10871 "node_modules/escalade": { ··· 11103 "ms": "^2.1.1" 11104 } 11105 }, 11106 - "node_modules/eslint-plugin-import/node_modules/doctrine": { 11107 - "version": "2.1.0", 11108 - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 11109 - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 11110 - "dev": true, 11111 - "dependencies": { 11112 - "esutils": "^2.0.2" 11113 - }, 11114 - "engines": { 11115 - "node": ">=0.10.0" 11116 - } 11117 - }, 11118 "node_modules/eslint-plugin-import/node_modules/semver": { 11119 "version": "6.3.1", 11120 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ··· 11206 "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 11207 } 11208 }, 11209 - "node_modules/eslint-plugin-react-hooks/node_modules/zod": { 11210 - "version": "4.1.12", 11211 - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", 11212 - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", 11213 - "dev": true, 11214 - "funding": { 11215 - "url": "https://github.com/sponsors/colinhacks" 11216 - } 11217 - }, 11218 "node_modules/eslint-plugin-react-hooks/node_modules/zod-validation-error": { 11219 "version": "4.0.2", 11220 "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", ··· 11227 "zod": "^3.25.0 || ^4.0.0" 11228 } 11229 }, 11230 - "node_modules/eslint-plugin-react/node_modules/doctrine": { 11231 - "version": "2.1.0", 11232 - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 11233 - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 11234 - "dev": true, 11235 - "license": "Apache-2.0", 11236 - "dependencies": { 11237 - "esutils": "^2.0.2" 11238 - }, 11239 - "engines": { 11240 - "node": ">=0.10.0" 11241 - } 11242 - }, 11243 "node_modules/eslint-plugin-react/node_modules/resolve": { 11244 "version": "2.0.0-next.5", 11245 "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", ··· 11433 } 11434 }, 11435 "node_modules/estree-util-to-js/node_modules/source-map": { 11436 - "version": "0.7.4", 11437 - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 11438 - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 11439 "engines": { 11440 - "node": ">= 8" 11441 } 11442 }, 11443 "node_modules/estree-util-visit": { ··· 11599 "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", 11600 "license": "MIT" 11601 }, 11602 - "node_modules/express/node_modules/qs": { 11603 - "version": "6.13.0", 11604 - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 11605 - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 11606 - "license": "BSD-3-Clause", 11607 - "dependencies": { 11608 - "side-channel": "^1.0.6" 11609 - }, 11610 - "engines": { 11611 - "node": ">=0.6" 11612 - }, 11613 - "funding": { 11614 - "url": "https://github.com/sponsors/ljharb" 11615 - } 11616 - }, 11617 "node_modules/ext": { 11618 "version": "1.7.0", 11619 "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", ··· 11635 "dev": true 11636 }, 11637 "node_modules/fast-glob": { 11638 - "version": "3.3.2", 11639 - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 11640 - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 11641 "dev": true, 11642 "dependencies": { 11643 "@nodelib/fs.stat": "^2.0.2", 11644 "@nodelib/fs.walk": "^1.2.3", 11645 "glob-parent": "^5.1.2", 11646 "merge2": "^1.3.0", 11647 - "micromatch": "^4.0.4" 11648 }, 11649 "engines": { 11650 "node": ">=8.6.0" ··· 11928 "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 11929 "dev": true 11930 }, 11931 "node_modules/function-bind": { 11932 "version": "1.1.2", 11933 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ··· 12178 "dev": true 12179 }, 12180 "node_modules/glob/node_modules/brace-expansion": { 12181 - "version": "2.0.1", 12182 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 12183 - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 12184 "dev": true, 12185 "dependencies": { 12186 "balanced-match": "^1.0.0" 12187 } ··· 12721 } 12722 }, 12723 "node_modules/https-proxy-agent": { 12724 - "version": "7.0.4", 12725 - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", 12726 - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", 12727 "dependencies": { 12728 - "agent-base": "^7.0.2", 12729 "debug": "4" 12730 }, 12731 "engines": { ··· 12765 "license": "BSD-3-Clause" 12766 }, 12767 "node_modules/ignore": { 12768 - "version": "5.3.1", 12769 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 12770 - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", 12771 "dev": true, 12772 "engines": { 12773 "node": ">= 4" 12774 } ··· 12837 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 12838 }, 12839 "node_modules/inline-style-parser": { 12840 - "version": "0.2.4", 12841 - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", 12842 - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" 12843 }, 12844 "node_modules/inngest": { 12845 "version": "3.40.1", ··· 13000 } 13001 }, 13002 "node_modules/ipaddr.js": { 13003 - "version": "2.2.0", 13004 - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", 13005 - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", 13006 "license": "MIT", 13007 "engines": { 13008 "node": ">= 10" ··· 14173 } 14174 }, 14175 "node_modules/lru-cache": { 14176 - "version": "10.2.2", 14177 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", 14178 - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", 14179 - "engines": { 14180 - "node": "14 || >=16.14" 14181 - } 14182 }, 14183 "node_modules/lru-queue": { 14184 "version": "0.1.0", ··· 15282 ] 15283 }, 15284 "node_modules/micromatch": { 15285 - "version": "4.0.7", 15286 - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", 15287 - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", 15288 "dev": true, 15289 "dependencies": { 15290 "braces": "^3.0.3", 15291 "picomatch": "^2.3.1" ··· 15352 } 15353 }, 15354 "node_modules/miniflare/node_modules/undici": { 15355 - "version": "5.28.4", 15356 - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", 15357 - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", 15358 "dev": true, 15359 "dependencies": { 15360 "@fastify/busboy": "^2.0.0" 15361 }, ··· 15449 "license": "MIT" 15450 }, 15451 "node_modules/multiformats": { 15452 - "version": "13.3.2", 15453 - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", 15454 - "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", 15455 "license": "Apache-2.0 OR MIT" 15456 }, 15457 "node_modules/mustache": { ··· 16037 "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 16038 }, 16039 "node_modules/path-to-regexp": { 16040 - "version": "6.2.2", 16041 - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", 16042 - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", 16043 - "dev": true 16044 }, 16045 "node_modules/pg": { 16046 "version": "8.16.3", ··· 16510 "prosemirror-view": "^1.37.2" 16511 } 16512 }, 16513 - "node_modules/prosemirror-tables/node_modules/prosemirror-view": { 16514 - "version": "1.39.2", 16515 - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.2.tgz", 16516 - "integrity": "sha512-BmOkml0QWNob165gyUxXi5K5CVUgVPpqMEAAml/qzgKn9boLUWVPzQ6LtzXw8Cn1GtRQX4ELumPxqtLTDaAKtg==", 16517 - "license": "MIT", 16518 - "peer": true, 16519 - "dependencies": { 16520 - "prosemirror-model": "^1.20.0", 16521 - "prosemirror-state": "^1.0.0", 16522 - "prosemirror-transform": "^1.1.0" 16523 - } 16524 - }, 16525 "node_modules/prosemirror-trailing-node": { 16526 "version": "3.0.0", 16527 "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", ··· 16548 } 16549 }, 16550 "node_modules/prosemirror-view": { 16551 - "version": "1.37.1", 16552 - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.37.1.tgz", 16553 - "integrity": "sha512-MEAnjOdXU1InxEmhjgmEzQAikaS6lF3hD64MveTPpjOGNTl87iRLA1HupC/DEV6YuK7m4Q9DHFNTjwIVtqz5NA==", 16554 "license": "MIT", 16555 "dependencies": { 16556 "prosemirror-model": "^1.20.0", ··· 16629 } 16630 }, 16631 "node_modules/qs": { 16632 - "version": "6.13.1", 16633 - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", 16634 - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", 16635 "license": "BSD-3-Clause", 16636 "dependencies": { 16637 "side-channel": "^1.0.6" ··· 17371 } 17372 }, 17373 "node_modules/resolve": { 17374 - "version": "1.22.8", 17375 - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 17376 - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 17377 "dependencies": { 17378 - "is-core-module": "^2.13.0", 17379 "path-parse": "^1.0.7", 17380 "supports-preserve-symlinks-flag": "^1.0.0" 17381 }, 17382 "bin": { 17383 "resolve": "bin/resolve" 17384 }, 17385 "funding": { 17386 "url": "https://github.com/sponsors/ljharb" 17387 } ··· 17604 } 17605 }, 17606 "node_modules/semver": { 17607 - "version": "7.7.2", 17608 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 17609 - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 17610 "license": "ISC", 17611 "bin": { 17612 "semver": "bin/semver.js" ··· 18235 } 18236 }, 18237 "node_modules/style-to-object": { 18238 - "version": "1.0.8", 18239 - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", 18240 - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", 18241 "dependencies": { 18242 - "inline-style-parser": "0.2.4" 18243 } 18244 }, 18245 "node_modules/styled-jsx": { ··· 18805 } 18806 }, 18807 "node_modules/undici": { 18808 - "version": "6.21.3", 18809 - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", 18810 - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", 18811 "license": "MIT", 18812 "engines": { 18813 "node": ">=18.17" ··· 19805 } 19806 }, 19807 "node_modules/ws": { 19808 - "version": "8.17.0", 19809 - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", 19810 - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", 19811 "engines": { 19812 "node": ">=10.0.0" 19813 }, ··· 19995 } 19996 }, 19997 "node_modules/zod": { 19998 - "version": "3.23.8", 19999 - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 20000 - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 20001 "funding": { 20002 "url": "https://github.com/sponsors/colinhacks" 20003 }
··· 12 "@atproto/api": "^0.16.9", 13 "@atproto/common": "^0.4.8", 14 "@atproto/identity": "^0.4.6", 15 + "@atproto/lexicon": "^0.6.1", 16 "@atproto/oauth-client-node": "^0.3.8", 17 "@atproto/sync": "^0.1.34", 18 "@atproto/syntax": "^0.3.3", ··· 236 } 237 }, 238 "node_modules/@atproto/api/node_modules/@atproto/syntax": { 239 + "version": "0.4.3", 240 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", 241 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 242 + "license": "MIT", 243 + "dependencies": { 244 + "tslib": "^2.8.1" 245 + } 246 }, 247 "node_modules/@atproto/api/node_modules/multiformats": { 248 "version": "9.9.0", ··· 268 } 269 }, 270 "node_modules/@atproto/common-web": { 271 + "version": "0.4.15", 272 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.15.tgz", 273 + "integrity": "sha512-A4l9gyqUNez8CjZp/Trypz/D3WIQsNj8dN05WR6+RoBbvwc9JhWjKPrm+WoVYc/F16RPdXHLkE3BEJlGIyYIiA==", 274 "license": "MIT", 275 "dependencies": { 276 + "@atproto/lex-data": "^0.0.10", 277 + "@atproto/lex-json": "^0.0.10", 278 + "@atproto/syntax": "^0.4.3", 279 "zod": "^3.23.8" 280 } 281 }, 282 + "node_modules/@atproto/common-web/node_modules/@atproto/lex-data": { 283 + "version": "0.0.10", 284 + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.10.tgz", 285 + "integrity": "sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==", 286 + "license": "MIT", 287 + "dependencies": { 288 + "multiformats": "^9.9.0", 289 + "tslib": "^2.8.1", 290 + "uint8arrays": "3.0.0", 291 + "unicode-segmenter": "^0.14.0" 292 + } 293 + }, 294 + "node_modules/@atproto/common-web/node_modules/@atproto/lex-json": { 295 + "version": "0.0.10", 296 + "resolved": "https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.10.tgz", 297 + "integrity": "sha512-L6MyXU17C5ODMeob8myQ2F3xvgCTvJUtM0ew8qSApnN//iDasB/FDGgd7ty4UVNmx4NQ/rtvz8xV94YpG6kneQ==", 298 + "license": "MIT", 299 + "dependencies": { 300 + "@atproto/lex-data": "^0.0.10", 301 + "tslib": "^2.8.1" 302 + } 303 + }, 304 + "node_modules/@atproto/common-web/node_modules/@atproto/syntax": { 305 + "version": "0.4.3", 306 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", 307 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 308 + "license": "MIT", 309 + "dependencies": { 310 + "tslib": "^2.8.1" 311 + } 312 + }, 313 + "node_modules/@atproto/common-web/node_modules/multiformats": { 314 + "version": "9.9.0", 315 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 316 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 317 + "license": "(Apache-2.0 AND MIT)" 318 + }, 319 "node_modules/@atproto/common/node_modules/multiformats": { 320 "version": "9.9.0", 321 "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", ··· 505 } 506 }, 507 "node_modules/@atproto/lex-cli/node_modules/@atproto/syntax": { 508 + "version": "0.4.3", 509 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", 510 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 511 "dev": true, 512 + "license": "MIT", 513 + "dependencies": { 514 + "tslib": "^2.8.1" 515 + } 516 }, 517 "node_modules/@atproto/lex-client": { 518 "version": "0.0.7", ··· 658 "license": "MIT" 659 }, 660 "node_modules/@atproto/lexicon": { 661 + "version": "0.6.1", 662 + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.6.1.tgz", 663 + "integrity": "sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==", 664 "license": "MIT", 665 "dependencies": { 666 + "@atproto/common-web": "^0.4.13", 667 + "@atproto/syntax": "^0.4.3", 668 "iso-datestring-validator": "^2.2.2", 669 "multiformats": "^9.9.0", 670 "zod": "^3.23.8" 671 } 672 }, 673 "node_modules/@atproto/lexicon/node_modules/@atproto/syntax": { 674 + "version": "0.4.3", 675 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", 676 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 677 + "license": "MIT", 678 + "dependencies": { 679 + "tslib": "^2.8.1" 680 + } 681 }, 682 "node_modules/@atproto/lexicon/node_modules/multiformats": { 683 "version": "9.9.0", ··· 762 } 763 }, 764 "node_modules/@atproto/repo/node_modules/@atproto/common": { 765 + "version": "0.5.10", 766 + "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.5.10.tgz", 767 + "integrity": "sha512-A1+4W3JmjZIgmtJFLJBAaoVruZhRL0ANtyjZ91aJR4rjHcZuaQ+v4IFR1UcE6yyTATacLdBk6ADy8OtxXzq14g==", 768 "license": "MIT", 769 "dependencies": { 770 + "@atproto/common-web": "^0.4.15", 771 + "@atproto/lex-cbor": "^0.0.10", 772 + "@atproto/lex-data": "^0.0.10", 773 "iso-datestring-validator": "^2.2.2", 774 "multiformats": "^9.9.0", 775 "pino": "^8.21.0" ··· 778 "node": ">=18.7.0" 779 } 780 }, 781 + "node_modules/@atproto/repo/node_modules/@atproto/lex-cbor": { 782 + "version": "0.0.10", 783 + "resolved": "https://registry.npmjs.org/@atproto/lex-cbor/-/lex-cbor-0.0.10.tgz", 784 + "integrity": "sha512-5RtV90iIhRNCXXvvETd3KlraV8XGAAAgOmiszUb+l8GySDU/sGk7AlVvArFfXnj/S/GXJq8DP6IaUxCw/sPASA==", 785 "license": "MIT", 786 "dependencies": { 787 + "@atproto/lex-data": "^0.0.10", 788 + "tslib": "^2.8.1" 789 } 790 }, 791 + "node_modules/@atproto/repo/node_modules/@atproto/lex-data": { 792 + "version": "0.0.10", 793 + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.10.tgz", 794 + "integrity": "sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==", 795 + "license": "MIT", 796 + "dependencies": { 797 + "multiformats": "^9.9.0", 798 + "tslib": "^2.8.1", 799 + "uint8arrays": "3.0.0", 800 + "unicode-segmenter": "^0.14.0" 801 + } 802 }, 803 "node_modules/@atproto/repo/node_modules/multiformats": { 804 "version": "9.9.0", ··· 827 } 828 }, 829 "node_modules/@atproto/sync/node_modules/@atproto/syntax": { 830 + "version": "0.4.3", 831 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", 832 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 833 + "license": "MIT", 834 + "dependencies": { 835 + "tslib": "^2.8.1" 836 + } 837 }, 838 "node_modules/@atproto/sync/node_modules/multiformats": { 839 "version": "9.9.0", ··· 865 } 866 }, 867 "node_modules/@atproto/tap/node_modules/@atproto/common": { 868 + "version": "0.5.10", 869 + "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.5.10.tgz", 870 + "integrity": "sha512-A1+4W3JmjZIgmtJFLJBAaoVruZhRL0ANtyjZ91aJR4rjHcZuaQ+v4IFR1UcE6yyTATacLdBk6ADy8OtxXzq14g==", 871 "license": "MIT", 872 "dependencies": { 873 + "@atproto/common-web": "^0.4.15", 874 + "@atproto/lex-cbor": "^0.0.10", 875 + "@atproto/lex-data": "^0.0.10", 876 "iso-datestring-validator": "^2.2.2", 877 "multiformats": "^9.9.0", 878 "pino": "^8.21.0" ··· 881 "node": ">=18.7.0" 882 } 883 }, 884 + "node_modules/@atproto/tap/node_modules/@atproto/lex-cbor": { 885 + "version": "0.0.10", 886 + "resolved": "https://registry.npmjs.org/@atproto/lex-cbor/-/lex-cbor-0.0.10.tgz", 887 + "integrity": "sha512-5RtV90iIhRNCXXvvETd3KlraV8XGAAAgOmiszUb+l8GySDU/sGk7AlVvArFfXnj/S/GXJq8DP6IaUxCw/sPASA==", 888 + "license": "MIT", 889 + "dependencies": { 890 + "@atproto/lex-data": "^0.0.10", 891 + "tslib": "^2.8.1" 892 + } 893 + }, 894 + "node_modules/@atproto/tap/node_modules/@atproto/lex-data": { 895 + "version": "0.0.10", 896 + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.10.tgz", 897 + "integrity": "sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==", 898 + "license": "MIT", 899 + "dependencies": { 900 + "multiformats": "^9.9.0", 901 + "tslib": "^2.8.1", 902 + "uint8arrays": "3.0.0", 903 + "unicode-segmenter": "^0.14.0" 904 + } 905 + }, 906 "node_modules/@atproto/tap/node_modules/@atproto/syntax": { 907 + "version": "0.4.3", 908 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", 909 + "integrity": "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==", 910 + "license": "MIT", 911 + "dependencies": { 912 + "tslib": "^2.8.1" 913 + } 914 }, 915 "node_modules/@atproto/tap/node_modules/multiformats": { 916 "version": "9.9.0", ··· 932 } 933 }, 934 "node_modules/@atproto/ws-client/node_modules/@atproto/common": { 935 + "version": "0.5.10", 936 + "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.5.10.tgz", 937 + "integrity": "sha512-A1+4W3JmjZIgmtJFLJBAaoVruZhRL0ANtyjZ91aJR4rjHcZuaQ+v4IFR1UcE6yyTATacLdBk6ADy8OtxXzq14g==", 938 "license": "MIT", 939 "dependencies": { 940 + "@atproto/common-web": "^0.4.15", 941 + "@atproto/lex-cbor": "^0.0.10", 942 + "@atproto/lex-data": "^0.0.10", 943 "iso-datestring-validator": "^2.2.2", 944 "multiformats": "^9.9.0", 945 "pino": "^8.21.0" ··· 948 "node": ">=18.7.0" 949 } 950 }, 951 + "node_modules/@atproto/ws-client/node_modules/@atproto/lex-cbor": { 952 + "version": "0.0.10", 953 + "resolved": "https://registry.npmjs.org/@atproto/lex-cbor/-/lex-cbor-0.0.10.tgz", 954 + "integrity": "sha512-5RtV90iIhRNCXXvvETd3KlraV8XGAAAgOmiszUb+l8GySDU/sGk7AlVvArFfXnj/S/GXJq8DP6IaUxCw/sPASA==", 955 + "license": "MIT", 956 + "dependencies": { 957 + "@atproto/lex-data": "^0.0.10", 958 + "tslib": "^2.8.1" 959 + } 960 + }, 961 + "node_modules/@atproto/ws-client/node_modules/@atproto/lex-data": { 962 + "version": "0.0.10", 963 + "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.10.tgz", 964 + "integrity": "sha512-FDbcy8VIUVzS9Mi1F8SMxbkL/jOUmRRpqbeM1xB4A0fMxeZJTxf6naAbFt4gYF3quu/+TPJGmio6/7cav05FqQ==", 965 + "license": "MIT", 966 + "dependencies": { 967 + "multiformats": "^9.9.0", 968 + "tslib": "^2.8.1", 969 + "uint8arrays": "3.0.0", 970 + "unicode-segmenter": "^0.14.0" 971 + } 972 + }, 973 "node_modules/@atproto/ws-client/node_modules/multiformats": { 974 "version": "9.9.0", 975 "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", ··· 1814 } 1815 }, 1816 "node_modules/@esbuild/aix-ppc64": { 1817 + "version": "0.25.12", 1818 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", 1819 + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", 1820 "cpu": [ 1821 "ppc64" 1822 ], 1823 "dev": true, 1824 + "license": "MIT", 1825 "optional": true, 1826 "os": [ 1827 "aix" ··· 1831 } 1832 }, 1833 "node_modules/@esbuild/android-arm": { 1834 + "version": "0.25.12", 1835 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", 1836 + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", 1837 "cpu": [ 1838 "arm" 1839 ], 1840 "dev": true, 1841 + "license": "MIT", 1842 "optional": true, 1843 "os": [ 1844 "android" ··· 1848 } 1849 }, 1850 "node_modules/@esbuild/android-arm64": { 1851 + "version": "0.25.12", 1852 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", 1853 + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", 1854 "cpu": [ 1855 "arm64" 1856 ], 1857 "dev": true, 1858 + "license": "MIT", 1859 "optional": true, 1860 "os": [ 1861 "android" ··· 1865 } 1866 }, 1867 "node_modules/@esbuild/android-x64": { 1868 + "version": "0.25.12", 1869 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", 1870 + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", 1871 "cpu": [ 1872 "x64" 1873 ], 1874 "dev": true, 1875 + "license": "MIT", 1876 "optional": true, 1877 "os": [ 1878 "android" ··· 1881 "node": ">=18" 1882 } 1883 }, 1884 + "node_modules/@esbuild/darwin-arm64": { 1885 + "version": "0.25.12", 1886 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", 1887 + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", 1888 + "cpu": [ 1889 + "arm64" 1890 + ], 1891 + "dev": true, 1892 + "license": "MIT", 1893 + "optional": true, 1894 + "os": [ 1895 + "darwin" 1896 + ], 1897 + "engines": { 1898 + "node": ">=18" 1899 + } 1900 + }, 1901 "node_modules/@esbuild/darwin-x64": { 1902 + "version": "0.25.12", 1903 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", 1904 + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", 1905 "cpu": [ 1906 "x64" 1907 ], 1908 "dev": true, 1909 + "license": "MIT", 1910 "optional": true, 1911 "os": [ 1912 "darwin" ··· 1916 } 1917 }, 1918 "node_modules/@esbuild/freebsd-arm64": { 1919 + "version": "0.25.12", 1920 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", 1921 + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", 1922 "cpu": [ 1923 "arm64" 1924 ], 1925 "dev": true, 1926 + "license": "MIT", 1927 "optional": true, 1928 "os": [ 1929 "freebsd" ··· 1933 } 1934 }, 1935 "node_modules/@esbuild/freebsd-x64": { 1936 + "version": "0.25.12", 1937 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", 1938 + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", 1939 "cpu": [ 1940 "x64" 1941 ], 1942 "dev": true, 1943 + "license": "MIT", 1944 "optional": true, 1945 "os": [ 1946 "freebsd" ··· 1950 } 1951 }, 1952 "node_modules/@esbuild/linux-arm": { 1953 + "version": "0.25.12", 1954 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", 1955 + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", 1956 "cpu": [ 1957 "arm" 1958 ], 1959 "dev": true, 1960 + "license": "MIT", 1961 "optional": true, 1962 "os": [ 1963 "linux" ··· 1967 } 1968 }, 1969 "node_modules/@esbuild/linux-arm64": { 1970 + "version": "0.25.12", 1971 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", 1972 + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", 1973 "cpu": [ 1974 "arm64" 1975 ], 1976 "dev": true, 1977 + "license": "MIT", 1978 "optional": true, 1979 "os": [ 1980 "linux" ··· 1984 } 1985 }, 1986 "node_modules/@esbuild/linux-ia32": { 1987 + "version": "0.25.12", 1988 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", 1989 + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", 1990 "cpu": [ 1991 "ia32" 1992 ], 1993 "dev": true, 1994 + "license": "MIT", 1995 "optional": true, 1996 "os": [ 1997 "linux" ··· 2001 } 2002 }, 2003 "node_modules/@esbuild/linux-loong64": { 2004 + "version": "0.25.12", 2005 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", 2006 + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", 2007 "cpu": [ 2008 "loong64" 2009 ], 2010 "dev": true, 2011 + "license": "MIT", 2012 "optional": true, 2013 "os": [ 2014 "linux" ··· 2018 } 2019 }, 2020 "node_modules/@esbuild/linux-mips64el": { 2021 + "version": "0.25.12", 2022 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", 2023 + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", 2024 "cpu": [ 2025 "mips64el" 2026 ], 2027 "dev": true, 2028 + "license": "MIT", 2029 "optional": true, 2030 "os": [ 2031 "linux" ··· 2035 } 2036 }, 2037 "node_modules/@esbuild/linux-ppc64": { 2038 + "version": "0.25.12", 2039 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", 2040 + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", 2041 "cpu": [ 2042 "ppc64" 2043 ], 2044 "dev": true, 2045 + "license": "MIT", 2046 "optional": true, 2047 "os": [ 2048 "linux" ··· 2052 } 2053 }, 2054 "node_modules/@esbuild/linux-riscv64": { 2055 + "version": "0.25.12", 2056 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", 2057 + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", 2058 "cpu": [ 2059 "riscv64" 2060 ], 2061 "dev": true, 2062 + "license": "MIT", 2063 "optional": true, 2064 "os": [ 2065 "linux" ··· 2069 } 2070 }, 2071 "node_modules/@esbuild/linux-s390x": { 2072 + "version": "0.25.12", 2073 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", 2074 + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", 2075 "cpu": [ 2076 "s390x" 2077 ], 2078 "dev": true, 2079 + "license": "MIT", 2080 "optional": true, 2081 "os": [ 2082 "linux" ··· 2086 } 2087 }, 2088 "node_modules/@esbuild/linux-x64": { 2089 + "version": "0.25.12", 2090 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", 2091 + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", 2092 "cpu": [ 2093 "x64" 2094 ], ··· 2103 } 2104 }, 2105 "node_modules/@esbuild/netbsd-arm64": { 2106 + "version": "0.25.12", 2107 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", 2108 + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", 2109 "cpu": [ 2110 "arm64" 2111 ], 2112 "dev": true, 2113 + "license": "MIT", 2114 "optional": true, 2115 "os": [ 2116 "netbsd" ··· 2120 } 2121 }, 2122 "node_modules/@esbuild/netbsd-x64": { 2123 + "version": "0.25.12", 2124 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", 2125 + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", 2126 "cpu": [ 2127 "x64" 2128 ], 2129 "dev": true, 2130 + "license": "MIT", 2131 "optional": true, 2132 "os": [ 2133 "netbsd" ··· 2137 } 2138 }, 2139 "node_modules/@esbuild/openbsd-arm64": { 2140 + "version": "0.25.12", 2141 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", 2142 + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", 2143 "cpu": [ 2144 "arm64" 2145 ], 2146 "dev": true, 2147 + "license": "MIT", 2148 "optional": true, 2149 "os": [ 2150 "openbsd" ··· 2154 } 2155 }, 2156 "node_modules/@esbuild/openbsd-x64": { 2157 + "version": "0.25.12", 2158 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", 2159 + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", 2160 "cpu": [ 2161 "x64" 2162 ], 2163 "dev": true, 2164 + "license": "MIT", 2165 "optional": true, 2166 "os": [ 2167 "openbsd" ··· 2170 "node": ">=18" 2171 } 2172 }, 2173 + "node_modules/@esbuild/openharmony-arm64": { 2174 + "version": "0.25.12", 2175 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", 2176 + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", 2177 + "cpu": [ 2178 + "arm64" 2179 + ], 2180 + "dev": true, 2181 + "license": "MIT", 2182 + "optional": true, 2183 + "os": [ 2184 + "openharmony" 2185 + ], 2186 + "engines": { 2187 + "node": ">=18" 2188 + } 2189 + }, 2190 "node_modules/@esbuild/sunos-x64": { 2191 + "version": "0.25.12", 2192 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", 2193 + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", 2194 "cpu": [ 2195 "x64" 2196 ], 2197 "dev": true, 2198 + "license": "MIT", 2199 "optional": true, 2200 "os": [ 2201 "sunos" ··· 2205 } 2206 }, 2207 "node_modules/@esbuild/win32-arm64": { 2208 + "version": "0.25.12", 2209 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", 2210 + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", 2211 "cpu": [ 2212 "arm64" 2213 ], 2214 "dev": true, 2215 + "license": "MIT", 2216 "optional": true, 2217 "os": [ 2218 "win32" ··· 2222 } 2223 }, 2224 "node_modules/@esbuild/win32-ia32": { 2225 + "version": "0.25.12", 2226 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", 2227 + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", 2228 "cpu": [ 2229 "ia32" 2230 ], 2231 "dev": true, 2232 + "license": "MIT", 2233 "optional": true, 2234 "os": [ 2235 "win32" ··· 2239 } 2240 }, 2241 "node_modules/@esbuild/win32-x64": { 2242 + "version": "0.25.12", 2243 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", 2244 + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", 2245 "cpu": [ 2246 "x64" 2247 ], 2248 "dev": true, 2249 + "license": "MIT", 2250 "optional": true, 2251 "os": [ 2252 "win32" ··· 3171 } 3172 }, 3173 "node_modules/@mdx-js/loader/node_modules/source-map": { 3174 + "version": "0.7.6", 3175 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 3176 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 3177 + "license": "BSD-3-Clause", 3178 "engines": { 3179 + "node": ">= 12" 3180 } 3181 }, 3182 "node_modules/@mdx-js/mdx": { ··· 3223 } 3224 }, 3225 "node_modules/@mdx-js/mdx/node_modules/source-map": { 3226 + "version": "0.7.6", 3227 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 3228 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 3229 + "license": "BSD-3-Clause", 3230 "engines": { 3231 + "node": ">= 12" 3232 } 3233 }, 3234 "node_modules/@mdx-js/react": { ··· 3319 } 3320 }, 3321 "node_modules/@next/mdx/node_modules/source-map": { 3322 + "version": "0.7.6", 3323 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 3324 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 3325 + "license": "BSD-3-Clause", 3326 "engines": { 3327 + "node": ">= 12" 3328 } 3329 }, 3330 "node_modules/@next/swc-darwin-arm64": { ··· 7709 } 7710 }, 7711 "node_modules/@tailwindcss/node/node_modules/magic-string": { 7712 + "version": "0.30.21", 7713 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 7714 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 7715 "dev": true, 7716 "license": "MIT", 7717 "dependencies": { ··· 7965 } 7966 }, 7967 "node_modules/@tailwindcss/oxide/node_modules/tar": { 7968 + "version": "7.5.7", 7969 + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", 7970 + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", 7971 "dev": true, 7972 + "license": "BlueOak-1.0.0", 7973 "dependencies": { 7974 "@isaacs/fs-minipass": "^4.0.0", 7975 "chownr": "^3.0.0", ··· 8302 } 8303 }, 8304 "node_modules/@types/unist": { 8305 + "version": "3.0.3", 8306 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 8307 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 8308 + "license": "MIT" 8309 }, 8310 "node_modules/@types/uuid": { 8311 "version": "10.0.0", ··· 8724 } 8725 }, 8726 "node_modules/agent-base": { 8727 + "version": "7.1.4", 8728 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 8729 + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 8730 + "license": "MIT", 8731 "engines": { 8732 "node": ">= 14" 8733 } ··· 9206 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 9207 "license": "MIT" 9208 }, 9209 "node_modules/brace-expansion": { 9210 + "version": "1.1.12", 9211 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 9212 + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 9213 "dev": true, 9214 + "license": "MIT", 9215 "dependencies": { 9216 "balanced-match": "^1.0.0", 9217 "concat-map": "0.0.1" ··· 9893 "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" 9894 }, 9895 "node_modules/debug": { 9896 + "version": "4.4.3", 9897 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 9898 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 9899 "license": "MIT", 9900 "dependencies": { 9901 "ms": "^2.1.3" ··· 10049 "node": "*" 10050 } 10051 }, 10052 + "node_modules/doctrine": { 10053 + "version": "2.1.0", 10054 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 10055 + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 10056 + "dev": true, 10057 + "license": "Apache-2.0", 10058 + "dependencies": { 10059 + "esutils": "^2.0.2" 10060 + }, 10061 + "engines": { 10062 + "node": ">=0.10.0" 10063 + } 10064 + }, 10065 "node_modules/dreamopt": { 10066 "version": "0.8.0", 10067 "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", ··· 10958 } 10959 }, 10960 "node_modules/esbuild": { 10961 + "version": "0.25.12", 10962 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", 10963 + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", 10964 "dev": true, 10965 "hasInstallScript": true, 10966 "license": "MIT", ··· 10971 "node": ">=18" 10972 }, 10973 "optionalDependencies": { 10974 + "@esbuild/aix-ppc64": "0.25.12", 10975 + "@esbuild/android-arm": "0.25.12", 10976 + "@esbuild/android-arm64": "0.25.12", 10977 + "@esbuild/android-x64": "0.25.12", 10978 + "@esbuild/darwin-arm64": "0.25.12", 10979 + "@esbuild/darwin-x64": "0.25.12", 10980 + "@esbuild/freebsd-arm64": "0.25.12", 10981 + "@esbuild/freebsd-x64": "0.25.12", 10982 + "@esbuild/linux-arm": "0.25.12", 10983 + "@esbuild/linux-arm64": "0.25.12", 10984 + "@esbuild/linux-ia32": "0.25.12", 10985 + "@esbuild/linux-loong64": "0.25.12", 10986 + "@esbuild/linux-mips64el": "0.25.12", 10987 + "@esbuild/linux-ppc64": "0.25.12", 10988 + "@esbuild/linux-riscv64": "0.25.12", 10989 + "@esbuild/linux-s390x": "0.25.12", 10990 + "@esbuild/linux-x64": "0.25.12", 10991 + "@esbuild/netbsd-arm64": "0.25.12", 10992 + "@esbuild/netbsd-x64": "0.25.12", 10993 + "@esbuild/openbsd-arm64": "0.25.12", 10994 + "@esbuild/openbsd-x64": "0.25.12", 10995 + "@esbuild/openharmony-arm64": "0.25.12", 10996 + "@esbuild/sunos-x64": "0.25.12", 10997 + "@esbuild/win32-arm64": "0.25.12", 10998 + "@esbuild/win32-ia32": "0.25.12", 10999 + "@esbuild/win32-x64": "0.25.12" 11000 } 11001 }, 11002 "node_modules/esbuild-register": { ··· 11009 }, 11010 "peerDependencies": { 11011 "esbuild": ">=0.12 <1" 11012 } 11013 }, 11014 "node_modules/escalade": { ··· 11246 "ms": "^2.1.1" 11247 } 11248 }, 11249 "node_modules/eslint-plugin-import/node_modules/semver": { 11250 "version": "6.3.1", 11251 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", ··· 11337 "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 11338 } 11339 }, 11340 "node_modules/eslint-plugin-react-hooks/node_modules/zod-validation-error": { 11341 "version": "4.0.2", 11342 "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", ··· 11349 "zod": "^3.25.0 || ^4.0.0" 11350 } 11351 }, 11352 "node_modules/eslint-plugin-react/node_modules/resolve": { 11353 "version": "2.0.0-next.5", 11354 "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", ··· 11542 } 11543 }, 11544 "node_modules/estree-util-to-js/node_modules/source-map": { 11545 + "version": "0.7.6", 11546 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 11547 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 11548 + "license": "BSD-3-Clause", 11549 "engines": { 11550 + "node": ">= 12" 11551 } 11552 }, 11553 "node_modules/estree-util-visit": { ··· 11709 "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", 11710 "license": "MIT" 11711 }, 11712 "node_modules/ext": { 11713 "version": "1.7.0", 11714 "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", ··· 11730 "dev": true 11731 }, 11732 "node_modules/fast-glob": { 11733 + "version": "3.3.3", 11734 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 11735 + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 11736 "dev": true, 11737 + "license": "MIT", 11738 "dependencies": { 11739 "@nodelib/fs.stat": "^2.0.2", 11740 "@nodelib/fs.walk": "^1.2.3", 11741 "glob-parent": "^5.1.2", 11742 "merge2": "^1.3.0", 11743 + "micromatch": "^4.0.8" 11744 }, 11745 "engines": { 11746 "node": ">=8.6.0" ··· 12024 "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 12025 "dev": true 12026 }, 12027 + "node_modules/fsevents": { 12028 + "version": "2.3.3", 12029 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 12030 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 12031 + "dev": true, 12032 + "hasInstallScript": true, 12033 + "license": "MIT", 12034 + "optional": true, 12035 + "os": [ 12036 + "darwin" 12037 + ], 12038 + "engines": { 12039 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 12040 + } 12041 + }, 12042 "node_modules/function-bind": { 12043 "version": "1.1.2", 12044 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ··· 12289 "dev": true 12290 }, 12291 "node_modules/glob/node_modules/brace-expansion": { 12292 + "version": "2.0.2", 12293 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 12294 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 12295 "dev": true, 12296 + "license": "MIT", 12297 "dependencies": { 12298 "balanced-match": "^1.0.0" 12299 } ··· 12833 } 12834 }, 12835 "node_modules/https-proxy-agent": { 12836 + "version": "7.0.6", 12837 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 12838 + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 12839 + "license": "MIT", 12840 "dependencies": { 12841 + "agent-base": "^7.1.2", 12842 "debug": "4" 12843 }, 12844 "engines": { ··· 12878 "license": "BSD-3-Clause" 12879 }, 12880 "node_modules/ignore": { 12881 + "version": "5.3.2", 12882 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 12883 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 12884 "dev": true, 12885 + "license": "MIT", 12886 "engines": { 12887 "node": ">= 4" 12888 } ··· 12951 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 12952 }, 12953 "node_modules/inline-style-parser": { 12954 + "version": "0.2.7", 12955 + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", 12956 + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", 12957 + "license": "MIT" 12958 }, 12959 "node_modules/inngest": { 12960 "version": "3.40.1", ··· 13115 } 13116 }, 13117 "node_modules/ipaddr.js": { 13118 + "version": "2.3.0", 13119 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", 13120 + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", 13121 "license": "MIT", 13122 "engines": { 13123 "node": ">= 10" ··· 14288 } 14289 }, 14290 "node_modules/lru-cache": { 14291 + "version": "10.4.3", 14292 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 14293 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 14294 + "license": "ISC" 14295 }, 14296 "node_modules/lru-queue": { 14297 "version": "0.1.0", ··· 15395 ] 15396 }, 15397 "node_modules/micromatch": { 15398 + "version": "4.0.8", 15399 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 15400 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 15401 "dev": true, 15402 + "license": "MIT", 15403 "dependencies": { 15404 "braces": "^3.0.3", 15405 "picomatch": "^2.3.1" ··· 15466 } 15467 }, 15468 "node_modules/miniflare/node_modules/undici": { 15469 + "version": "5.29.0", 15470 + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 15471 + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 15472 "dev": true, 15473 + "license": "MIT", 15474 "dependencies": { 15475 "@fastify/busboy": "^2.0.0" 15476 }, ··· 15564 "license": "MIT" 15565 }, 15566 "node_modules/multiformats": { 15567 + "version": "13.4.2", 15568 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", 15569 + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", 15570 "license": "Apache-2.0 OR MIT" 15571 }, 15572 "node_modules/mustache": { ··· 16152 "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 16153 }, 16154 "node_modules/path-to-regexp": { 16155 + "version": "6.3.0", 16156 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 16157 + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 16158 + "dev": true, 16159 + "license": "MIT" 16160 }, 16161 "node_modules/pg": { 16162 "version": "8.16.3", ··· 16626 "prosemirror-view": "^1.37.2" 16627 } 16628 }, 16629 "node_modules/prosemirror-trailing-node": { 16630 "version": "3.0.0", 16631 "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", ··· 16652 } 16653 }, 16654 "node_modules/prosemirror-view": { 16655 + "version": "1.41.5", 16656 + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.5.tgz", 16657 + "integrity": "sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==", 16658 "license": "MIT", 16659 "dependencies": { 16660 "prosemirror-model": "^1.20.0", ··· 16733 } 16734 }, 16735 "node_modules/qs": { 16736 + "version": "6.13.0", 16737 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 16738 + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 16739 "license": "BSD-3-Clause", 16740 "dependencies": { 16741 "side-channel": "^1.0.6" ··· 17475 } 17476 }, 17477 "node_modules/resolve": { 17478 + "version": "1.22.11", 17479 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", 17480 + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", 17481 + "license": "MIT", 17482 "dependencies": { 17483 + "is-core-module": "^2.16.1", 17484 "path-parse": "^1.0.7", 17485 "supports-preserve-symlinks-flag": "^1.0.0" 17486 }, 17487 "bin": { 17488 "resolve": "bin/resolve" 17489 }, 17490 + "engines": { 17491 + "node": ">= 0.4" 17492 + }, 17493 "funding": { 17494 "url": "https://github.com/sponsors/ljharb" 17495 } ··· 17712 } 17713 }, 17714 "node_modules/semver": { 17715 + "version": "7.7.3", 17716 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 17717 + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 17718 "license": "ISC", 17719 "bin": { 17720 "semver": "bin/semver.js" ··· 18343 } 18344 }, 18345 "node_modules/style-to-object": { 18346 + "version": "1.0.14", 18347 + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", 18348 + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", 18349 + "license": "MIT", 18350 "dependencies": { 18351 + "inline-style-parser": "0.2.7" 18352 } 18353 }, 18354 "node_modules/styled-jsx": { ··· 18914 } 18915 }, 18916 "node_modules/undici": { 18917 + "version": "6.23.0", 18918 + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", 18919 + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", 18920 "license": "MIT", 18921 "engines": { 18922 "node": ">=18.17" ··· 19914 } 19915 }, 19916 "node_modules/ws": { 19917 + "version": "8.19.0", 19918 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", 19919 + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", 19920 + "license": "MIT", 19921 "engines": { 19922 "node": ">=10.0.0" 19923 }, ··· 20105 } 20106 }, 20107 "node_modules/zod": { 20108 + "version": "3.25.76", 20109 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 20110 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 20111 + "license": "MIT", 20112 "funding": { 20113 "url": "https://github.com/sponsors/colinhacks" 20114 }
+3 -2
package.json
··· 23 "@atproto/api": "^0.16.9", 24 "@atproto/common": "^0.4.8", 25 "@atproto/identity": "^0.4.6", 26 - "@atproto/lexicon": "^0.5.1", 27 "@atproto/oauth-client-node": "^0.3.8", 28 "@atproto/sync": "^0.1.34", 29 "@atproto/syntax": "^0.3.3", ··· 124 "ajv": "^8.17.1", 125 "whatwg-url": "^14.0.0", 126 "@types/react": "19.2.6", 127 - "@types/react-dom": "19.2.3" 128 } 129 }
··· 23 "@atproto/api": "^0.16.9", 24 "@atproto/common": "^0.4.8", 25 "@atproto/identity": "^0.4.6", 26 + "@atproto/lexicon": "^0.6.1", 27 "@atproto/oauth-client-node": "^0.3.8", 28 "@atproto/sync": "^0.1.34", 29 "@atproto/syntax": "^0.3.3", ··· 124 "ajv": "^8.17.1", 125 "whatwg-url": "^14.0.0", 126 "@types/react": "19.2.6", 127 + "@types/react-dom": "19.2.3", 128 + "@atproto/lexicon": "^0.6.1" 129 } 130 }
-284
patterns/lexicons.md
··· 1 - # Lexicon System 2 - 3 - ## Overview 4 - 5 - Lexicons define the schema for AT Protocol records. This project has two namespaces: 6 - - **`pub.leaflet.*`** - Leaflet-specific lexicons (documents, publications, blocks, etc.) 7 - - **`site.standard.*`** - Standard site lexicons for interoperability 8 - 9 - The lexicons are defined as TypeScript in `lexicons/src/`, built to JSON in `lexicons/pub/leaflet/` and `lexicons/site/standard/`, and TypeScript types are generated in `lexicons/api/`. 10 - 11 - ## Key Files 12 - 13 - - **`lexicons/src/*.ts`** - Source definitions for `pub.leaflet.*` lexicons 14 - - **`lexicons/site/standard/**/*.json`** - JSON definitions for `site.standard.*` lexicons (manually maintained) 15 - - **`lexicons/build.ts`** - Builds TypeScript sources to JSON 16 - - **`lexicons/api/`** - Generated TypeScript types and client 17 - - **`package.json`** - Contains `lexgen` script 18 - 19 - ## Running Lexicon Generation 20 - 21 - ```bash 22 - npm run lexgen 23 - ``` 24 - 25 - This runs: 26 - 1. `tsx ./lexicons/build.ts` - Builds `pub.leaflet.*` JSON from TypeScript 27 - 2. `lex gen-api` - Generates TypeScript types from all JSON lexicons 28 - 3. `tsx ./lexicons/fix-extensions.ts` - Fixes import extensions 29 - 30 - ## Adding a New pub.leaflet Lexicon 31 - 32 - ### 1. Create the Source Definition 33 - 34 - Create a file in `lexicons/src/` (e.g., `lexicons/src/myLexicon.ts`): 35 - 36 - ```typescript 37 - import { LexiconDoc } from "@atproto/lexicon"; 38 - 39 - export const PubLeafletMyLexicon: LexiconDoc = { 40 - lexicon: 1, 41 - id: "pub.leaflet.myLexicon", 42 - defs: { 43 - main: { 44 - type: "record", // or "object" for non-record types 45 - key: "tid", 46 - record: { 47 - type: "object", 48 - required: ["field1"], 49 - properties: { 50 - field1: { type: "string", maxLength: 1000 }, 51 - field2: { type: "integer", minimum: 0 }, 52 - optionalRef: { type: "ref", ref: "other.lexicon#def" }, 53 - }, 54 - }, 55 - }, 56 - // Additional defs for sub-objects 57 - subType: { 58 - type: "object", 59 - properties: { 60 - nested: { type: "string" }, 61 - }, 62 - }, 63 - }, 64 - }; 65 - ``` 66 - 67 - ### 2. Add to Build 68 - 69 - Update `lexicons/build.ts`: 70 - 71 - ```typescript 72 - import { PubLeafletMyLexicon } from "./src/myLexicon"; 73 - 74 - const lexicons = [ 75 - // ... existing lexicons 76 - PubLeafletMyLexicon, 77 - ]; 78 - ``` 79 - 80 - ### 3. Update lexgen Command (if needed) 81 - 82 - If your lexicon is at the top level of `pub/leaflet/` (not in a subdirectory), add it to the `lexgen` script in `package.json`: 83 - 84 - ```json 85 - "lexgen": "tsx ./lexicons/build.ts && lex gen-api ./lexicons/api ./lexicons/pub/leaflet/document.json ./lexicons/pub/leaflet/myLexicon.json ./lexicons/pub/leaflet/*/* ..." 86 - ``` 87 - 88 - Note: Files in subdirectories (`pub/leaflet/*/*`) are automatically included. 89 - 90 - ### 4. Regenerate Types 91 - 92 - ```bash 93 - npm run lexgen 94 - ``` 95 - 96 - ### 5. Use the Generated Types 97 - 98 - ```typescript 99 - import { PubLeafletMyLexicon } from "lexicons/api"; 100 - 101 - // Type for the record 102 - type MyRecord = PubLeafletMyLexicon.Record; 103 - 104 - // Validation 105 - const result = PubLeafletMyLexicon.validateRecord(data); 106 - if (result.success) { 107 - // result.value is typed 108 - } 109 - 110 - // Type guard 111 - if (PubLeafletMyLexicon.isRecord(data)) { 112 - // data is typed as Record 113 - } 114 - ``` 115 - 116 - ## Adding a New site.standard Lexicon 117 - 118 - ### 1. Create the JSON Definition 119 - 120 - Create a file in `lexicons/site/standard/` (e.g., `lexicons/site/standard/myType.json`): 121 - 122 - ```json 123 - { 124 - "lexicon": 1, 125 - "id": "site.standard.myType", 126 - "defs": { 127 - "main": { 128 - "type": "record", 129 - "key": "tid", 130 - "record": { 131 - "type": "object", 132 - "required": ["field1"], 133 - "properties": { 134 - "field1": { 135 - "type": "string", 136 - "maxLength": 1000 137 - } 138 - } 139 - } 140 - } 141 - } 142 - } 143 - ``` 144 - 145 - ### 2. Regenerate Types 146 - 147 - ```bash 148 - npm run lexgen 149 - ``` 150 - 151 - The `site/*/* site/*/*/*` globs in the lexgen command automatically pick up new files. 152 - 153 - ## Common Lexicon Patterns 154 - 155 - ### Referencing Other Lexicons 156 - 157 - ```typescript 158 - // Reference another lexicon's main def 159 - { type: "ref", ref: "pub.leaflet.publication" } 160 - 161 - // Reference a specific def within a lexicon 162 - { type: "ref", ref: "pub.leaflet.publication#theme" } 163 - 164 - // Reference within the same lexicon 165 - { type: "ref", ref: "#myDef" } 166 - ``` 167 - 168 - ### Union Types 169 - 170 - ```typescript 171 - { 172 - type: "union", 173 - refs: [ 174 - "pub.leaflet.pages.linearDocument", 175 - "pub.leaflet.pages.canvas", 176 - ], 177 - } 178 - 179 - // Open union (allows unknown types) 180 - { 181 - type: "union", 182 - closed: false, // default is true 183 - refs: ["pub.leaflet.content"], 184 - } 185 - ``` 186 - 187 - ### Blob Types (for images/files) 188 - 189 - ```typescript 190 - { 191 - type: "blob", 192 - accept: ["image/*"], // or specific types like ["image/png", "image/jpeg"] 193 - maxSize: 1000000, // bytes 194 - } 195 - ``` 196 - 197 - ### Color Types 198 - 199 - The project has color types defined: 200 - - `pub.leaflet.theme.color#rgb` / `#rgba` 201 - - `site.standard.theme.color#rgb` / `#rgba` 202 - 203 - ```typescript 204 - // In lexicons/src/theme.ts 205 - export const ColorUnion = { 206 - type: "union", 207 - refs: [ 208 - "pub.leaflet.theme.color#rgba", 209 - "pub.leaflet.theme.color#rgb", 210 - ], 211 - }; 212 - ``` 213 - 214 - ## Normalization Between Formats 215 - 216 - Use `lexicons/src/normalize.ts` to convert between `pub.leaflet` and `site.standard` formats: 217 - 218 - ```typescript 219 - import { 220 - normalizeDocument, 221 - normalizePublication, 222 - isLeafletDocument, 223 - isStandardDocument, 224 - getDocumentPages, 225 - } from "lexicons/src/normalize"; 226 - 227 - // Normalize a document from either format 228 - const normalized = normalizeDocument(record); 229 - if (normalized) { 230 - // normalized is always in site.standard.document format 231 - console.log(normalized.title, normalized.site); 232 - 233 - // Get pages if content is pub.leaflet.content 234 - const pages = getDocumentPages(normalized); 235 - } 236 - 237 - // Normalize a publication 238 - const pub = normalizePublication(record); 239 - if (pub) { 240 - console.log(pub.name, pub.url); 241 - } 242 - ``` 243 - 244 - ## Handling in Appview (Firehose Consumer) 245 - 246 - When processing records from the firehose in `appview/index.ts`: 247 - 248 - ```typescript 249 - import { ids } from "lexicons/api/lexicons"; 250 - import { PubLeafletMyLexicon } from "lexicons/api"; 251 - 252 - // In filterCollections: 253 - filterCollections: [ 254 - ids.PubLeafletMyLexicon, 255 - // ... 256 - ], 257 - 258 - // In handleEvent: 259 - if (evt.collection === ids.PubLeafletMyLexicon) { 260 - if (evt.event === "create" || evt.event === "update") { 261 - let record = PubLeafletMyLexicon.validateRecord(evt.record); 262 - if (!record.success) return; 263 - 264 - // Store in database 265 - await supabase.from("my_table").upsert({ 266 - uri: evt.uri.toString(), 267 - data: record.value as Json, 268 - }); 269 - } 270 - if (evt.event === "delete") { 271 - await supabase.from("my_table").delete().eq("uri", evt.uri.toString()); 272 - } 273 - } 274 - ``` 275 - 276 - ## Publishing Lexicons 277 - 278 - To publish lexicons to an AT Protocol PDS: 279 - 280 - ```bash 281 - npm run publish-lexicons 282 - ``` 283 - 284 - This runs `lexicons/publish.ts` which publishes lexicons to the configured PDS.
···
-144
patterns/notifications.md
··· 1 - # Notification System 2 - 3 - ## Overview 4 - 5 - Notifications are stored in the database and hydrated with related data before being rendered. The system supports multiple notification types (comments, subscriptions, etc.) that are processed in parallel. 6 - 7 - ## Key Files 8 - 9 - - **`src/notifications.ts`** - Core notification types and hydration logic 10 - - **`app/(home-pages)/notifications/NotificationList.tsx`** - Renders all notification types 11 - - **`app/(home-pages)/notifications/Notification.tsx`** - Base notification component 12 - - Individual notification components (e.g., `CommentNotification.tsx`, `FollowNotification.tsx`) 13 - 14 - ## Adding a New Notification Type 15 - 16 - ### 1. Update Notification Data Types (`src/notifications.ts`) 17 - 18 - Add your type to the `NotificationData` union: 19 - 20 - ```typescript 21 - export type NotificationData = 22 - | { type: "comment"; comment_uri: string; parent_uri?: string } 23 - | { type: "subscribe"; subscription_uri: string } 24 - | { type: "your_type"; your_field: string }; // Add here 25 - ``` 26 - 27 - Add to the `HydratedNotification` union: 28 - 29 - ```typescript 30 - export type HydratedNotification = 31 - | HydratedCommentNotification 32 - | HydratedSubscribeNotification 33 - | HydratedYourNotification; // Add here 34 - ``` 35 - 36 - ### 2. Create Hydration Function (`src/notifications.ts`) 37 - 38 - ```typescript 39 - export type HydratedYourNotification = Awaited< 40 - ReturnType<typeof hydrateYourNotifications> 41 - >[0]; 42 - 43 - async function hydrateYourNotifications(notifications: NotificationRow[]) { 44 - const yourNotifications = notifications.filter( 45 - (n): n is NotificationRow & { data: ExtractNotificationType<"your_type"> } => 46 - (n.data as NotificationData)?.type === "your_type", 47 - ); 48 - 49 - if (yourNotifications.length === 0) return []; 50 - 51 - // Fetch related data with joins 52 - const { data } = await supabaseServerClient 53 - .from("your_table") 54 - .select("*, related_table(*)") 55 - .in("uri", yourNotifications.map((n) => n.data.your_field)); 56 - 57 - return yourNotifications.map((notification) => ({ 58 - id: notification.id, 59 - recipient: notification.recipient, 60 - created_at: notification.created_at, 61 - type: "your_type" as const, 62 - your_field: notification.data.your_field, 63 - yourData: data?.find((d) => d.uri === notification.data.your_field)!, 64 - })); 65 - } 66 - ``` 67 - 68 - Add to `hydrateNotifications` parallel array: 69 - 70 - ```typescript 71 - const [commentNotifications, subscribeNotifications, yourNotifications] = await Promise.all([ 72 - hydrateCommentNotifications(notifications), 73 - hydrateSubscribeNotifications(notifications), 74 - hydrateYourNotifications(notifications), // Add here 75 - ]); 76 - 77 - const allHydrated = [...commentNotifications, ...subscribeNotifications, ...yourNotifications]; 78 - ``` 79 - 80 - ### 3. Trigger the Notification (in your action file) 81 - 82 - ```typescript 83 - import { Notification, pingIdentityToUpdateNotification } from "src/notifications"; 84 - import { v7 } from "uuid"; 85 - 86 - // When the event occurs: 87 - const recipient = /* determine who should receive it */; 88 - if (recipient !== currentUser) { 89 - const notification: Notification = { 90 - id: v7(), 91 - recipient, 92 - data: { 93 - type: "your_type", 94 - your_field: "value", 95 - }, 96 - }; 97 - await supabaseServerClient.from("notifications").insert(notification); 98 - await pingIdentityToUpdateNotification(recipient); 99 - } 100 - ``` 101 - 102 - ### 4. Create Notification Component 103 - 104 - Create a new component (e.g., `YourNotification.tsx`): 105 - 106 - ```typescript 107 - import { HydratedYourNotification } from "src/notifications"; 108 - import { Notification } from "./Notification"; 109 - 110 - export const YourNotification = (props: HydratedYourNotification) => { 111 - // Extract data from props.yourData 112 - 113 - return ( 114 - <Notification 115 - timestamp={props.created_at} 116 - href={/* link to relevant page */} 117 - icon={/* icon or avatar */} 118 - actionText={<>Message to display</>} 119 - content={/* optional additional content */} 120 - /> 121 - ); 122 - }; 123 - ``` 124 - 125 - ### 5. Update NotificationList (`NotificationList.tsx`) 126 - 127 - Import and render your notification type: 128 - 129 - ```typescript 130 - import { YourNotification } from "./YourNotification"; 131 - 132 - // In the map function: 133 - if (n.type === "your_type") { 134 - return <YourNotification key={n.id} {...n} />; 135 - } 136 - ``` 137 - 138 - ## Example: Subscribe Notifications 139 - 140 - See the implementation in: 141 - - `src/notifications.ts:88-125` - Hydration logic 142 - - `app/lish/subscribeToPublication.ts:55-68` - Trigger 143 - - `app/(home-pages)/notifications/FollowNotification.tsx` - Component 144 - - `app/(home-pages)/notifications/NotificationList.tsx:40-42` - Rendering
···
+45
supabase/database.types.ts
··· 1075 }, 1076 ] 1077 } 1078 replicache_clients: { 1079 Row: { 1080 client_group: string ··· 1303 Returns: { 1304 like: unknown 1305 }[] 1306 } 1307 pull_data: { 1308 Args: {
··· 1075 }, 1076 ] 1077 } 1078 + recommends_on_documents: { 1079 + Row: { 1080 + document: string 1081 + indexed_at: string 1082 + recommender_did: string 1083 + record: Json 1084 + uri: string 1085 + } 1086 + Insert: { 1087 + document: string 1088 + indexed_at?: string 1089 + recommender_did: string 1090 + record: Json 1091 + uri: string 1092 + } 1093 + Update: { 1094 + document?: string 1095 + indexed_at?: string 1096 + recommender_did?: string 1097 + record?: Json 1098 + uri?: string 1099 + } 1100 + Relationships: [ 1101 + { 1102 + foreignKeyName: "recommends_on_documents_document_fkey" 1103 + columns: ["document"] 1104 + isOneToOne: false 1105 + referencedRelation: "documents" 1106 + referencedColumns: ["uri"] 1107 + }, 1108 + { 1109 + foreignKeyName: "recommends_on_documents_recommender_did_fkey" 1110 + columns: ["recommender_did"] 1111 + isOneToOne: false 1112 + referencedRelation: "identities" 1113 + referencedColumns: ["atp_did"] 1114 + }, 1115 + ] 1116 + } 1117 replicache_clients: { 1118 Row: { 1119 client_group: string ··· 1342 Returns: { 1343 like: unknown 1344 }[] 1345 + } 1346 + parse_iso_timestamp: { 1347 + Args: { 1348 + "": string 1349 + } 1350 + Returns: string 1351 } 1352 pull_data: { 1353 Args: {
+65
supabase/migrations/20260127000000_add_recommends_table.sql
···
··· 1 + create table "public"."recommends_on_documents" ( 2 + "uri" text not null, 3 + "record" jsonb not null, 4 + "document" text not null, 5 + "recommender_did" text not null, 6 + "indexed_at" timestamp with time zone not null default now() 7 + ); 8 + 9 + alter table "public"."recommends_on_documents" enable row level security; 10 + 11 + CREATE UNIQUE INDEX recommends_on_documents_pkey ON public.recommends_on_documents USING btree (uri); 12 + 13 + alter table "public"."recommends_on_documents" add constraint "recommends_on_documents_pkey" PRIMARY KEY using index "recommends_on_documents_pkey"; 14 + 15 + CREATE INDEX recommends_on_documents_document_idx ON public.recommends_on_documents USING btree (document); 16 + 17 + CREATE INDEX recommends_on_documents_recommender_did_idx ON public.recommends_on_documents USING btree (recommender_did); 18 + 19 + CREATE UNIQUE INDEX recommends_on_documents_recommender_document_idx ON public.recommends_on_documents USING btree (recommender_did, document); 20 + 21 + alter table "public"."recommends_on_documents" add constraint "recommends_on_documents_document_fkey" FOREIGN KEY (document) REFERENCES documents(uri) ON UPDATE CASCADE ON DELETE CASCADE; 22 + 23 + alter table "public"."recommends_on_documents" add constraint "recommends_on_documents_recommender_did_fkey" FOREIGN KEY (recommender_did) REFERENCES identities(atp_did) ON UPDATE CASCADE ON DELETE CASCADE; 24 + 25 + grant delete on table "public"."recommends_on_documents" to "anon"; 26 + 27 + grant insert on table "public"."recommends_on_documents" to "anon"; 28 + 29 + grant references on table "public"."recommends_on_documents" to "anon"; 30 + 31 + grant select on table "public"."recommends_on_documents" to "anon"; 32 + 33 + grant trigger on table "public"."recommends_on_documents" to "anon"; 34 + 35 + grant truncate on table "public"."recommends_on_documents" to "anon"; 36 + 37 + grant update on table "public"."recommends_on_documents" to "anon"; 38 + 39 + grant delete on table "public"."recommends_on_documents" to "authenticated"; 40 + 41 + grant insert on table "public"."recommends_on_documents" to "authenticated"; 42 + 43 + grant references on table "public"."recommends_on_documents" to "authenticated"; 44 + 45 + grant select on table "public"."recommends_on_documents" to "authenticated"; 46 + 47 + grant trigger on table "public"."recommends_on_documents" to "authenticated"; 48 + 49 + grant truncate on table "public"."recommends_on_documents" to "authenticated"; 50 + 51 + grant update on table "public"."recommends_on_documents" to "authenticated"; 52 + 53 + grant delete on table "public"."recommends_on_documents" to "service_role"; 54 + 55 + grant insert on table "public"."recommends_on_documents" to "service_role"; 56 + 57 + grant references on table "public"."recommends_on_documents" to "service_role"; 58 + 59 + grant select on table "public"."recommends_on_documents" to "service_role"; 60 + 61 + grant trigger on table "public"."recommends_on_documents" to "service_role"; 62 + 63 + grant truncate on table "public"."recommends_on_documents" to "service_role"; 64 + 65 + grant update on table "public"."recommends_on_documents" to "service_role";