@autumnsgrove/groveengine 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/auth/index.d.ts +1 -2
  2. package/dist/auth/index.js +8 -4
  3. package/dist/auth/session.d.ts +14 -33
  4. package/dist/auth/session.js +5 -103
  5. package/dist/components/admin/FloatingToolbar.svelte +373 -0
  6. package/dist/components/admin/FloatingToolbar.svelte.d.ts +17 -0
  7. package/dist/components/admin/MarkdownEditor.svelte +26 -347
  8. package/dist/components/admin/MarkdownEditor.svelte.d.ts +1 -1
  9. package/dist/components/admin/composables/index.d.ts +0 -2
  10. package/dist/components/admin/composables/index.js +0 -2
  11. package/dist/components/custom/ContentWithGutter.svelte +22 -25
  12. package/dist/components/custom/MobileTOC.svelte +20 -13
  13. package/dist/components/quota/UpgradePrompt.svelte +1 -1
  14. package/dist/server/services/database.d.ts +138 -0
  15. package/dist/server/services/database.js +234 -0
  16. package/dist/server/services/index.d.ts +5 -1
  17. package/dist/server/services/index.js +24 -2
  18. package/dist/server/services/turnstile.d.ts +66 -0
  19. package/dist/server/services/turnstile.js +131 -0
  20. package/dist/server/services/users.d.ts +104 -0
  21. package/dist/server/services/users.js +158 -0
  22. package/dist/styles/README.md +50 -0
  23. package/dist/styles/vine-pattern.css +24 -0
  24. package/dist/types/turnstile.d.ts +42 -0
  25. package/dist/ui/components/forms/TurnstileWidget.svelte +111 -0
  26. package/dist/ui/components/forms/TurnstileWidget.svelte.d.ts +14 -0
  27. package/dist/ui/components/primitives/dialog/dialog-overlay.svelte +1 -1
  28. package/dist/ui/components/primitives/sheet/sheet-overlay.svelte +1 -1
  29. package/dist/ui/components/ui/Glass.svelte +158 -0
  30. package/dist/ui/components/ui/Glass.svelte.d.ts +52 -0
  31. package/dist/ui/components/ui/GlassButton.svelte +157 -0
  32. package/dist/ui/components/ui/GlassButton.svelte.d.ts +39 -0
  33. package/dist/ui/components/ui/GlassCard.svelte +160 -0
  34. package/dist/ui/components/ui/GlassCard.svelte.d.ts +39 -0
  35. package/dist/ui/components/ui/GlassConfirmDialog.svelte +208 -0
  36. package/dist/ui/components/ui/GlassConfirmDialog.svelte.d.ts +52 -0
  37. package/dist/ui/components/ui/GlassOverlay.svelte +93 -0
  38. package/dist/ui/components/ui/GlassOverlay.svelte.d.ts +33 -0
  39. package/dist/ui/components/ui/Logo.svelte +161 -23
  40. package/dist/ui/components/ui/Logo.svelte.d.ts +4 -10
  41. package/dist/ui/components/ui/index.d.ts +5 -0
  42. package/dist/ui/components/ui/index.js +6 -0
  43. package/dist/ui/styles/grove.css +136 -0
  44. package/dist/ui/tokens/fonts.d.ts +69 -0
  45. package/dist/ui/tokens/fonts.js +341 -0
  46. package/dist/ui/tokens/index.d.ts +6 -5
  47. package/dist/ui/tokens/index.js +7 -6
  48. package/dist/utils/gutter.d.ts +2 -8
  49. package/dist/utils/markdown.d.ts +1 -0
  50. package/dist/utils/markdown.js +32 -11
  51. package/package.json +1 -1
  52. package/static/robots.txt +520 -0
  53. package/dist/auth/jwt.d.ts +0 -20
  54. package/dist/auth/jwt.js +0 -123
  55. package/dist/components/admin/composables/useCommandPalette.svelte.d.ts +0 -87
  56. package/dist/components/admin/composables/useCommandPalette.svelte.js +0 -158
  57. package/dist/components/admin/composables/useSlashCommands.svelte.d.ts +0 -104
  58. package/dist/components/admin/composables/useSlashCommands.svelte.js +0 -215
@@ -9,7 +9,9 @@ const renderer = new marked.Renderer();
9
9
  renderer.code = function (token) {
10
10
  // Handle both old (code, language) and new (token) API signatures
11
11
  const code = typeof token === "string" ? token : token.text;
12
- const language = typeof token === "string" ? arguments[1] : token.lang;
12
+ const language = typeof token === "string"
13
+ ? arguments[1]
14
+ : token.lang;
13
15
  const lang = language || "text";
14
16
  // Render markdown/md code blocks as formatted HTML (like GitHub)
15
17
  if (lang === "markdown" || lang === "md") {
@@ -177,7 +179,9 @@ export function processGutterContent(slug, manifestModules, markdownModules, ima
177
179
  });
178
180
  if (mdEntry) {
179
181
  const markdownContent = mdEntry[1];
180
- const htmlContent = marked.parse(markdownContent, { async: false });
182
+ const htmlContent = marked.parse(markdownContent, {
183
+ async: false,
184
+ });
181
185
  return {
182
186
  ...baseItem,
183
187
  content: htmlContent,
@@ -285,7 +289,11 @@ export function processGutterContent(slug, manifestModules, markdownModules, ima
285
289
  }
286
290
  return baseItem;
287
291
  })
288
- .filter((item) => item !== null && (!!item.content || !!item.src || !!item.images || item.type === "emoji"));
292
+ .filter((item) => item !== null &&
293
+ (!!item.content ||
294
+ !!item.src ||
295
+ !!item.images ||
296
+ item.type === "emoji"));
289
297
  }
290
298
  /**
291
299
  * Process a list of markdown files into post/recipe objects
@@ -364,9 +372,12 @@ export function getItemBySlug(slug, modules, options = {}) {
364
372
  });
365
373
  if (sidecarEntry) {
366
374
  const sidecarData = sidecarEntry[1];
367
- result.sidecar = typeof sidecarData === "object" && sidecarData !== null && "default" in sidecarData
368
- ? sidecarData.default
369
- : sidecarData;
375
+ result.sidecar =
376
+ typeof sidecarData === "object" &&
377
+ sidecarData !== null &&
378
+ "default" in sidecarData
379
+ ? sidecarData.default
380
+ : sidecarData;
370
381
  }
371
382
  }
372
383
  return result;
@@ -463,7 +474,9 @@ export function createContentLoader(config) {
463
474
  */
464
475
  getPostBySlug(slug) {
465
476
  return getItemBySlug(slug, posts, {
466
- gutterModules: postGutter.manifest ? postGutter : undefined,
477
+ gutterModules: postGutter.manifest
478
+ ? postGutter
479
+ : undefined,
467
480
  });
468
481
  },
469
482
  /**
@@ -471,7 +484,9 @@ export function createContentLoader(config) {
471
484
  */
472
485
  getRecipeBySlug(slug) {
473
486
  return getItemBySlug(slug, recipes, {
474
- gutterModules: recipeGutter.manifest ? recipeGutter : undefined,
487
+ gutterModules: recipeGutter.manifest
488
+ ? recipeGutter
489
+ : undefined,
475
490
  sidecarModules: recipeMetadata,
476
491
  });
477
492
  },
@@ -480,7 +495,9 @@ export function createContentLoader(config) {
480
495
  */
481
496
  getHomePage() {
482
497
  return getPageByFilename("home.md", home, {
483
- gutterModules: homeGutter.manifest ? homeGutter : undefined,
498
+ gutterModules: homeGutter.manifest
499
+ ? homeGutter
500
+ : undefined,
484
501
  slug: "home",
485
502
  });
486
503
  },
@@ -489,7 +506,9 @@ export function createContentLoader(config) {
489
506
  */
490
507
  getAboutPage() {
491
508
  return getPageByFilename("about.md", about, {
492
- gutterModules: aboutGutter.manifest ? aboutGutter : undefined,
509
+ gutterModules: aboutGutter.manifest
510
+ ? aboutGutter
511
+ : undefined,
493
512
  slug: "about",
494
513
  });
495
514
  },
@@ -498,7 +517,9 @@ export function createContentLoader(config) {
498
517
  */
499
518
  getContactPage() {
500
519
  return getPageByFilename("contact.md", contact, {
501
- gutterModules: contactGutter.manifest ? contactGutter : undefined,
520
+ gutterModules: contactGutter.manifest
521
+ ? contactGutter
522
+ : undefined,
502
523
  slug: "contact",
503
524
  });
504
525
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autumnsgrove/groveengine",
3
- "version": "0.6.4",
3
+ "version": "0.7.0",
4
4
  "description": "Multi-tenant blog engine for Grove Platform. Features gutter annotations, markdown editing, magic code auth, and Cloudflare Workers deployment.",
5
5
  "author": "AutumnsGrove",
6
6
  "license": "AGPL-3.0-only",
@@ -0,0 +1,520 @@
1
+ # Grove User Blog robots.txt
2
+ # Last updated: December 22, 2025
3
+ #
4
+ # Grove blocks AI crawlers and training bots to protect user content.
5
+ # We allow traditional search engines for discoverability.
6
+ #
7
+ # This list is maintained using https://github.com/ai-robots-txt/ai.robots.txt
8
+ # as a reference, plus additional known crawlers.
9
+ #
10
+ # Note: robots.txt is voluntary. Some bad actors ignore it entirely.
11
+ # We also use Cloudflare's AI bot blocking for enforcement.
12
+ # See: https://developers.cloudflare.com/bots/additional-configurations/block-ai-bots/
13
+
14
+ # =============================================================================
15
+ # TRADITIONAL SEARCH ENGINES (ALLOWED)
16
+ # =============================================================================
17
+
18
+ User-agent: Googlebot
19
+ Allow: /
20
+
21
+ User-agent: Bingbot
22
+ Allow: /
23
+
24
+ User-agent: DuckDuckBot
25
+ Allow: /
26
+
27
+ User-agent: KagiBot
28
+ Allow: /
29
+
30
+ # Slurp is Yahoo's crawler (yes, really)
31
+ User-agent: Slurp
32
+ Allow: /
33
+
34
+ User-agent: Yandex
35
+ Allow: /
36
+
37
+ User-agent: Baiduspider
38
+ Allow: /
39
+
40
+ # =============================================================================
41
+ # OPENAI CRAWLERS
42
+ # =============================================================================
43
+
44
+ User-agent: GPTBot
45
+ Disallow: /
46
+
47
+ User-agent: ChatGPT-User
48
+ Disallow: /
49
+
50
+ User-agent: ChatGPT Agent
51
+ Disallow: /
52
+
53
+ User-agent: OAI-SearchBot
54
+ Disallow: /
55
+
56
+ User-agent: OpenAI
57
+ Disallow: /
58
+
59
+ User-agent: Operator
60
+ Disallow: /
61
+
62
+ # =============================================================================
63
+ # ANTHROPIC CRAWLERS
64
+ # =============================================================================
65
+
66
+ User-agent: anthropic-ai
67
+ Disallow: /
68
+
69
+ User-agent: ClaudeBot
70
+ Disallow: /
71
+
72
+ User-agent: Claude-Web
73
+ Disallow: /
74
+
75
+ User-agent: Claude-User
76
+ Disallow: /
77
+
78
+ User-agent: Claude-SearchBot
79
+ Disallow: /
80
+
81
+ # =============================================================================
82
+ # GOOGLE AI CRAWLERS (distinct from search)
83
+ # =============================================================================
84
+
85
+ User-agent: Google-Extended
86
+ Disallow: /
87
+
88
+ User-agent: Google-CloudVertexBot
89
+ Disallow: /
90
+
91
+ User-agent: CloudVertexBot
92
+ Disallow: /
93
+
94
+ User-agent: Google-Firebase
95
+ Disallow: /
96
+
97
+ User-agent: Google-NotebookLM
98
+ Disallow: /
99
+
100
+ User-agent: NotebookLM
101
+ Disallow: /
102
+
103
+ User-agent: GoogleOther
104
+ Disallow: /
105
+
106
+ User-agent: GoogleOther-Image
107
+ Disallow: /
108
+
109
+ User-agent: GoogleOther-Video
110
+ Disallow: /
111
+
112
+ User-agent: GoogleAgent-Mariner
113
+ Disallow: /
114
+
115
+ User-agent: Gemini-Deep-Research
116
+ Disallow: /
117
+
118
+ # =============================================================================
119
+ # META CRAWLERS
120
+ # =============================================================================
121
+
122
+ User-agent: Meta-ExternalAgent
123
+ Disallow: /
124
+
125
+ User-agent: meta-externalagent
126
+ Disallow: /
127
+
128
+ User-agent: Meta-ExternalFetcher
129
+ Disallow: /
130
+
131
+ User-agent: meta-externalfetcher
132
+ Disallow: /
133
+
134
+ User-agent: meta-webindexer
135
+ Disallow: /
136
+
137
+ User-agent: FacebookBot
138
+ Disallow: /
139
+
140
+ User-agent: facebookexternalhit
141
+ Disallow: /
142
+
143
+ # =============================================================================
144
+ # APPLE CRAWLERS
145
+ # =============================================================================
146
+
147
+ User-agent: Applebot-Extended
148
+ Disallow: /
149
+
150
+ # Note: Regular Applebot for Siri/Spotlight is allowed
151
+
152
+ # =============================================================================
153
+ # AMAZON CRAWLERS
154
+ # =============================================================================
155
+
156
+ User-agent: Amazonbot
157
+ Disallow: /
158
+
159
+ User-agent: AmazonBuyForMe
160
+ Disallow: /
161
+
162
+ User-agent: amazon-kendra
163
+ Disallow: /
164
+
165
+ User-agent: bedrockbot
166
+ Disallow: /
167
+
168
+ # =============================================================================
169
+ # BYTEDANCE / TIKTOK
170
+ # =============================================================================
171
+
172
+ User-agent: Bytespider
173
+ Disallow: /
174
+
175
+ User-agent: TikTokSpider
176
+ Disallow: /
177
+
178
+ # =============================================================================
179
+ # PERPLEXITY
180
+ # =============================================================================
181
+
182
+ User-agent: PerplexityBot
183
+ Disallow: /
184
+
185
+ User-agent: Perplexity-User
186
+ Disallow: /
187
+
188
+ # =============================================================================
189
+ # COMMON CRAWL (used for ML training datasets and archiving)
190
+ # =============================================================================
191
+
192
+ User-agent: CCBot
193
+ Disallow: /
194
+
195
+ # =============================================================================
196
+ # WEB ARCHIVING SERVICES
197
+ # These services crawl and archive web content for public access
198
+ # NOTE: Blocking these will RETROACTIVELY remove existing archives
199
+ # =============================================================================
200
+
201
+ # Internet Archive / Wayback Machine
202
+ User-agent: archive.org_bot
203
+ Disallow: /
204
+
205
+ User-agent: ia_archiver
206
+ Disallow: /
207
+
208
+ # Archive-It (Internet Archive's subscription service)
209
+ User-agent: archive.org
210
+ Disallow: /
211
+
212
+ User-agent: ArchiveBot
213
+ Disallow: /
214
+
215
+ User-agent: Archive-It
216
+ Disallow: /
217
+
218
+ # Note: CCBot (Common Crawl) is already blocked above - it serves both
219
+ # archiving and AI training purposes
220
+
221
+ # archive.today / archive.is / archive.ph:
222
+ # Does NOT respect robots.txt - would require IP-based blocking via WAF
223
+ # Not recommended to pursue unless critical
224
+
225
+ # Personal archiving tools (Raindrop, Pocket, ArchiveBox, browser extensions):
226
+ # CANNOT be blocked via robots.txt - they use normal browser sessions
227
+
228
+ # =============================================================================
229
+ # MISTRAL
230
+ # =============================================================================
231
+
232
+ User-agent: MistralAI-User
233
+ Disallow: /
234
+
235
+ User-agent: MistralAI-User/1.0
236
+ Disallow: /
237
+
238
+ # =============================================================================
239
+ # DEEPSEEK
240
+ # =============================================================================
241
+
242
+ User-agent: DeepSeekBot
243
+ Disallow: /
244
+
245
+ # =============================================================================
246
+ # COHERE
247
+ # =============================================================================
248
+
249
+ User-agent: cohere-ai
250
+ Disallow: /
251
+
252
+ User-agent: cohere-training-data-crawler
253
+ Disallow: /
254
+
255
+ # =============================================================================
256
+ # OTHER AI CRAWLERS (alphabetical)
257
+ # =============================================================================
258
+
259
+ User-agent: AddSearchBot
260
+ Disallow: /
261
+
262
+ User-agent: AI2Bot
263
+ Disallow: /
264
+
265
+ User-agent: AI2Bot-DeepResearchEval
266
+ Disallow: /
267
+
268
+ User-agent: Ai2Bot-Dolma
269
+ Disallow: /
270
+
271
+ User-agent: aiHitBot
272
+ Disallow: /
273
+
274
+ User-agent: Andibot
275
+ Disallow: /
276
+
277
+ User-agent: Anomura
278
+ Disallow: /
279
+
280
+ User-agent: atlassian-bot
281
+ Disallow: /
282
+
283
+ User-agent: Awario
284
+ Disallow: /
285
+
286
+ User-agent: bigsur.ai
287
+ Disallow: /
288
+
289
+ User-agent: Bravebot
290
+ Disallow: /
291
+
292
+ User-agent: Brightbot 1.0
293
+ Disallow: /
294
+
295
+ User-agent: BuddyBot
296
+ Disallow: /
297
+
298
+ User-agent: Channel3Bot
299
+ Disallow: /
300
+
301
+ User-agent: ChatGLM-Spider
302
+ Disallow: /
303
+
304
+ User-agent: Cloudflare-AutoRAG
305
+ Disallow: /
306
+
307
+ User-agent: Cotoyogi
308
+ Disallow: /
309
+
310
+ User-agent: Crawl4AI
311
+ Disallow: /
312
+
313
+ User-agent: Crawlspace
314
+ Disallow: /
315
+
316
+ User-agent: Datenbank Crawler
317
+ Disallow: /
318
+
319
+ User-agent: Devin
320
+ Disallow: /
321
+
322
+ User-agent: Diffbot
323
+ Disallow: /
324
+
325
+ User-agent: DuckAssistBot
326
+ Disallow: /
327
+
328
+ User-agent: Echobot Bot
329
+ Disallow: /
330
+
331
+ User-agent: EchoboxBot
332
+ Disallow: /
333
+
334
+ User-agent: Factset_spyderbot
335
+ Disallow: /
336
+
337
+ User-agent: FirecrawlAgent
338
+ Disallow: /
339
+
340
+ User-agent: FriendlyCrawler
341
+ Disallow: /
342
+
343
+ User-agent: iAskBot
344
+ Disallow: /
345
+
346
+ User-agent: iaskspider
347
+ Disallow: /
348
+
349
+ User-agent: iaskspider/2.0
350
+ Disallow: /
351
+
352
+ User-agent: IbouBot
353
+ Disallow: /
354
+
355
+ User-agent: ICC-Crawler
356
+ Disallow: /
357
+
358
+ User-agent: ImagesiftBot
359
+ Disallow: /
360
+
361
+ User-agent: imageSpider
362
+ Disallow: /
363
+
364
+ User-agent: img2dataset
365
+ Disallow: /
366
+
367
+ User-agent: ISSCyberRiskCrawler
368
+ Disallow: /
369
+
370
+ User-agent: Kangaroo Bot
371
+ Disallow: /
372
+
373
+ User-agent: KlaviyoAIBot
374
+ Disallow: /
375
+
376
+ User-agent: KunatoCrawler
377
+ Disallow: /
378
+
379
+ User-agent: laion-huggingface-processor
380
+ Disallow: /
381
+
382
+ User-agent: LAIONDownloader
383
+ Disallow: /
384
+
385
+ User-agent: LCC
386
+ Disallow: /
387
+
388
+ User-agent: LinerBot
389
+ Disallow: /
390
+
391
+ User-agent: Linguee Bot
392
+ Disallow: /
393
+
394
+ User-agent: LinkupBot
395
+ Disallow: /
396
+
397
+ User-agent: Manus-User
398
+ Disallow: /
399
+
400
+ User-agent: MyCentralAIScraperBot
401
+ Disallow: /
402
+
403
+ User-agent: netEstate Imprint Crawler
404
+ Disallow: /
405
+
406
+ User-agent: NovaAct
407
+ Disallow: /
408
+
409
+ User-agent: omgili
410
+ Disallow: /
411
+
412
+ User-agent: omgilibot
413
+ Disallow: /
414
+
415
+ User-agent: PanguBot
416
+ Disallow: /
417
+
418
+ User-agent: Panscient
419
+ Disallow: /
420
+
421
+ User-agent: panscient.com
422
+ Disallow: /
423
+
424
+ User-agent: PetalBot
425
+ Disallow: /
426
+
427
+ User-agent: PhindBot
428
+ Disallow: /
429
+
430
+ User-agent: Poggio-Citations
431
+ Disallow: /
432
+
433
+ User-agent: Poseidon Research Crawler
434
+ Disallow: /
435
+
436
+ User-agent: QualifiedBot
437
+ Disallow: /
438
+
439
+ User-agent: QuillBot
440
+ Disallow: /
441
+
442
+ User-agent: quillbot.com
443
+ Disallow: /
444
+
445
+ User-agent: SBIntuitionsBot
446
+ Disallow: /
447
+
448
+ User-agent: Scrapy
449
+ Disallow: /
450
+
451
+ User-agent: SemrushBot-OCOB
452
+ Disallow: /
453
+
454
+ User-agent: SemrushBot-SWA
455
+ Disallow: /
456
+
457
+ User-agent: ShapBot
458
+ Disallow: /
459
+
460
+ User-agent: Sidetrade indexer bot
461
+ Disallow: /
462
+
463
+ User-agent: Spider
464
+ Disallow: /
465
+
466
+ User-agent: TavilyBot
467
+ Disallow: /
468
+
469
+ User-agent: TerraCotta
470
+ Disallow: /
471
+
472
+ User-agent: Thinkbot
473
+ Disallow: /
474
+
475
+ User-agent: Timpibot
476
+ Disallow: /
477
+
478
+ User-agent: TwinAgent
479
+ Disallow: /
480
+
481
+ User-agent: VelenPublicWebCrawler
482
+ Disallow: /
483
+
484
+ User-agent: WARDBot
485
+ Disallow: /
486
+
487
+ User-agent: Webzio-Extended
488
+ Disallow: /
489
+
490
+ User-agent: webzio-extended
491
+ Disallow: /
492
+
493
+ User-agent: wpbot
494
+ Disallow: /
495
+
496
+ User-agent: WRTNBot
497
+ Disallow: /
498
+
499
+ User-agent: YaK
500
+ Disallow: /
501
+
502
+ User-agent: YandexAdditional
503
+ Disallow: /
504
+
505
+ User-agent: YandexAdditionalBot
506
+ Disallow: /
507
+
508
+ User-agent: YouBot
509
+ Disallow: /
510
+
511
+ User-agent: ZanistaBot
512
+ Disallow: /
513
+
514
+ # =============================================================================
515
+ # DEFAULT RULE
516
+ # =============================================================================
517
+
518
+ # Allow all other well-behaved crawlers
519
+ User-agent: *
520
+ Allow: /
@@ -1,20 +0,0 @@
1
- /**
2
- * Sign a JWT payload
3
- * @param {JwtPayload} payload - The payload to sign
4
- * @param {string} secret - The secret key
5
- * @returns {Promise<string>} - The signed JWT token
6
- */
7
- export function signJwt(payload: JwtPayload, secret: string): Promise<string>;
8
- /**
9
- * Verify and decode a JWT token
10
- * @param {string} token - The JWT token to verify
11
- * @param {string} secret - The secret key
12
- * @returns {Promise<JwtPayload|null>} - The decoded payload or null if invalid
13
- */
14
- export function verifyJwt(token: string, secret: string): Promise<JwtPayload | null>;
15
- export type JwtPayload = {
16
- sub?: string | undefined;
17
- email?: string | undefined;
18
- exp?: number | undefined;
19
- iat?: number | undefined;
20
- };