@coywolf/emdash 0.0.0-stage → 0.35.13

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 (261) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -2
  3. package/package.json +70 -5
  4. package/src/admin/admin-css.ts +57 -0
  5. package/src/admin/ai.tsx +915 -0
  6. package/src/admin/backups.tsx +613 -0
  7. package/src/admin/breadcrumbs.tsx +542 -0
  8. package/src/admin/codeBlocks.tsx +204 -0
  9. package/src/admin/customBlocks.tsx +321 -0
  10. package/src/admin/dirty.ts +20 -0
  11. package/src/admin/discovery.tsx +463 -0
  12. package/src/admin/download.ts +28 -0
  13. package/src/admin/feature-switches.tsx +124 -0
  14. package/src/admin/features.tsx +142 -0
  15. package/src/admin/files.tsx +791 -0
  16. package/src/admin/formUploads.tsx +445 -0
  17. package/src/admin/guides.tsx +18 -0
  18. package/src/admin/headings.tsx +262 -0
  19. package/src/admin/images.tsx +825 -0
  20. package/src/admin/index.tsx +62 -0
  21. package/src/admin/links.tsx +980 -0
  22. package/src/admin/performance.tsx +330 -0
  23. package/src/admin/preview.tsx +63 -0
  24. package/src/admin/redirects-removed.tsx +266 -0
  25. package/src/admin/redirects.tsx +470 -0
  26. package/src/admin/reviews.tsx +232 -0
  27. package/src/admin/robots-bots.tsx +647 -0
  28. package/src/admin/robots-shared.tsx +109 -0
  29. package/src/admin/robots-wizard.tsx +748 -0
  30. package/src/admin/robots.tsx +911 -0
  31. package/src/admin/save-bar.tsx +134 -0
  32. package/src/admin/schema.tsx +1187 -0
  33. package/src/admin/search.tsx +355 -0
  34. package/src/admin/settings-ui.tsx +87 -0
  35. package/src/admin/trash-prompt-core.ts +135 -0
  36. package/src/admin/trash-prompt.tsx +156 -0
  37. package/src/admin/usage.tsx +301 -0
  38. package/src/admin/videos-display.tsx +248 -0
  39. package/src/admin/videos.tsx +1202 -0
  40. package/src/admin/wpImport.tsx +1516 -0
  41. package/src/ai/entities.ts +59 -0
  42. package/src/ai/export.ts +61 -0
  43. package/src/ai/logic.test.ts +187 -0
  44. package/src/ai/logic.ts +606 -0
  45. package/src/ai/pack.ts +121 -0
  46. package/src/ai/prompts.ts +87 -0
  47. package/src/ai/providers.ts +276 -0
  48. package/src/ai/queue.test.ts +97 -0
  49. package/src/ai/routes.ts +359 -0
  50. package/src/ai/store.ts +301 -0
  51. package/src/ai/wikidata.test.ts +184 -0
  52. package/src/ai/wikidata.ts +87 -0
  53. package/src/ai/worker.ts +530 -0
  54. package/src/astro/astro-modules.d.ts +6 -0
  55. package/src/astro/breadcrumbs/Breadcrumbs.astro +129 -0
  56. package/src/astro/breadcrumbs/BreadcrumbsBlock.astro +12 -0
  57. package/src/astro/codeBlocks/CodeBlock.astro +62 -0
  58. package/src/astro/codeBlocks/EmDashCode.astro +61 -0
  59. package/src/astro/customBlocks/CustomBlock.astro +64 -0
  60. package/src/astro/customBlocks/Details.astro +8 -0
  61. package/src/astro/customBlocks/Disclosure.astro +8 -0
  62. package/src/astro/customBlocks/Note.astro +8 -0
  63. package/src/astro/customBlocks/Podcast.astro +8 -0
  64. package/src/astro/customBlocks/Quote.astro +8 -0
  65. package/src/astro/customBlocks/Testimonial.astro +8 -0
  66. package/src/astro/files/FileCard.astro +103 -0
  67. package/src/astro/headings/HeadingBlock.astro +129 -0
  68. package/src/astro/headings/TableOfContents.astro +45 -0
  69. package/src/astro/headings/request.ts +19 -0
  70. package/src/astro/images/ResponsiveImage.astro +60 -0
  71. package/src/astro/index.ts +84 -0
  72. package/src/astro/reviews/CoywolfReview.astro +27 -0
  73. package/src/astro/reviews/Review.astro +49 -0
  74. package/src/astro/search/SearchBox.astro +61 -0
  75. package/src/astro/search/SearchBoxForm.astro +509 -0
  76. package/src/astro/tables/CaptionedTable.astro +72 -0
  77. package/src/astro/videos/CoywolfVideo.astro +448 -0
  78. package/src/backups/download.ts +112 -0
  79. package/src/backups/dump.test.mjs +287 -0
  80. package/src/backups/dump.ts +288 -0
  81. package/src/backups/module.ts +276 -0
  82. package/src/backups/pack.ts +33 -0
  83. package/src/backups/restore.test.mjs +103 -0
  84. package/src/backups/restore.ts +209 -0
  85. package/src/backups/store.ts +409 -0
  86. package/src/breadcrumbs/pack.ts +113 -0
  87. package/src/breadcrumbs/settings.ts +102 -0
  88. package/src/breadcrumbs/stamp.ts +40 -0
  89. package/src/breadcrumbs/trail.ts +123 -0
  90. package/src/codeBlocks/contrast.ts +179 -0
  91. package/src/codeBlocks/hljs.d.ts +5 -0
  92. package/src/codeBlocks/pack.ts +110 -0
  93. package/src/codeBlocks/render.test.ts +152 -0
  94. package/src/codeBlocks/render.ts +304 -0
  95. package/src/codeBlocks/settings.ts +18 -0
  96. package/src/codeBlocks/themes.generated.ts +304 -0
  97. package/src/codeBlocks/themes.ts +114 -0
  98. package/src/core/compose.ts +244 -0
  99. package/src/core/content-url.ts +888 -0
  100. package/src/core/csv.ts +119 -0
  101. package/src/core/d1-batch.ts +65 -0
  102. package/src/core/entry-docs.ts +175 -0
  103. package/src/core/features-module.ts +48 -0
  104. package/src/core/features.ts +392 -0
  105. package/src/core/generation.ts +88 -0
  106. package/src/core/guide-content.ts +166 -0
  107. package/src/core/module.ts +104 -0
  108. package/src/core/read-failures.ts +57 -0
  109. package/src/core/request-memo.ts +71 -0
  110. package/src/core/secrets.ts +83 -0
  111. package/src/core/settings-enhance.ts +74 -0
  112. package/src/core/site.ts +36 -0
  113. package/src/core/storage.ts +27 -0
  114. package/src/customBlocks/pack.ts +260 -0
  115. package/src/customBlocks/render.ts +424 -0
  116. package/src/customBlocks/rich.ts +313 -0
  117. package/src/customBlocks/settings.ts +46 -0
  118. package/src/discovery/build.ts +252 -0
  119. package/src/discovery/feed-build.ts +217 -0
  120. package/src/discovery/feed.ts +172 -0
  121. package/src/discovery/indexnow.ts +114 -0
  122. package/src/discovery/llms.ts +79 -0
  123. package/src/discovery/markdown.ts +294 -0
  124. package/src/discovery/memory-cache.ts +97 -0
  125. package/src/discovery/middleware.ts +186 -0
  126. package/src/discovery/module.ts +353 -0
  127. package/src/discovery/news.ts +99 -0
  128. package/src/discovery/pack.ts +58 -0
  129. package/src/discovery/settings.ts +91 -0
  130. package/src/discovery/urls.ts +35 -0
  131. package/src/env.d.ts +10 -0
  132. package/src/files/card.ts +231 -0
  133. package/src/files/counts.test.ts +114 -0
  134. package/src/files/counts.ts +60 -0
  135. package/src/files/export.ts +44 -0
  136. package/src/files/format.test.ts +93 -0
  137. package/src/files/format.ts +163 -0
  138. package/src/files/module.ts +596 -0
  139. package/src/files/pack.ts +92 -0
  140. package/src/files/r2-rules.test.ts +30 -0
  141. package/src/files/r2-rules.ts +41 -0
  142. package/src/files/range.ts +50 -0
  143. package/src/files/s3.ts +114 -0
  144. package/src/files/serve.ts +141 -0
  145. package/src/files/sigv4.test.ts +64 -0
  146. package/src/files/sigv4.ts +160 -0
  147. package/src/files/site.ts +137 -0
  148. package/src/files/walker.ts +58 -0
  149. package/src/formUploads/lib.ts +266 -0
  150. package/src/formUploads/pack.ts +55 -0
  151. package/src/formUploads/wrap.ts +592 -0
  152. package/src/forms.ts +16 -0
  153. package/src/headings/headings.test.ts +159 -0
  154. package/src/headings/pack.ts +154 -0
  155. package/src/headings/render.ts +139 -0
  156. package/src/headings/settings.ts +117 -0
  157. package/src/headings/slug.ts +68 -0
  158. package/src/headings/stamp.ts +142 -0
  159. package/src/headings/test-hooks.mjs +14 -0
  160. package/src/headings/toc.ts +48 -0
  161. package/src/images/cloudflare.ts +329 -0
  162. package/src/images/lib.ts +221 -0
  163. package/src/images/module.ts +372 -0
  164. package/src/images/pack.ts +804 -0
  165. package/src/images/pending.ts +37 -0
  166. package/src/images/settings.ts +48 -0
  167. package/src/images/setup.ts +192 -0
  168. package/src/images/variants-estimate.ts +162 -0
  169. package/src/images/variants-store.ts +475 -0
  170. package/src/images/variants.ts +311 -0
  171. package/src/index.ts +143 -0
  172. package/src/links/check.ts +101 -0
  173. package/src/links/classify.ts +270 -0
  174. package/src/links/export.ts +59 -0
  175. package/src/links/module.ts +652 -0
  176. package/src/links/pack.ts +43 -0
  177. package/src/links/pt.ts +325 -0
  178. package/src/links/store.ts +704 -0
  179. package/src/middleware.ts +287 -0
  180. package/src/modules.ts +53 -0
  181. package/src/options.ts +66 -0
  182. package/src/pageCache/lib.test.mjs +224 -0
  183. package/src/pageCache/lib.ts +274 -0
  184. package/src/pageCache/pack.ts +240 -0
  185. package/src/pageCache/usage-core.ts +152 -0
  186. package/src/pageCache/usage.ts +262 -0
  187. package/src/pageCache/warm.test.mjs +670 -0
  188. package/src/pageCache/warm.ts +722 -0
  189. package/src/redirects/middleware.ts +169 -0
  190. package/src/redirects/module.ts +124 -0
  191. package/src/redirects/pack.ts +89 -0
  192. package/src/redirects/removed-core.ts +151 -0
  193. package/src/redirects/removed.ts +293 -0
  194. package/src/redirects/rules.ts +355 -0
  195. package/src/redirects/slug-changes.ts +207 -0
  196. package/src/redirects/slug-core.test.ts +50 -0
  197. package/src/redirects/slug-core.ts +49 -0
  198. package/src/redirects/transfer.ts +92 -0
  199. package/src/reviews/lib.ts +624 -0
  200. package/src/reviews/pack.ts +135 -0
  201. package/src/reviews/schema.ts +128 -0
  202. package/src/reviews/settings.ts +26 -0
  203. package/src/robots/bots.ts +321 -0
  204. package/src/robots/data/bots.json +696 -0
  205. package/src/robots/data/verified.json +582 -0
  206. package/src/robots/directory.ts +26 -0
  207. package/src/robots/explain.ts +191 -0
  208. package/src/robots/guided.ts +300 -0
  209. package/src/robots/importer.ts +263 -0
  210. package/src/robots/middleware.ts +151 -0
  211. package/src/robots/module.ts +446 -0
  212. package/src/robots/pack.ts +69 -0
  213. package/src/robots/radar.ts +129 -0
  214. package/src/robots/rep.test.ts +335 -0
  215. package/src/robots/rep.ts +362 -0
  216. package/src/robots/rules.test.ts +251 -0
  217. package/src/robots/rules.ts +883 -0
  218. package/src/robots/transfer.ts +45 -0
  219. package/src/robots/validate.ts +524 -0
  220. package/src/schema/catalog.ts +146 -0
  221. package/src/schema/graph.test.mjs +522 -0
  222. package/src/schema/graph.ts +791 -0
  223. package/src/schema/module.ts +1138 -0
  224. package/src/schema/og-image.ts +100 -0
  225. package/src/schema/pack.ts +58 -0
  226. package/src/search/engine.ts +578 -0
  227. package/src/search/fallback.ts +80 -0
  228. package/src/search/live-cache.ts +116 -0
  229. package/src/search/live-client.ts +770 -0
  230. package/src/search/live-serve.ts +282 -0
  231. package/src/search/module.ts +261 -0
  232. package/src/search/pack.ts +57 -0
  233. package/src/search/query.ts +132 -0
  234. package/src/search/ratelimit-core.ts +118 -0
  235. package/src/search/ratelimit.ts +79 -0
  236. package/src/search/snippet.ts +135 -0
  237. package/src/search/title-index.ts +139 -0
  238. package/src/search/title-match.ts +192 -0
  239. package/src/shared.ts +71 -0
  240. package/src/version.ts +2 -0
  241. package/src/videos/date.ts +40 -0
  242. package/src/videos/engagement.ts +75 -0
  243. package/src/videos/lib.ts +679 -0
  244. package/src/videos/module.ts +1160 -0
  245. package/src/videos/pack.ts +187 -0
  246. package/src/videos/pause.ts +42 -0
  247. package/src/videos/poster.ts +324 -0
  248. package/src/videos/render.ts +336 -0
  249. package/src/videos/store.ts +551 -0
  250. package/src/videos/stream.ts +134 -0
  251. package/src/wpImport/convert.ts +702 -0
  252. package/src/wpImport/guests.ts +329 -0
  253. package/src/wpImport/gutenberg.ts +157 -0
  254. package/src/wpImport/markers.ts +66 -0
  255. package/src/wpImport/pack.ts +451 -0
  256. package/src/wpImport/parents.ts +202 -0
  257. package/src/wpImport/prepare.ts +592 -0
  258. package/src/wpImport/redirects.ts +358 -0
  259. package/src/wpImport/sources.ts +67 -0
  260. package/src/wpImport/stream.ts +160 -0
  261. package/src/wpImport/urls.ts +354 -0
@@ -0,0 +1,582 @@
1
+ {
2
+ "$comment": "Hand-verified robots.txt tokens and corrections, merged by scripts/build-bots.mjs. Add an entry here (with the operator's documentation URL and the date you checked it) to verify a token.",
3
+ "manual": {
4
+ "gptbot": {
5
+ "token": "GPTBot",
6
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
7
+ "verifiedAt": "2026-10-03"
8
+ },
9
+ "oai-searchbot": {
10
+ "token": "OAI-SearchBot",
11
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
12
+ "verifiedAt": "2026-10-03"
13
+ },
14
+ "chatgpt-user": {
15
+ "token": "ChatGPT-User",
16
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
17
+ "verifiedAt": "2026-10-03"
18
+ },
19
+ "oai-adsbot": {
20
+ "token": "OAI-AdsBot",
21
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
22
+ "verifiedAt": "2026-10-03"
23
+ },
24
+ "claude-anthropic": {
25
+ "token": "ClaudeBot",
26
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
27
+ "verifiedAt": "2026-10-03"
28
+ },
29
+ "claude-user": {
30
+ "token": "Claude-User",
31
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
32
+ "verifiedAt": "2026-10-03"
33
+ },
34
+ "claude-searchbot": {
35
+ "token": "Claude-SearchBot",
36
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
37
+ "verifiedAt": "2026-10-03"
38
+ },
39
+ "google": {
40
+ "token": "Googlebot",
41
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
42
+ "verifiedAt": "2026-10-03"
43
+ },
44
+ "googlebotimages": {
45
+ "token": "Googlebot-Image",
46
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
47
+ "verifiedAt": "2026-10-03"
48
+ },
49
+ "googlebotvideos": {
50
+ "token": "Googlebot-Video",
51
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
52
+ "verifiedAt": "2026-10-03"
53
+ },
54
+ "storebot-google": {
55
+ "token": "Storebot-Google",
56
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
57
+ "verifiedAt": "2026-10-03"
58
+ },
59
+ "google-inspection-tool": {
60
+ "token": "Google-InspectionTool",
61
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
62
+ "verifiedAt": "2026-10-03"
63
+ },
64
+ "google-other": {
65
+ "token": "GoogleOther",
66
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
67
+ "verifiedAt": "2026-10-03"
68
+ },
69
+ "google-cloudvertexbot": {
70
+ "token": "Google-CloudVertexBot",
71
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
72
+ "verifiedAt": "2026-10-03"
73
+ },
74
+ "google-extended": {
75
+ "token": "Google-Extended",
76
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
77
+ "verifiedAt": "2026-10-03"
78
+ },
79
+ "googlebot-news": {
80
+ "token": "Googlebot-News",
81
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
82
+ "verifiedAt": "2026-10-03"
83
+ },
84
+ "googleother-image": {
85
+ "token": "GoogleOther-Image",
86
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
87
+ "verifiedAt": "2026-10-03"
88
+ },
89
+ "googleother-video": {
90
+ "token": "GoogleOther-Video",
91
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
92
+ "verifiedAt": "2026-10-03"
93
+ },
94
+ "bing": {
95
+ "token": "bingbot",
96
+ "sourceUrl": "https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0",
97
+ "verifiedAt": "2026-10-03"
98
+ },
99
+ "adidxbot": {
100
+ "token": "adidxbot",
101
+ "sourceUrl": "https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0",
102
+ "verifiedAt": "2026-10-03"
103
+ },
104
+ "microsoftpreview": {
105
+ "token": "MicrosoftPreview",
106
+ "sourceUrl": "https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0",
107
+ "verifiedAt": "2026-10-03"
108
+ },
109
+ "apple": {
110
+ "token": "Applebot",
111
+ "sourceUrl": "https://support.apple.com/en-us/119829",
112
+ "verifiedAt": "2026-10-03"
113
+ },
114
+ "applebot-extended": {
115
+ "token": "Applebot-Extended",
116
+ "sourceUrl": "https://support.apple.com/en-us/119829",
117
+ "verifiedAt": "2026-10-03"
118
+ },
119
+ "perplexitybot": {
120
+ "token": "PerplexityBot",
121
+ "sourceUrl": "https://docs.perplexity.ai/guides/bots",
122
+ "verifiedAt": "2026-10-03"
123
+ },
124
+ "perplexity-user": {
125
+ "token": "Perplexity-User",
126
+ "sourceUrl": "https://docs.perplexity.ai/guides/bots",
127
+ "verifiedAt": "2026-10-03"
128
+ },
129
+ "ccbot": {
130
+ "token": "CCBot",
131
+ "sourceUrl": "https://commoncrawl.org/ccbot",
132
+ "verifiedAt": "2026-10-03"
133
+ },
134
+ "amazon-bot": {
135
+ "token": "Amazonbot",
136
+ "sourceUrl": "https://developer.amazon.com/amazonbot",
137
+ "verifiedAt": "2026-10-03"
138
+ },
139
+ "amzn-searchbot": {
140
+ "token": "Amzn-SearchBot",
141
+ "sourceUrl": "https://developer.amazon.com/amazonbot",
142
+ "verifiedAt": "2026-10-03"
143
+ },
144
+ "amzn-user": {
145
+ "token": "Amzn-User",
146
+ "sourceUrl": "https://developer.amazon.com/amazonbot",
147
+ "verifiedAt": "2026-10-03"
148
+ },
149
+ "meta-externalagent": {
150
+ "token": "meta-externalagent",
151
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
152
+ "verifiedAt": "2026-10-03"
153
+ },
154
+ "meta-externalfetcher": {
155
+ "token": "meta-externalfetcher",
156
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
157
+ "verifiedAt": "2026-10-03"
158
+ },
159
+ "meta-externalads": {
160
+ "token": "meta-externalads",
161
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
162
+ "verifiedAt": "2026-10-03"
163
+ },
164
+ "meta-web-indexer": {
165
+ "token": "meta-webindexer",
166
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
167
+ "verifiedAt": "2026-10-03"
168
+ },
169
+ "facebook": {
170
+ "token": "facebookexternalhit",
171
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
172
+ "verifiedAt": "2026-10-03"
173
+ },
174
+ "duckassistbot": {
175
+ "token": "DuckAssistBot",
176
+ "sourceUrl": "https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot",
177
+ "verifiedAt": "2026-10-03"
178
+ },
179
+ "duckduckbot": {
180
+ "token": "DuckDuckBot",
181
+ "sourceUrl": "https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot",
182
+ "verifiedAt": "2026-10-03"
183
+ },
184
+ "yandex": {
185
+ "token": "YandexBot",
186
+ "sourceUrl": "https://yandex.com/support/webmaster/robot-workings/check-yandex-robots.html",
187
+ "verifiedAt": "2026-10-03"
188
+ },
189
+ "baidu": {
190
+ "token": "Baiduspider",
191
+ "sourceUrl": "https://help.baidu.com/question?prod_id=99&class=476&id=2996",
192
+ "verifiedAt": "2026-10-03"
193
+ },
194
+ "mistralai-user": {
195
+ "token": "MistralAI-User",
196
+ "sourceUrl": "https://docs.mistral.ai/robots",
197
+ "verifiedAt": "2026-10-03"
198
+ },
199
+ "mistralai-index": {
200
+ "token": "MistralAI-Index",
201
+ "sourceUrl": "https://docs.mistral.ai/robots",
202
+ "verifiedAt": "2026-10-03"
203
+ },
204
+ "mistralai-training": {
205
+ "token": "MistralAI-Training",
206
+ "sourceUrl": "https://docs.mistral.ai/robots",
207
+ "verifiedAt": "2026-10-03"
208
+ },
209
+ "webzio-extended": {
210
+ "token": "Webzio-Extended",
211
+ "sourceUrl": "https://webz.io/bot.html",
212
+ "verifiedAt": "2026-10-03"
213
+ },
214
+ "webzio": {
215
+ "token": "Webzio",
216
+ "sourceUrl": "https://webz.io/bot.html",
217
+ "verifiedAt": "2026-10-03"
218
+ },
219
+ "omgilibot": {
220
+ "token": "Omgilibot",
221
+ "sourceUrl": "https://webz.io/bot.html",
222
+ "verifiedAt": "2026-10-03"
223
+ },
224
+ "imagesiftbot": {
225
+ "token": "ImagesiftBot",
226
+ "sourceUrl": "https://www.imagesift.com/about",
227
+ "verifiedAt": "2026-10-03"
228
+ }
229
+ },
230
+ "userAgentVerified": {
231
+ "bytedance-toutiao": {
232
+ "token": "Bytespider",
233
+ "sourceUrl": "https://zhanzhang.toutiao.com/docs/intro/26899",
234
+ "verifiedAt": "2026-10-03",
235
+ "note": "ByteDance's webmaster docs (zhanzhang.toutiao.com) aren't reachable outside China; every Bytespider user agent carries the token, and ByteDance's docs instruct `User-agent: Bytespider`."
236
+ }
237
+ },
238
+ "unverified": {
239
+ "anthropic-ai": "Legacy Anthropic token; not in Anthropic's current crawler documentation (ClaudeBot, Claude-User, Claude-SearchBot).",
240
+ "claude-web": "Legacy Anthropic token; not in Anthropic's current crawler documentation.",
241
+ "facebookbot": "No longer listed in Meta's crawler documentation (meta-externalagent replaced it for AI training).",
242
+ "cohere-ai": "Cohere says it does not crawl for training and documents no token (its example uses a hypothetical Coherebot).",
243
+ "omgili": "Webz.io documents Omgilibot, Webzio and Webzio-Extended, not Omgili."
244
+ },
245
+ "exclude": {
246
+ "chatgpt-agent": "Signs its requests (Web Bot Auth); OpenAI documents no robots.txt token of its own."
247
+ },
248
+ "categoryFix": {
249
+ "perplexitybot": "AI_SEARCH"
250
+ },
251
+ "extra": [
252
+ {
253
+ "slug": "perplexity-user",
254
+ "name": "Perplexity-User",
255
+ "operator": "Perplexity AI",
256
+ "category": "AI_ASSISTANT",
257
+ "description": "Fetches pages when a Perplexity user asks a question about them."
258
+ },
259
+ {
260
+ "slug": "amzn-user",
261
+ "name": "Amzn-User",
262
+ "operator": "Amazon",
263
+ "category": "AI_ASSISTANT",
264
+ "description": "Supports user actions such as answering Alexa queries."
265
+ },
266
+ {
267
+ "slug": "mistralai-training",
268
+ "name": "MistralAI-Training",
269
+ "operator": "Mistral AI",
270
+ "category": "AI_CRAWLER",
271
+ "description": "Crawls web content to build datasets for training Mistral's generative AI models."
272
+ },
273
+ {
274
+ "slug": "googlebot-news",
275
+ "name": "Googlebot-News",
276
+ "operator": "Google",
277
+ "category": "SEARCH_ENGINE_CRAWLER",
278
+ "description": "Crawls news articles for Google News."
279
+ },
280
+ {
281
+ "slug": "googleother-image",
282
+ "name": "GoogleOther-Image",
283
+ "operator": "Google",
284
+ "category": "OTHER",
285
+ "description": "GoogleOther for images: one-off crawls by Google product teams."
286
+ },
287
+ {
288
+ "slug": "googleother-video",
289
+ "name": "GoogleOther-Video",
290
+ "operator": "Google",
291
+ "category": "OTHER",
292
+ "description": "GoogleOther for video: one-off crawls by Google product teams."
293
+ },
294
+ {
295
+ "slug": "webzio",
296
+ "name": "Webzio",
297
+ "operator": "Webz.io",
298
+ "category": "AGGREGATOR",
299
+ "description": "Webz.io's crawler that collects and structures web content."
300
+ }
301
+ ],
302
+ "purposes": {
303
+ "$comment": "What each preset bot is for, from the operator's documentation. Presets (src/robots/rules.ts CRAWLER_GROUPS) are built only from bots with a matching purpose and a verified token.",
304
+ "gptbot": {
305
+ "purpose": "training",
306
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
307
+ "note": "OpenAI: GPTBot crawls content that may be used to train generative AI models.",
308
+ "checkedAt": "2026-10-04"
309
+ },
310
+ "claude-anthropic": {
311
+ "purpose": "training",
312
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
313
+ "note": "Anthropic: ClaudeBot collects web content that could contribute to model training.",
314
+ "checkedAt": "2026-10-04"
315
+ },
316
+ "google-extended": {
317
+ "purpose": "training",
318
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
319
+ "note": "Google: Google-Extended controls whether content is used to train and ground Gemini models; it doesn't affect Search.",
320
+ "checkedAt": "2026-10-04"
321
+ },
322
+ "applebot-extended": {
323
+ "purpose": "training",
324
+ "sourceUrl": "https://support.apple.com/en-us/119829",
325
+ "note": "Apple: Applebot-Extended controls use of content to train Apple's foundation models.",
326
+ "checkedAt": "2026-10-04"
327
+ },
328
+ "ccbot": {
329
+ "purpose": "training",
330
+ "sourceUrl": "https://commoncrawl.org/ccbot",
331
+ "note": "Common Crawl's open web archive is a primary source of LLM training data.",
332
+ "checkedAt": "2026-10-04"
333
+ },
334
+ "meta-externalagent": {
335
+ "purpose": "training",
336
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
337
+ "note": "Meta: crawls for use cases such as training AI models.",
338
+ "checkedAt": "2026-10-04"
339
+ },
340
+ "bytedance-toutiao": {
341
+ "purpose": "training",
342
+ "sourceUrl": "https://zhanzhang.toutiao.com/docs/intro/26899",
343
+ "note": "ByteDance's crawler; widely documented as collecting data for its LLMs (Doubao).",
344
+ "checkedAt": "2026-10-04"
345
+ },
346
+ "amazon-bot": {
347
+ "purpose": "training",
348
+ "sourceUrl": "https://developer.amazon.com/amazonbot",
349
+ "note": "Amazon: Amazonbot content “may be used to train Amazon AI models”.",
350
+ "checkedAt": "2026-10-04"
351
+ },
352
+ "mistralai-training": {
353
+ "purpose": "training",
354
+ "sourceUrl": "https://docs.mistral.ai/robots",
355
+ "note": "Mistral: builds datasets for training its models.",
356
+ "checkedAt": "2026-10-04"
357
+ },
358
+ "webzio-extended": {
359
+ "purpose": "training",
360
+ "sourceUrl": "https://webz.io/bot.html",
361
+ "note": "Webz.io: Webzio-Extended governs whether content may be used for AI/ML training.",
362
+ "checkedAt": "2026-10-04"
363
+ },
364
+ "imagesiftbot": {
365
+ "purpose": "other",
366
+ "sourceUrl": "https://www.imagesift.com/about",
367
+ "note": "ImageSift: indexes images for its search and retrieval products; no training use documented.",
368
+ "checkedAt": "2026-10-04"
369
+ },
370
+ "diffbot": {
371
+ "purpose": "other",
372
+ "sourceUrl": "https://www.diffbot.com/docs/crawl/faq/robots-txt",
373
+ "note": "Diffbot: “does not crawl pages for training generative AI foundation models.”",
374
+ "checkedAt": "2026-10-04"
375
+ },
376
+ "omgilibot": {
377
+ "purpose": "other",
378
+ "sourceUrl": "https://webz.io/bot.html",
379
+ "note": "Webz.io's legacy data crawler; Webz.io's AI-training token is Webzio-Extended.",
380
+ "checkedAt": "2026-10-04"
381
+ },
382
+ "timpibot": {
383
+ "purpose": "search-engine",
384
+ "sourceUrl": "https://timpi.io",
385
+ "note": "Timpi's decentralized search engine index; no operator robots.txt documentation found. Left out of the search-engine preset until Timpi documents its token.",
386
+ "checkedAt": "2026-10-04",
387
+ "inPresets": false
388
+ },
389
+ "img2dataset": {
390
+ "purpose": "other",
391
+ "sourceUrl": "https://github.com/rom1504/img2dataset",
392
+ "note": "A dataset download tool, not a crawler with an operator; it doesn't read robots.txt.",
393
+ "checkedAt": "2026-10-04"
394
+ },
395
+ "anthropic-ai": {
396
+ "purpose": "other",
397
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
398
+ "note": "Legacy token; not in Anthropic's current documentation.",
399
+ "checkedAt": "2026-10-04"
400
+ },
401
+ "google-other": {
402
+ "purpose": "other",
403
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
404
+ "note": "Google: generic crawler for one-off product-team fetches; not Search, not Gemini training.",
405
+ "checkedAt": "2026-10-04"
406
+ },
407
+ "google": {
408
+ "purpose": "search-engine",
409
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
410
+ "note": "Google Search.",
411
+ "checkedAt": "2026-10-04"
412
+ },
413
+ "googlebotimages": {
414
+ "purpose": "search-engine",
415
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
416
+ "note": "Google Images.",
417
+ "checkedAt": "2026-10-04"
418
+ },
419
+ "googlebotvideos": {
420
+ "purpose": "search-engine",
421
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
422
+ "note": "Google Video search.",
423
+ "checkedAt": "2026-10-04"
424
+ },
425
+ "googlebot-news": {
426
+ "purpose": "search-engine",
427
+ "sourceUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
428
+ "note": "Google News.",
429
+ "checkedAt": "2026-10-04"
430
+ },
431
+ "bing": {
432
+ "purpose": "search-engine",
433
+ "sourceUrl": "https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0",
434
+ "note": "Bing search.",
435
+ "checkedAt": "2026-10-04"
436
+ },
437
+ "apple": {
438
+ "purpose": "search-engine",
439
+ "sourceUrl": "https://support.apple.com/en-us/119829",
440
+ "note": "Applebot powers Spotlight, Siri and Safari search.",
441
+ "checkedAt": "2026-10-04"
442
+ },
443
+ "duckduckbot": {
444
+ "purpose": "search-engine",
445
+ "sourceUrl": "https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot",
446
+ "note": "DuckDuckGo search.",
447
+ "checkedAt": "2026-10-04"
448
+ },
449
+ "yandex": {
450
+ "purpose": "search-engine",
451
+ "sourceUrl": "https://yandex.com/support/webmaster/robot-workings/check-yandex-robots.html",
452
+ "note": "Yandex search.",
453
+ "checkedAt": "2026-10-04"
454
+ },
455
+ "baidu": {
456
+ "purpose": "search-engine",
457
+ "sourceUrl": "https://help.baidu.com/question?prod_id=99&class=476&id=2996",
458
+ "note": "Baidu search.",
459
+ "checkedAt": "2026-10-04"
460
+ },
461
+ "petalbot": {
462
+ "purpose": "search-engine",
463
+ "sourceUrl": "https://webmaster.petalsearch.com/site/petalbot",
464
+ "note": "Huawei Petal Search.",
465
+ "checkedAt": "2026-10-04"
466
+ },
467
+ "oai-searchbot": {
468
+ "purpose": "ai-search",
469
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
470
+ "note": "ChatGPT search results; not used for training.",
471
+ "checkedAt": "2026-10-04"
472
+ },
473
+ "claude-searchbot": {
474
+ "purpose": "ai-search",
475
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
476
+ "note": "Improves Claude's search results.",
477
+ "checkedAt": "2026-10-04"
478
+ },
479
+ "perplexitybot": {
480
+ "purpose": "ai-search",
481
+ "sourceUrl": "https://docs.perplexity.ai/guides/bots",
482
+ "note": "Perplexity search index; not used for training.",
483
+ "checkedAt": "2026-10-04"
484
+ },
485
+ "amzn-searchbot": {
486
+ "purpose": "ai-search",
487
+ "sourceUrl": "https://developer.amazon.com/amazonbot",
488
+ "note": "Amazon search experiences (Alexa, Rufus); not used for training.",
489
+ "checkedAt": "2026-10-04"
490
+ },
491
+ "mistralai-index": {
492
+ "purpose": "ai-search",
493
+ "sourceUrl": "https://docs.mistral.ai/robots",
494
+ "note": "Mistral's search index for Le Chat.",
495
+ "checkedAt": "2026-10-04"
496
+ },
497
+ "chatgpt-user": {
498
+ "purpose": "ai-assistant",
499
+ "sourceUrl": "https://developers.openai.com/api/docs/bots",
500
+ "note": "Fetches pages when ChatGPT users ask.",
501
+ "checkedAt": "2026-10-04"
502
+ },
503
+ "claude-user": {
504
+ "purpose": "ai-assistant",
505
+ "sourceUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
506
+ "note": "Fetches pages when Claude users ask.",
507
+ "checkedAt": "2026-10-04"
508
+ },
509
+ "perplexity-user": {
510
+ "purpose": "ai-assistant",
511
+ "sourceUrl": "https://docs.perplexity.ai/guides/bots",
512
+ "note": "Fetches pages when Perplexity users ask.",
513
+ "checkedAt": "2026-10-04"
514
+ },
515
+ "meta-externalfetcher": {
516
+ "purpose": "ai-assistant",
517
+ "sourceUrl": "https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers",
518
+ "note": "Fetches links on behalf of Meta AI users.",
519
+ "checkedAt": "2026-10-04"
520
+ },
521
+ "mistralai-user": {
522
+ "purpose": "ai-assistant",
523
+ "sourceUrl": "https://docs.mistral.ai/robots",
524
+ "note": "Fetches pages when Le Chat users ask.",
525
+ "checkedAt": "2026-10-04"
526
+ },
527
+ "duckassistbot": {
528
+ "purpose": "ai-assistant",
529
+ "sourceUrl": "https://duckduckgo.com/duckduckgo-help-pages/results/duckassistbot",
530
+ "note": "DuckDuckGo's AI-assisted answers.",
531
+ "checkedAt": "2026-10-04"
532
+ },
533
+ "amzn-user": {
534
+ "purpose": "ai-assistant",
535
+ "sourceUrl": "https://developer.amazon.com/amazonbot",
536
+ "note": "Fetches pages for Alexa user requests.",
537
+ "checkedAt": "2026-10-04"
538
+ },
539
+ "ahrefsbot": {
540
+ "purpose": "seo",
541
+ "sourceUrl": "https://ahrefs.com/robot",
542
+ "note": "Ahrefs backlink index.",
543
+ "checkedAt": "2026-10-04"
544
+ },
545
+ "semrush-bl": {
546
+ "purpose": "seo",
547
+ "sourceUrl": "https://www.semrush.com/bot/",
548
+ "note": "Semrush backlink index.",
549
+ "checkedAt": "2026-10-04"
550
+ },
551
+ "mj12bot": {
552
+ "purpose": "seo",
553
+ "sourceUrl": "https://majestic.com/",
554
+ "note": "Majestic backlink index.",
555
+ "checkedAt": "2026-10-04"
556
+ },
557
+ "dotbot": {
558
+ "purpose": "seo",
559
+ "sourceUrl": "https://moz.com/link-explorer",
560
+ "note": "Moz link index.",
561
+ "checkedAt": "2026-10-04"
562
+ },
563
+ "blexbot": {
564
+ "purpose": "seo",
565
+ "sourceUrl": "http://webmeup.com/",
566
+ "note": "WebMeUp backlink index.",
567
+ "checkedAt": "2026-10-04"
568
+ },
569
+ "dataforseo-bot": {
570
+ "purpose": "seo",
571
+ "sourceUrl": "https://dataforseo.com/dataforseo-bot",
572
+ "note": "DataForSEO.",
573
+ "checkedAt": "2026-10-04"
574
+ },
575
+ "babbar-barkrowler": {
576
+ "purpose": "seo",
577
+ "sourceUrl": "https://babbar.tech/crawler",
578
+ "note": "Babbar SEO index.",
579
+ "checkedAt": "2026-10-04"
580
+ }
581
+ }
582
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The bundled crawler directory (see ./bots.ts and README → Robots.txt Rules
3
+ * for how it was built). About 270 KB of JSON, so it's loaded on first use by
4
+ * the admin routes and the Radar sync, never by the robots.txt middleware or
5
+ * page requests.
6
+ */
7
+ import type { BotEntry } from "./bots.js";
8
+
9
+ type Directory = { generatedAt: string; bots: BotEntry[] };
10
+
11
+ let loading: Promise<Directory> | null = null;
12
+
13
+ function directory(): Promise<Directory> {
14
+ loading ??= import("./data/bots.json", { with: { type: "json" } }).then((m) => m.default as Directory);
15
+ return loading;
16
+ }
17
+
18
+ /** The bundled directory's crawlers. */
19
+ export async function baselineBots(): Promise<BotEntry[]> {
20
+ return (await directory()).bots;
21
+ }
22
+
23
+ /** When the bundled directory was built. */
24
+ export async function baselineDate(): Promise<string> {
25
+ return (await directory()).generatedAt;
26
+ }