yuzuha 0.1.7 → 0.2.1

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 (426) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +21 -4
  3. package/VERSIONING.md +100 -6
  4. package/assets/canvas/Inter-Bold.ttf +0 -0
  5. package/assets/canvas/Inter-Regular.ttf +0 -0
  6. package/assets/canvas/OFL.txt +92 -0
  7. package/assets/canvas/ORIGIN.md +8 -0
  8. package/benchmarks/rate-limits.mjs +138 -0
  9. package/benchmarks/results/rate-limits-comparison.json +273 -0
  10. package/bridges/lavalink/README.md +2 -2
  11. package/dist/canvas.d.ts +10 -0
  12. package/dist/canvas.d.ts.map +1 -0
  13. package/dist/canvas.js +11 -0
  14. package/dist/canvas.js.map +1 -0
  15. package/dist/cli/arguments.d.ts +5 -0
  16. package/dist/cli/arguments.d.ts.map +1 -1
  17. package/dist/cli/arguments.js +31 -6
  18. package/dist/cli/arguments.js.map +1 -1
  19. package/dist/cli/bot-template-catalog.d.ts +33 -0
  20. package/dist/cli/bot-template-catalog.d.ts.map +1 -0
  21. package/dist/cli/bot-template-catalog.js +20 -0
  22. package/dist/cli/bot-template-catalog.js.map +1 -0
  23. package/dist/cli/bot-template-commands.d.ts +2 -0
  24. package/dist/cli/bot-template-commands.d.ts.map +1 -0
  25. package/dist/cli/bot-template-commands.js +358 -0
  26. package/dist/cli/bot-template-commands.js.map +1 -0
  27. package/dist/cli/bot-template-content.d.ts +13 -0
  28. package/dist/cli/bot-template-content.d.ts.map +1 -0
  29. package/dist/cli/bot-template-content.js +69 -0
  30. package/dist/cli/bot-template-content.js.map +1 -0
  31. package/dist/cli/bot-template-feature-tests.d.ts +2 -0
  32. package/dist/cli/bot-template-feature-tests.d.ts.map +1 -0
  33. package/dist/cli/bot-template-feature-tests.js +165 -0
  34. package/dist/cli/bot-template-feature-tests.js.map +1 -0
  35. package/dist/cli/bot-template-tests.d.ts +3 -0
  36. package/dist/cli/bot-template-tests.d.ts.map +1 -0
  37. package/dist/cli/bot-template-tests.js +67 -0
  38. package/dist/cli/bot-template-tests.js.map +1 -0
  39. package/dist/cli/bot-templates.d.ts +3 -0
  40. package/dist/cli/bot-templates.d.ts.map +1 -0
  41. package/dist/cli/bot-templates.js +154 -0
  42. package/dist/cli/bot-templates.js.map +1 -0
  43. package/dist/cli/main.d.ts.map +1 -1
  44. package/dist/cli/main.js +7 -1
  45. package/dist/cli/main.js.map +1 -1
  46. package/dist/cli/scaffold.d.ts +3 -1
  47. package/dist/cli/scaffold.d.ts.map +1 -1
  48. package/dist/cli/scaffold.js +26 -8
  49. package/dist/cli/scaffold.js.map +1 -1
  50. package/dist/cli.js +1 -1
  51. package/dist/cli.js.map +1 -1
  52. package/dist/commands/arguments.js +2 -2
  53. package/dist/commands/arguments.js.map +1 -1
  54. package/dist/commands/context.d.ts +11 -0
  55. package/dist/commands/context.d.ts.map +1 -1
  56. package/dist/commands/context.js +19 -1
  57. package/dist/commands/context.js.map +1 -1
  58. package/dist/contracts.d.ts +1 -1
  59. package/dist/contracts.d.ts.map +1 -1
  60. package/dist/contracts.js.map +1 -1
  61. package/dist/domain/canvas.d.ts +240 -0
  62. package/dist/domain/canvas.d.ts.map +1 -0
  63. package/dist/domain/canvas.js +226 -0
  64. package/dist/domain/canvas.js.map +1 -0
  65. package/dist/domain/embeds.d.ts +36 -0
  66. package/dist/domain/embeds.d.ts.map +1 -0
  67. package/dist/domain/embeds.js +259 -0
  68. package/dist/domain/embeds.js.map +1 -0
  69. package/dist/domain/message-query.d.ts +39 -0
  70. package/dist/domain/message-query.d.ts.map +1 -0
  71. package/dist/domain/message-query.js +108 -0
  72. package/dist/domain/message-query.js.map +1 -0
  73. package/dist/domain/messages.d.ts +89 -13
  74. package/dist/domain/messages.d.ts.map +1 -1
  75. package/dist/domain/messages.js.map +1 -1
  76. package/dist/framework/bot.d.ts +2 -1
  77. package/dist/framework/bot.d.ts.map +1 -1
  78. package/dist/framework/bot.js +34 -3
  79. package/dist/framework/bot.js.map +1 -1
  80. package/dist/framework/events.d.ts +12 -0
  81. package/dist/framework/events.d.ts.map +1 -1
  82. package/dist/framework/events.js.map +1 -1
  83. package/dist/framework/options.d.ts +2 -0
  84. package/dist/framework/options.d.ts.map +1 -1
  85. package/dist/framework/options.js.map +1 -1
  86. package/dist/framework/rate-limits.d.ts +1 -0
  87. package/dist/framework/rate-limits.d.ts.map +1 -1
  88. package/dist/framework/rate-limits.js +18 -8
  89. package/dist/framework/rate-limits.js.map +1 -1
  90. package/dist/index.d.ts +9 -4
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +1 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/infrastructure/canvas/render.d.ts +3 -0
  95. package/dist/infrastructure/canvas/render.d.ts.map +1 -0
  96. package/dist/infrastructure/canvas/render.js +118 -0
  97. package/dist/infrastructure/canvas/render.js.map +1 -0
  98. package/dist/infrastructure/canvas/worker.mjs +286 -0
  99. package/dist/infrastructure/fluxer/payload.d.ts +6 -1
  100. package/dist/infrastructure/fluxer/payload.d.ts.map +1 -1
  101. package/dist/infrastructure/fluxer/payload.js +58 -19
  102. package/dist/infrastructure/fluxer/payload.js.map +1 -1
  103. package/dist/infrastructure/fluxer/resources/cache.d.ts +4 -0
  104. package/dist/infrastructure/fluxer/resources/cache.d.ts.map +1 -0
  105. package/dist/infrastructure/fluxer/resources/cache.js +51 -0
  106. package/dist/infrastructure/fluxer/resources/cache.js.map +1 -0
  107. package/dist/infrastructure/fluxer/resources/collectors.d.ts.map +1 -1
  108. package/dist/infrastructure/fluxer/resources/collectors.js +86 -4
  109. package/dist/infrastructure/fluxer/resources/collectors.js.map +1 -1
  110. package/dist/infrastructure/fluxer/resources/gateway.d.ts +4 -0
  111. package/dist/infrastructure/fluxer/resources/gateway.d.ts.map +1 -0
  112. package/dist/infrastructure/fluxer/resources/gateway.js +31 -0
  113. package/dist/infrastructure/fluxer/resources/gateway.js.map +1 -0
  114. package/dist/infrastructure/fluxer/resources/instance.d.ts +4 -0
  115. package/dist/infrastructure/fluxer/resources/instance.d.ts.map +1 -0
  116. package/dist/infrastructure/fluxer/resources/instance.js +96 -0
  117. package/dist/infrastructure/fluxer/resources/instance.js.map +1 -0
  118. package/dist/infrastructure/fluxer/resources/messages.d.ts +3 -1
  119. package/dist/infrastructure/fluxer/resources/messages.d.ts.map +1 -1
  120. package/dist/infrastructure/fluxer/resources/messages.js +86 -15
  121. package/dist/infrastructure/fluxer/resources/messages.js.map +1 -1
  122. package/dist/infrastructure/fluxer/resources/self.d.ts +4 -0
  123. package/dist/infrastructure/fluxer/resources/self.d.ts.map +1 -0
  124. package/dist/infrastructure/fluxer/resources/self.js +36 -0
  125. package/dist/infrastructure/fluxer/resources/self.js.map +1 -0
  126. package/dist/infrastructure/fluxer/resources/threads.d.ts.map +1 -1
  127. package/dist/infrastructure/fluxer/resources/threads.js +9 -0
  128. package/dist/infrastructure/fluxer/resources/threads.js.map +1 -1
  129. package/dist/infrastructure/fluxer/resources/users.d.ts +4 -2
  130. package/dist/infrastructure/fluxer/resources/users.d.ts.map +1 -1
  131. package/dist/infrastructure/fluxer/resources/users.js +2 -2
  132. package/dist/infrastructure/fluxer/resources/users.js.map +1 -1
  133. package/dist/infrastructure/fluxer/resources.d.ts +4 -0
  134. package/dist/infrastructure/fluxer/resources.d.ts.map +1 -1
  135. package/dist/infrastructure/fluxer/resources.js +12 -0
  136. package/dist/infrastructure/fluxer/resources.js.map +1 -1
  137. package/dist/infrastructure/fluxer/transport.d.ts.map +1 -1
  138. package/dist/infrastructure/fluxer/transport.js +9 -5
  139. package/dist/infrastructure/fluxer/transport.js.map +1 -1
  140. package/dist/infrastructure/images/transform.d.ts.map +1 -1
  141. package/dist/infrastructure/images/transform.js +14 -9
  142. package/dist/infrastructure/images/transform.js.map +1 -1
  143. package/dist/infrastructure/process-budget.d.ts +3 -0
  144. package/dist/infrastructure/process-budget.d.ts.map +1 -0
  145. package/dist/infrastructure/process-budget.js +17 -0
  146. package/dist/infrastructure/process-budget.js.map +1 -0
  147. package/dist/ports/canvas.d.ts +5 -0
  148. package/dist/ports/canvas.d.ts.map +1 -0
  149. package/dist/ports/canvas.js +2 -0
  150. package/dist/ports/canvas.js.map +1 -0
  151. package/dist/ports/resources/cache.d.ts +52 -0
  152. package/dist/ports/resources/cache.d.ts.map +1 -0
  153. package/dist/ports/resources/cache.js +2 -0
  154. package/dist/ports/resources/cache.js.map +1 -0
  155. package/dist/ports/resources/collectors.d.ts +18 -0
  156. package/dist/ports/resources/collectors.d.ts.map +1 -1
  157. package/dist/ports/resources/collectors.js.map +1 -1
  158. package/dist/ports/resources/gateway.d.ts +48 -0
  159. package/dist/ports/resources/gateway.d.ts.map +1 -0
  160. package/dist/ports/resources/gateway.js +2 -0
  161. package/dist/ports/resources/gateway.js.map +1 -0
  162. package/dist/ports/resources/instance.d.ts +101 -0
  163. package/dist/ports/resources/instance.d.ts.map +1 -0
  164. package/dist/ports/resources/instance.js +2 -0
  165. package/dist/ports/resources/instance.js.map +1 -0
  166. package/dist/ports/resources/messages.d.ts +37 -7
  167. package/dist/ports/resources/messages.d.ts.map +1 -1
  168. package/dist/ports/resources/messages.js.map +1 -1
  169. package/dist/ports/resources/self.d.ts +30 -0
  170. package/dist/ports/resources/self.d.ts.map +1 -0
  171. package/dist/ports/resources/self.js +2 -0
  172. package/dist/ports/resources/self.js.map +1 -0
  173. package/dist/ports/resources/threads.d.ts +6 -0
  174. package/dist/ports/resources/threads.d.ts.map +1 -1
  175. package/dist/ports/resources/threads.js.map +1 -1
  176. package/dist/ports/resources.d.ts +8 -0
  177. package/dist/ports/resources.d.ts.map +1 -1
  178. package/dist/ports/resources.js.map +1 -1
  179. package/dist/scripting/builtins/canvas.d.ts +2 -0
  180. package/dist/scripting/builtins/canvas.d.ts.map +1 -0
  181. package/dist/scripting/builtins/canvas.js +118 -0
  182. package/dist/scripting/builtins/canvas.js.map +1 -0
  183. package/dist/scripting/builtins/embeds.d.ts +1 -2
  184. package/dist/scripting/builtins/embeds.d.ts.map +1 -1
  185. package/dist/scripting/builtins/embeds.js +90 -35
  186. package/dist/scripting/builtins/embeds.js.map +1 -1
  187. package/dist/scripting/builtins/index.d.ts.map +1 -1
  188. package/dist/scripting/builtins/index.js +4 -1
  189. package/dist/scripting/builtins/index.js.map +1 -1
  190. package/dist/scripting/builtins/language/objects.d.ts.map +1 -1
  191. package/dist/scripting/builtins/language/objects.js +2 -1
  192. package/dist/scripting/builtins/language/objects.js.map +1 -1
  193. package/dist/scripting/builtins/language/state.d.ts.map +1 -1
  194. package/dist/scripting/builtins/language/state.js +14 -9
  195. package/dist/scripting/builtins/language/state.js.map +1 -1
  196. package/dist/scripting/builtins/messages.js +3 -3
  197. package/dist/scripting/builtins/messages.js.map +1 -1
  198. package/dist/scripting/builtins/native-expressions.d.ts.map +1 -1
  199. package/dist/scripting/builtins/native-expressions.js +3 -1
  200. package/dist/scripting/builtins/native-expressions.js.map +1 -1
  201. package/dist/scripting/builtins/native-messages.d.ts.map +1 -1
  202. package/dist/scripting/builtins/native-messages.js +17 -0
  203. package/dist/scripting/builtins/native-messages.js.map +1 -1
  204. package/dist/scripting/builtins/native-threads.d.ts.map +1 -1
  205. package/dist/scripting/builtins/native-threads.js +8 -0
  206. package/dist/scripting/builtins/native-threads.js.map +1 -1
  207. package/dist/scripting/builtins/payload.d.ts +4 -1
  208. package/dist/scripting/builtins/payload.d.ts.map +1 -1
  209. package/dist/scripting/builtins/payload.js +127 -5
  210. package/dist/scripting/builtins/payload.js.map +1 -1
  211. package/dist/scripting/builtins/resource-extras.d.ts.map +1 -1
  212. package/dist/scripting/builtins/resource-extras.js +10 -2
  213. package/dist/scripting/builtins/resource-extras.js.map +1 -1
  214. package/dist/scripting/canvas-execution.d.ts +12 -0
  215. package/dist/scripting/canvas-execution.d.ts.map +1 -0
  216. package/dist/scripting/canvas-execution.js +14 -0
  217. package/dist/scripting/canvas-execution.js.map +1 -0
  218. package/dist/scripting/evaluator.d.ts +3 -0
  219. package/dist/scripting/evaluator.d.ts.map +1 -1
  220. package/dist/scripting/evaluator.js +45 -25
  221. package/dist/scripting/evaluator.js.map +1 -1
  222. package/dist/sdk/builders.d.ts +2 -0
  223. package/dist/sdk/builders.d.ts.map +1 -0
  224. package/dist/sdk/builders.js +2 -0
  225. package/dist/sdk/builders.js.map +1 -0
  226. package/dist/sdk/client.d.ts +2 -0
  227. package/dist/sdk/client.d.ts.map +1 -0
  228. package/dist/sdk/client.js +2 -0
  229. package/dist/sdk/client.js.map +1 -0
  230. package/dist/sdk/cluster.d.ts +2 -0
  231. package/dist/sdk/cluster.d.ts.map +1 -0
  232. package/dist/sdk/cluster.js +2 -0
  233. package/dist/sdk/cluster.js.map +1 -0
  234. package/dist/sdk/collection.d.ts +2 -0
  235. package/dist/sdk/collection.d.ts.map +1 -0
  236. package/dist/sdk/collection.js +2 -0
  237. package/dist/sdk/collection.js.map +1 -0
  238. package/dist/sdk/errors.d.ts +2 -0
  239. package/dist/sdk/errors.d.ts.map +1 -0
  240. package/dist/sdk/errors.js +2 -0
  241. package/dist/sdk/errors.js.map +1 -0
  242. package/dist/sdk/internal.d.ts +2 -0
  243. package/dist/sdk/internal.d.ts.map +1 -0
  244. package/dist/sdk/internal.js +2 -0
  245. package/dist/sdk/internal.js.map +1 -0
  246. package/dist/sdk/message.d.ts +2 -0
  247. package/dist/sdk/message.d.ts.map +1 -0
  248. package/dist/sdk/message.js +2 -0
  249. package/dist/sdk/message.js.map +1 -0
  250. package/dist/sdk/rest/request-manager.d.ts +2 -0
  251. package/dist/sdk/rest/request-manager.d.ts.map +1 -0
  252. package/dist/sdk/rest/request-manager.js +2 -0
  253. package/dist/sdk/rest/request-manager.js.map +1 -0
  254. package/dist/sdk/rest.d.ts +2 -0
  255. package/dist/sdk/rest.d.ts.map +1 -0
  256. package/dist/sdk/rest.js +2 -0
  257. package/dist/sdk/rest.js.map +1 -0
  258. package/dist/sdk/sharding.d.ts +2 -0
  259. package/dist/sdk/sharding.d.ts.map +1 -0
  260. package/dist/sdk/sharding.js +2 -0
  261. package/dist/sdk/sharding.js.map +1 -0
  262. package/dist/sdk/types/routes.d.ts +2 -0
  263. package/dist/sdk/types/routes.d.ts.map +1 -0
  264. package/dist/sdk/types/routes.js +2 -0
  265. package/dist/sdk/types/routes.js.map +1 -0
  266. package/dist/sdk/types.d.ts +2 -0
  267. package/dist/sdk/types.d.ts.map +1 -0
  268. package/dist/sdk/types.js +2 -0
  269. package/dist/sdk/types.js.map +1 -0
  270. package/dist/sdk/util.d.ts +2 -0
  271. package/dist/sdk/util.d.ts.map +1 -0
  272. package/dist/sdk/util.js +2 -0
  273. package/dist/sdk/util.js.map +1 -0
  274. package/dist/sdk/voice.d.ts +2 -0
  275. package/dist/sdk/voice.d.ts.map +1 -0
  276. package/dist/sdk/voice.js +2 -0
  277. package/dist/sdk/voice.js.map +1 -0
  278. package/dist/sdk/ws.d.ts +2 -0
  279. package/dist/sdk/ws.d.ts.map +1 -0
  280. package/dist/sdk/ws.js +2 -0
  281. package/dist/sdk/ws.js.map +1 -0
  282. package/dist/services/attachments.d.ts.map +1 -1
  283. package/dist/services/attachments.js +6 -4
  284. package/dist/services/attachments.js.map +1 -1
  285. package/dist/services/canvas.d.ts +43 -0
  286. package/dist/services/canvas.d.ts.map +1 -0
  287. package/dist/services/canvas.js +587 -0
  288. package/dist/services/canvas.js.map +1 -0
  289. package/dist/services/http.d.ts.map +1 -1
  290. package/dist/services/http.js +34 -44
  291. package/dist/services/http.js.map +1 -1
  292. package/dist/services/resource-authorization.d.ts.map +1 -1
  293. package/dist/services/resource-authorization.js +39 -7
  294. package/dist/services/resource-authorization.js.map +1 -1
  295. package/dist/testing.d.ts.map +1 -1
  296. package/dist/testing.js +4 -0
  297. package/dist/testing.js.map +1 -1
  298. package/docs/API.md +13 -2
  299. package/docs/ARCHITECTURE.md +1 -1
  300. package/docs/BENCHMARKS.md +35 -0
  301. package/docs/BOT-BASES.md +168 -0
  302. package/docs/CANVAS.md +274 -0
  303. package/docs/CLI.md +26 -3
  304. package/docs/EMBEDS.md +153 -0
  305. package/docs/FUNCTION-GAPS.md +13 -7
  306. package/docs/FUNCTIONS.md +41 -6
  307. package/docs/HTTP.md +18 -0
  308. package/docs/IMAGES.md +13 -8
  309. package/docs/LANGUAGE.md +37 -0
  310. package/docs/MUSIC.md +3 -3
  311. package/docs/NATIVE.md +67 -7
  312. package/docs/PARITY-MATRIX.md +952 -0
  313. package/docs/PARITY.md +46 -18
  314. package/docs/PLAN.md +40 -1
  315. package/docs/QUICKSTART.md +18 -2
  316. package/docs/README.md +7 -2
  317. package/docs/STORAGE.md +3 -1
  318. package/docs/VALIDATION.md +55 -0
  319. package/editors/vscode/functions.json +248 -8
  320. package/editors/vscode/package.json +1 -1
  321. package/examples/canvas/fixtures/avatar.png +0 -0
  322. package/examples/canvas/functions/profile.yuzuha +15 -0
  323. package/examples/canvas/functions/ranking.yuzuha +46 -0
  324. package/examples/canvas/functions/welcome.yuzuha +10 -0
  325. package/examples/canvas/output/function-profile.png +0 -0
  326. package/examples/canvas/output/function-ranking.png +0 -0
  327. package/examples/canvas/output/function-welcome.png +0 -0
  328. package/examples/canvas/output/js-profile.png +0 -0
  329. package/examples/canvas/output/js-ranking.png +0 -0
  330. package/examples/canvas/output/js-welcome.png +0 -0
  331. package/examples/canvas/output/profile.png +0 -0
  332. package/examples/canvas/output/ranking.png +0 -0
  333. package/examples/canvas/output/welcome.png +0 -0
  334. package/examples/canvas/profile.d.mts +3 -0
  335. package/examples/canvas/profile.mjs +20 -0
  336. package/examples/canvas/profile.ts +34 -0
  337. package/examples/canvas/ranking.d.mts +5 -0
  338. package/examples/canvas/ranking.mjs +25 -0
  339. package/examples/canvas/ranking.ts +40 -0
  340. package/examples/canvas/render.ts +48 -0
  341. package/examples/canvas/welcome.d.mts +3 -0
  342. package/examples/canvas/welcome.mjs +14 -0
  343. package/examples/canvas/welcome.ts +27 -0
  344. package/examples/embeds/complete-embed-functions.ts +31 -0
  345. package/examples/embeds/complete-embed.ts +33 -0
  346. package/package.json +37 -5
  347. package/src/canvas.ts +20 -0
  348. package/src/cli/arguments.ts +26 -7
  349. package/src/cli/bot-template-catalog.ts +23 -0
  350. package/src/cli/bot-template-commands.ts +357 -0
  351. package/src/cli/bot-template-content.ts +66 -0
  352. package/src/cli/bot-template-feature-tests.ts +159 -0
  353. package/src/cli/bot-template-tests.ts +68 -0
  354. package/src/cli/bot-templates.ts +155 -0
  355. package/src/cli/main.ts +7 -1
  356. package/src/cli/scaffold.ts +29 -8
  357. package/src/cli.ts +1 -1
  358. package/src/commands/arguments.ts +3 -3
  359. package/src/commands/context.ts +21 -1
  360. package/src/contracts.ts +1 -1
  361. package/src/domain/canvas.ts +259 -0
  362. package/src/domain/embeds.ts +218 -0
  363. package/src/domain/message-query.ts +142 -0
  364. package/src/domain/messages.ts +89 -4
  365. package/src/framework/bot.ts +30 -5
  366. package/src/framework/events.ts +12 -0
  367. package/src/framework/options.ts +2 -0
  368. package/src/framework/rate-limits.ts +16 -7
  369. package/src/index.ts +12 -4
  370. package/src/infrastructure/canvas/render.ts +100 -0
  371. package/src/infrastructure/canvas/worker.mjs +286 -0
  372. package/src/infrastructure/fluxer/payload.ts +54 -13
  373. package/src/infrastructure/fluxer/resources/cache.ts +52 -0
  374. package/src/infrastructure/fluxer/resources/collectors.ts +87 -4
  375. package/src/infrastructure/fluxer/resources/gateway.ts +33 -0
  376. package/src/infrastructure/fluxer/resources/instance.ts +105 -0
  377. package/src/infrastructure/fluxer/resources/messages.ts +87 -16
  378. package/src/infrastructure/fluxer/resources/self.ts +39 -0
  379. package/src/infrastructure/fluxer/resources/threads.ts +9 -0
  380. package/src/infrastructure/fluxer/resources/users.ts +2 -2
  381. package/src/infrastructure/fluxer/resources.ts +12 -0
  382. package/src/infrastructure/fluxer/transport.ts +9 -5
  383. package/src/infrastructure/images/transform.ts +13 -8
  384. package/src/infrastructure/process-budget.ts +17 -0
  385. package/src/ports/canvas.ts +5 -0
  386. package/src/ports/resources/cache.ts +56 -0
  387. package/src/ports/resources/collectors.ts +20 -0
  388. package/src/ports/resources/gateway.ts +49 -0
  389. package/src/ports/resources/instance.ts +109 -0
  390. package/src/ports/resources/messages.ts +40 -7
  391. package/src/ports/resources/self.ts +30 -0
  392. package/src/ports/resources/threads.ts +7 -0
  393. package/src/ports/resources.ts +8 -0
  394. package/src/scripting/builtins/canvas.ts +117 -0
  395. package/src/scripting/builtins/embeds.ts +87 -28
  396. package/src/scripting/builtins/index.ts +4 -1
  397. package/src/scripting/builtins/language/objects.ts +2 -1
  398. package/src/scripting/builtins/language/state.ts +14 -7
  399. package/src/scripting/builtins/messages.ts +3 -3
  400. package/src/scripting/builtins/native-expressions.ts +3 -1
  401. package/src/scripting/builtins/native-messages.ts +17 -0
  402. package/src/scripting/builtins/native-threads.ts +7 -0
  403. package/src/scripting/builtins/payload.ts +121 -6
  404. package/src/scripting/builtins/resource-extras.ts +9 -2
  405. package/src/scripting/canvas-execution.ts +23 -0
  406. package/src/scripting/evaluator.ts +25 -9
  407. package/src/sdk/builders.ts +1 -0
  408. package/src/sdk/client.ts +1 -0
  409. package/src/sdk/cluster.ts +1 -0
  410. package/src/sdk/collection.ts +1 -0
  411. package/src/sdk/errors.ts +1 -0
  412. package/src/sdk/internal.ts +1 -0
  413. package/src/sdk/message.ts +1 -0
  414. package/src/sdk/rest/request-manager.ts +1 -0
  415. package/src/sdk/rest.ts +1 -0
  416. package/src/sdk/sharding.ts +1 -0
  417. package/src/sdk/types/routes.ts +1 -0
  418. package/src/sdk/types.ts +1 -0
  419. package/src/sdk/util.ts +1 -0
  420. package/src/sdk/voice.ts +1 -0
  421. package/src/sdk/ws.ts +1 -0
  422. package/src/services/attachments.ts +6 -4
  423. package/src/services/canvas.ts +498 -0
  424. package/src/services/http.ts +26 -33
  425. package/src/services/resource-authorization.ts +39 -7
  426. package/src/testing.ts +4 -0
package/CHANGELOG.md CHANGED
@@ -21,6 +21,62 @@ documentos. Veja a [política completa](VERSIONING.md).
21
21
 
22
22
  </details>
23
23
 
24
+ ## v0.2.1 · 03/11/2026
25
+
26
+ Paridade nativa ampliada com o Fluxer.js: subpaths do SDK espelhados, pacotes satélites reexportados e novas áreas de recursos para gateway, instância, usuário autenticado e cache. Esta atualização da biblioteca Yuzuha foi preparada em 03/11/2026 (v0.2.1).
27
+
28
+ - `yuzuha/sdk` passa a espelhar os subpaths de `@fluxerjs/core`: `yuzuha/sdk/client`, `/errors`, `/message`, `/cluster` e `/internal`. O teste de consumidor agora compara os exports de cada subpath ao pacote correspondente.
29
+ - Os pacotes satélites do monorepo são reexportados como `yuzuha/sdk/types` (com `/routes`), `yuzuha/sdk/rest` (com `/request-manager`), `yuzuha/sdk/ws`, `yuzuha/sdk/builders`, `yuzuha/sdk/collection` e `yuzuha/sdk/util`, que viram dependências diretas. `yuzuha/sdk/voice` e `yuzuha/sdk/sharding` reexportam os peers opcionais homônimos.
30
+ - Quatro áreas novas em `ctx.resources` e `bot.resources`: `gateway` envia pedidos brutos ao gateway (membros, contagens, não lidos de fórum, assinatura de threads e payload por shard); `instance` descreve a instância, o gateway, a aplicação e metadados de emoji/sticker; `self` cobre o usuário autenticado com verificação sudo; `cache` expõe estatísticas, limites e limpezas.
31
+ - `collectors.collectMessages` e `collectReactions` devolvem `AsyncIterable` sobre os coletores do SDK, com limites `timeMs`/`max`/`signal` e limpeza garantida. Reações exigem `messageID`, como no coletor do SDK. `ReactionVote` ganha `messageID` opcional.
32
+ - `messages.bulkFetch` busca janelas de mensagens por canal com hidratação por padrão ou payloads brutos com `hydrate: false`. `messages.searchAll` usa a busca global do client com os mesmos filtros e paginação de `search`.
33
+ - As novas áreas passam pela autorização compartilhada como autoridade direta, mesmo contrato de `users` e `messages`; o sinal do comando cancela os streams.
34
+ - **Adaptação de integrações:** implementações completas próprias de `Resources` devem fornecer `gateway`, `instance`, `self` e `cache`; `CollectorsResources` e `MessagesResources` ganharam métodos. `@fluxerjs/sharding` declara peer exato em `@fluxerjs/core` 3.0.0 — consumidores que o instalarem precisam de `overrides` para o core fixado. Veja [VERSIONING.md](VERSIONING.md) antes de atualizar.
35
+
36
+ ## v0.2.0 · 02/11/2026
37
+
38
+ Embeds completos em uma API só, nos modos nativo e function mode, com uma matriz automática de paridade com o SDK. Esta atualização da biblioteca Yuzuha foi preparada em 02/11/2026 (v0.2.0); a tag Git `v0.2.0` aponta para esta versão.
39
+
40
+ - `Embed` aceita `url`, `timestamp`, `author` com ícone e link, `footer.iconURL`, texto alternativo em imagem e miniatura, e `fields[].inline` opcional. Na função `$color` e em `$embedFromObject`, a cor aceita `#RRGGBB`, tupla `r,g,b` ou nome simples; o tipo `Embed` nativo continua recebendo número. `embed()` valida um embed tipado na API nativa e `yuzuha/sdk` continua expondo o `EmbedBuilder` do SDK.
41
+ - Mensagens aceitam até 10 embeds, `tts`, `stickerIds`, `flags`, `allowedMentions` e `reply` na API nativa. O padrão continua sem menções e sem ping ao autor respondido. Relaxar menções exige `MentionEveryone` do autor, e TTS exige `SendTtsMessages`.
42
+ - Catorze funções novas: `$url`, `$embedTimestamp`, `$author`, `$footerIcon`, `$imageAlt`, `$thumbnailAlt`, `$fields`, `$addField`, `$removeField`, `$editField`, `$embedFromObject`, `$embeds`, `$addEmbed` e `$messageOptions`. `$field` aceita valor vazio quando é inline.
43
+ - `$fetchMessage` e `$messages` devolvem `embeds` normalizados, com `type`, `provider`, `video`, `audio`, `nsfw` e `children` somente leitura.
44
+ - Mudança incompatível: `MessageInfo.embeds` é obrigatório para implementações próprias de `MessagesResources`. Objetos de mensagem em script rejeitam chaves desconhecidas, que antes viravam embed sem validação. Veja [VERSIONING.md](VERSIONING.md#migrar-para-020).
45
+ - `npm run docs:generate` gera [PARITY-MATRIX.md](docs/PARITY-MATRIX.md), que classifica cada export do SDK como coberto por script, coberto pelo código nativo, só-SDK ou lacuna. Um teste falha quando o SDK ganha export sem área.
46
+ - Catálogo do function mode: de 322 para **336** funções. [FUNCTION-GAPS.md](docs/FUNCTION-GAPS.md) foi atualizado com a contagem real.
47
+
48
+ ## v0.1.9 · 29/10/2026
49
+
50
+ Composição opcional de cartões para comandos, eventos e function mode, com fontes locais e renderização isolada. Esta atualização da biblioteca Yuzuha foi preparada em 29/10/2026 (v0.1.9).
51
+
52
+ - `yuzuha/canvas` oferece builder tipado para texto, imagens, avatares, formas, gradientes, sombras, badges e progresso. A raiz e o function mode continuam importáveis sem instalar `@napi-rs/canvas`; o backend carrega somente no processo filho durante a renderização.
53
+ - `ctx.canvas.send` e `bot.contextEvent` permitem anexar imagens em comandos e eventos sem mensagem. O canal é explícito quando o evento não o fornece.
54
+ - Doze funções `$canvas*` mantêm cenas privadas por execução e elevam o catálogo canônico de 310 para **322**. Quotas, cancelamento e limites atravessam `$try`.
55
+ - Inter 4.1 Regular e Bold acompanham os arquivos originais e a licença OFL. Fontes próprias podem vir de bytes, aliases configurados ou HTTP submetido à política do contexto.
56
+ - Canvas e Sharp compartilham no máximo dois processos simultâneos, sem fila implícita. Canvas não depende de Sharp; `yuzuha/images` preserva seu contrato.
57
+ - Perfil, boas-vindas e ranking têm versões JS, TS e function mode e geram nove PNGs offline. O tarball verifica imports sem os peers e renderização real com Canvas sem Sharp.
58
+ - SDK 3.3.0, Node >=22.13 e schema persistido 2 permanecem compatíveis.
59
+
60
+ ## v0.1.8 · 28/10/2026
61
+
62
+ Bases de bots, buscas e páginas do Fluxer.js, com autorização compartilhada e correções de limites, streams e cooldowns. Esta atualização da biblioteca Yuzuha foi preparada em 28/10/2026 (v0.1.8).
63
+
64
+ - A CLI oferece sete bases JS/TS com `templates` e `init --template`: simple, multifunctional, moderation, community, economy, entertainment e utility. A multifuncional reúne 24 comandos raiz; os projetos incluem configuração, exemplos e testes offline. O scaffold padrão e `--functions` continuam disponíveis.
65
+ - A distribuição preserva o modo executável da CLI e testa a instalação, os tipos e o dispatch dos 14 pares de base/linguagem a partir do tarball.
66
+ - Quatro funções novas levam o catálogo de 306 a **310**: `$searchMessagesAdvanced`, `$pinnedMessagesPage`, `$reactionUsersPage` e `$threadMember`. Seus recursos e tipos também estão disponíveis na API nativa.
67
+ - A busca aceita filtros de conteúdo, frases, autores, canais, menções, anexos, IDs e ordenação sem exigir texto. A validação é compartilhada entre scripts e adaptador, copia arrays e limita as opções a 32 KiB; a busca anterior continua disponível, incluindo cursor vazio.
68
+ - Páginas de fixadas preservam ordem de fixação, timestamps, `hasMore` e cursor ISO. Páginas de reações preservam `hasMore`/`nextAfter`, incluindo respostas legadas em array. A consulta individual de membros de threads inclui flags e metadados de mute, com o autor do contexto como padrão nos scripts.
69
+ - Mutações de emojis e stickers pelo contexto exigem `ManageExpressions` de autor e bot no servidor atual. Criar emoji verifica as permissões antes do download e revalida antes de criar o recurso. Guards não são capturados por `$try`.
70
+ - `$jsonEncode` preserva guards, limites, cancelamento, controle de loops e `PartialModerationError`. Incrementos, remoções/inclusões em arrays e atualizações por caminho verificam a saída antes do commit, preservando valor, TTL e ausência quando recusados.
71
+ - O prazo cooperativo do runtime usa relógio monotônico. Esperas externas sobrepostas ou aninhadas descontam seu intervalo uma única vez, sem conceder tempo duplicado.
72
+ - HTTP valida sub-redes IPv4/IPv6, inclusive IPv4 mapeado, link-local e redes especiais. Literais IPv6 públicos funcionam sem consulta DNS; credenciais na URL e corpos em GET/HEAD são recusados.
73
+ - Redirects preservam os métodos conforme o padrão Fetch e removem cabeçalhos de conteúdo quando descartam o corpo. Respostas binárias copiam chunks reutilizados; cancelamento libera readers mesmo quando a fonte não conclui a limpeza.
74
+ - Anexos por stream mantêm os metadados validados durante a leitura e não deixam um timeout agendado quando a fonte já está bloqueada por outro reader.
75
+ - Deduplicação de mensagens e consultas de cooldown ativo deixam de varrer o mapa de cooldowns. A coleta considera vencimentos e pressão de capacidade; renovação e admissão reutilizam entradas expiradas, mantendo o teto de 100 mil. Flags malformadas geram `GuardError` antes do handler.
76
+ - Um benchmark reproduzível compara a implementação anterior e a atual com amostras intercaladas. O ganho é localizado na manutenção removida; cenários comuns tiveram resultados mistos, registrados sem alegação de aceleração geral.
77
+ - Referências, catálogo do editor, guias e consumidores JS/TS acompanham os novos contratos. O SDK continua fixado em 3.3.0, o schema persistido em 2 e os sete entrypoints permanecem disponíveis.
78
+ - **Adaptação de integrações:** implementações completas próprias de `MessagesResources` devem acrescentar `pinnedPage` e `reactionUsersPage`; `ThreadsResources` deve acrescentar `member`. Comandos antes autorizados apenas pelo bot podem receber `GuardError` nas mutações de expressões. Apesar da numeração patch, esta entrega altera esses contratos; veja [VERSIONING.md](VERSIONING.md) antes de atualizar.
79
+
24
80
  ## v0.1.7 · 23/10/2026
25
81
 
26
82
  Loops controláveis, comparadores de arrays, regex isolada, decimais exatos e busca pela CLI, com o conteúdo preparado na 0.1.6. Esta atualização da biblioteca Yuzuha foi preparada em 23/10/2026 (v0.1.7).
package/README.md CHANGED
@@ -7,7 +7,7 @@ Os dois modos compartilham permissões, moderação, estado e recursos.
7
7
  O Yuzuha usa **Fluxer.js 3.3.0**. Você continua tendo acesso ao client original
8
8
  por `bot.client` e aos exports do SDK em `yuzuha/sdk`.
9
9
 
10
- [0.1.7](CHANGELOG.md) · Node **22.13+** · ESM · [MIT](LICENSE)
10
+ [0.2.0](CHANGELOG.md) · Node **22.13+** · ESM · [MIT](LICENSE)
11
11
 
12
12
  [Começar](#começar) · [Comandos](#escrever-comandos) · [Recursos](#recursos) · [Testes](#testar-sem-token) · [Documentação](#documentação)
13
13
 
@@ -16,7 +16,7 @@ por `bot.client` e aos exports do SDK em `yuzuha/sdk`.
16
16
  ### Criar um bot
17
17
 
18
18
  ```sh
19
- npx yuzuha@0.1.7 init ./meu-bot --ts
19
+ npx yuzuha@0.2.0 init ./meu-bot --ts
20
20
  cd meu-bot
21
21
  npm install
22
22
  npm run check
@@ -42,7 +42,7 @@ para incluir um comando de exemplo com scripts.
42
42
  ### Usar em um projeto existente
43
43
 
44
44
  ```sh
45
- npm install yuzuha@0.1.7
45
+ npm install yuzuha@0.2.0
46
46
  ```
47
47
 
48
48
  Use `"type": "module"` no `package.json`. O [guia inicial](docs/QUICKSTART.md)
@@ -84,7 +84,7 @@ export default script({
84
84
  });
85
85
  ```
86
86
 
87
- O function mode tem **306 funções** para mensagens, guards, moderação, variáveis,
87
+ O function mode tem **336 funções** para mensagens, guards, moderação, variáveis,
88
88
  JSON, arrays, loops, eventos e agendamentos. O runtime é ativado ao registrar um
89
89
  comando com `code` ou um evento de script.
90
90
 
@@ -103,6 +103,7 @@ e a [cobertura](docs/PARITY.md).
103
103
  | Dados | Memória, JSON e SQLite; TTL, transações, limpeza e backup/restauração com simulação |
104
104
  | Agendamentos | Tarefas persistentes, cron, fusos IANA, pausa/retomada, histórico e retry |
105
105
  | HTTP | Texto, bytes, streaming e multipart, com limites, cancelamento e políticas por comando |
106
+ | Canvas | Cartões com texto, avatares, imagens, gradientes, badges e progresso; peer nativo opcional |
106
107
  | Música | Lavalink v4 com plugin e ponte de áudio para Fluxer, recuperação, filas editáveis, loop, seek, volume e filtros |
107
108
  | Desenvolvimento | CLI, autocomplete e diagnósticos no VS Code, mocks e relógio controlável para testes |
108
109
 
@@ -157,6 +158,7 @@ O [índice completo](docs/README.md) reúne os guias e as referências.
157
158
  | Programar em JS/TS | [Guia nativo](docs/NATIVE.md), [framework](docs/FRAMEWORK.md) e [API](docs/API.md) |
158
159
  | Criar um bot de música | [Lavalink, filas e voz Fluxer](docs/MUSIC.md) |
159
160
  | Medir performance | [Benchmarks e comparações com a 0.1.5](docs/BENCHMARKS.md) |
161
+ | Compor cartões e imagens | [Canvas](docs/CANVAS.md) e [transformações de imagem](docs/IMAGES.md) |
160
162
  | Escrever scripts `$...` | [Linguagem](docs/LANGUAGE.md) e [referência de funções](docs/FUNCTIONS.md) |
161
163
  | Copiar exemplos | [Receitas](docs/COOKBOOK.md) e [código de exemplo](examples) |
162
164
  | Usar o editor ou diagnosticar um erro | [VS Code](docs/EDITOR.md) e [problemas comuns](docs/TROUBLESHOOTING.md) |
@@ -196,3 +198,18 @@ Transformações opcionais de imagens e entrada de anexos por stream estão em
196
198
  [IMAGES.md](docs/IMAGES.md); consultas por prefixo e cursor em
197
199
  [STORAGE.md](docs/STORAGE.md), e limites das integrações em
198
200
  [INTEGRATIONS.md](docs/INTEGRATIONS.md).
201
+
202
+ ### Bases de bots
203
+
204
+ Sete opções: `simple`, `multifunctional`, `moderation`, `community`, `economy`,
205
+ `entertainment` e `utility`. Na cópia local compilada:
206
+
207
+ ```sh
208
+ node dist/cli.js templates
209
+ node dist/cli.js init ../bot-comunidade --template community --ts --local
210
+ ```
211
+
212
+ A multifuncional reúne 24 comandos raiz com embeds e subcomandos, incluindo
213
+ moderação com casos, regras, sugestões, enquetes, moedas virtuais, diversão
214
+ e notas pessoais em DM. Todas as bases aceitam JS/TS e `--functions`, com README
215
+ e testes offline próprios. Veja [BOT-BASES.md](docs/BOT-BASES.md).
package/VERSIONING.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # Versionamento
2
2
 
3
3
  O Yuzuha aplica o formato Hory ao histórico e usa **SemVer simples** no pacote.
4
- A versão desta atualização é **0.1.7**.
4
+ A versão desta atualização é **0.2.1**.
5
5
 
6
6
  ## Pacote e histórico
7
7
 
8
8
  | Lugar | Formato nesta versão |
9
9
  |---|---|
10
- | `package.json` e entrada raiz de `package-lock.json` | `0.1.7` |
11
- | Pacote npm e saída de `yuzuha --version` | `0.1.7` |
12
- | Título do changelog | `## v0.1.7 · 23/10/2026` |
13
- | Eventual tag Git | `v0.1.7` |
10
+ | `package.json` e entrada raiz de `package-lock.json` | `0.2.1` |
11
+ | Pacote npm e saída de `yuzuha --version` | `0.2.1` |
12
+ | Título do changelog | `## v0.2.1 · 03/11/2026` |
13
+ | Tag Git | `v0.2.1` |
14
14
 
15
15
  O SDK e a CLI pertencem ao mesmo pacote. Para bibliotecas, a convenção Hory mantém
16
16
  SemVer sem `m`, sem seções por superfície e sem sufixos de canal.
@@ -30,7 +30,9 @@ estivermos em `0.x`. Ao chegar a `1.0.0`, mudanças incompatíveis exigem major;
30
30
  novas funcionalidades compatíveis, minor; correções compatíveis, patch.
31
31
 
32
32
  Os exports públicos são `yuzuha`, `yuzuha/functions`, `yuzuha/sdk`,
33
- `yuzuha/testing`, `yuzuha/tooling`, `yuzuha/music` e `yuzuha/images`. A organização interna de `src/` não cria estabilidade de deep
33
+ `yuzuha/sdk/*`, `yuzuha/testing`, `yuzuha/tooling`, `yuzuha/music`,
34
+ `yuzuha/images` e `yuzuha/canvas`. A organização interna de `src/` não cria
35
+ estabilidade de deep
34
36
  imports. Schema persistido,
35
37
  gramática e funções documentadas também fazem parte da compatibilidade.
36
38
 
@@ -40,6 +42,98 @@ gerado por `init` pertence ao consumidor e não precisa acompanhar a biblioteca.
40
42
 
41
43
  ## Preparar uma atualização
42
44
 
45
+ ### Migrar para 0.2.1
46
+
47
+ A 0.2.1 amplia a paridade nativa com o Fluxer.js. Os subpaths `yuzuha/sdk/*`
48
+ espelham `@fluxerjs/core/*` e os pacotes satélites `@fluxerjs/types`, `/rest`,
49
+ `/ws`, `/builders`, `/collection` e `/util`, que viram dependências diretas.
50
+ `yuzuha/sdk/voice` e `yuzuha/sdk/sharding` reexportam peers opcionais; instale-os
51
+ para usar esses caminhos. `@fluxerjs/sharding` declara peer exato em
52
+ `@fluxerjs/core` 3.0.0: consumidores precisam de `overrides` apontando o core
53
+ fixado, como no manifesto do próprio Yuzuha.
54
+
55
+ `ctx.resources` ganha quatro áreas novas — `gateway`, `instance`, `self` e
56
+ `cache` — e `collectors` ganha os streams `collectMessages`/`collectReactions`.
57
+ `messages` ganha `bulkFetch` e `searchAll`. Implementações completas próprias de
58
+ `Resources` precisam fornecer as novas áreas; `mockResources` continua aceitando
59
+ parciais. O schema persistido permanece em 2 e o SDK em 3.3.0; não há migração
60
+ de dados.
61
+
62
+ ```sh
63
+ npm install yuzuha@0.2.1
64
+ ```
65
+
66
+ ### Migrar para 0.2.0
67
+
68
+ A 0.2.0 acrescenta campos a `Embed` (`url`, `timestamp`, `author`, `footer.iconURL`,
69
+ alt text em imagem e miniatura), `allowedMentions`, `tts`, `stickerIds`, `flags` e
70
+ `reply` em `Payload`, além de 14 funções de script e a leitura normalizada de embeds
71
+ em `$fetchMessage` e `$messages`. Os exports públicos continuam os mesmos.
72
+
73
+ Há duas mudanças de contrato, por isso a versão é minor na série `0.x`:
74
+
75
+ - `MessageInfo.embeds` passou a ser obrigatório. Quem implementa `MessagesResources`
76
+ própria deve devolver `embeds` (use `[]` se não houver embeds).
77
+ - Objetos de mensagem em script (`$reply`, `$sendMessage`, `$editMessage`) aceitam
78
+ somente as chaves `content`, `embeds`, `tts`, `stickerIds`, `flags` e `allowedMentions`.
79
+ Antes, qualquer objeto virava embed sem validação; agora campos desconhecidos são erro.
80
+
81
+ Menções só relaxam com a permissão `MentionEveryone` do autor, e TTS exige
82
+ `SendTtsMessages`. O padrão continua sem menções e sem ping ao autor respondido.
83
+
84
+ ```sh
85
+ npm install yuzuha@0.2.0
86
+ ```
87
+
88
+ ### Migrar para 0.1.9
89
+
90
+ A 0.1.9 acrescenta `yuzuha/canvas`, `ctx.canvas` e `bot.contextEvent`, além de
91
+ 12 funções de script da categoria `canvas`. O pacote continua utilizável sem
92
+ Canvas; para renderizar, instale `@napi-rs/canvas@^1.0.13`. Sem o peer, somente
93
+ a chamada de renderização falha com `CANVAS_DEPENDENCY`. Sharp continua sendo
94
+ opcional e independente. O envio usa `resources.messages.sendBytes` e eventos
95
+ sem canal precisam fornecer `channelID` em `ctx.canvas.send`.
96
+
97
+ `CanvasConfig` pode registrar bytes de assets e fontes TTF/OTF. As respostas
98
+ HTTP continuam sujeitas à política e ao limite configurado no bot. Canvas e
99
+ transformações Sharp compartilham duas vagas de processo. O schema persistido
100
+ permanece em 2 e o SDK em 3.3.0; não há migração de dados.
101
+
102
+ ```sh
103
+ npm install yuzuha@0.1.9 @napi-rs/canvas@^1.0.13
104
+ ```
105
+
106
+ Veja [CANVAS.md](docs/CANVAS.md) para opções, limites, fontes e exemplos. A
107
+ extensão incluída acompanha a versão 0.1.9.
108
+
109
+ ### Migrar para 0.1.8
110
+
111
+ A 0.1.8 é uma exceção pontual à regra de versões minor para mudanças de
112
+ contrato na série 0.x. Embora use numeração patch, requer adaptação de
113
+ implementações completas próprias de `Resources` e revisão das autorizações
114
+ de comandos. A regra de compatibilidade acima continua valendo para as
115
+ próximas versões.
116
+
117
+ - Acrescente `messages.pinnedPage`, `messages.reactionUsersPage` e
118
+ `threads.member` aos adaptadores completos. Os tipos de retorno são
119
+ `PinnedMessagesPage`, `ReactionUsersPage` e `ThreadMemberDetails`, exportados
120
+ pela raiz. `mockResources` continua aceitando overrides parciais.
121
+ - Mutações de emojis/stickers por `ctx.resources.expressions` exigem
122
+ `ManageExpressions` de autor e bot no servidor do contexto. Código confiável
123
+ que precisa operar diretamente com a autoridade do bot continua usando
124
+ `bot.resources` ou `bot.client` explicitamente.
125
+ - HTTP recusa credenciais embutidas na URL, corpos GET/HEAD e destinos nas
126
+ redes locais/especiais bloqueadas, incluindo IPv4 mapeado em IPv6. Use
127
+ `Authorization` para autenticação; rede privada exige `allowPrivate: true`
128
+ explícito. Redirects 301/302 preservam PUT/PATCH/DELETE e 303 preserva HEAD;
129
+ cabeçalhos de conteúdo são removidos quando o corpo é descartado.
130
+ - As opções de busca recebem validação compartilhada de tipos, IDs, cursores
131
+ e limites. Texto é opcional na API nativa e em `$searchMessagesAdvanced`;
132
+ `$searchMessages` mantém sua assinatura e aceita cursor vazio.
133
+ - O catálogo passa a 310 funções. Imports, SDK 3.3.0 e schema 2 permanecem;
134
+ não há migração de dados em disco. As sete bases da CLI são aditivas e não
135
+ reescrevem projetos existentes. A extensão incluída acompanha a versão 0.1.8.
136
+
43
137
  ### Migrar para 0.1.7
44
138
 
45
139
  A distribuição 0.1.7 inclui o conteúdo preparado na 0.1.6 e acrescenta
Binary file
Binary file
@@ -0,0 +1,92 @@
1
+ Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+ -----------------------------------------------------------
8
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
9
+ -----------------------------------------------------------
10
+
11
+ PREAMBLE
12
+ The goals of the Open Font License (OFL) are to stimulate worldwide
13
+ development of collaborative font projects, to support the font creation
14
+ efforts of academic and linguistic communities, and to provide a free and
15
+ open framework in which fonts may be shared and improved in partnership
16
+ with others.
17
+
18
+ The OFL allows the licensed fonts to be used, studied, modified and
19
+ redistributed freely as long as they are not sold by themselves. The
20
+ fonts, including any derivative works, can be bundled, embedded,
21
+ redistributed and/or sold with any software provided that any reserved
22
+ names are not used by derivative works. The fonts and derivatives,
23
+ however, cannot be released under any other type of license. The
24
+ requirement for fonts to remain under this license does not apply
25
+ to any document created using the fonts or their derivatives.
26
+
27
+ DEFINITIONS
28
+ "Font Software" refers to the set of files released by the Copyright
29
+ Holder(s) under this license and clearly marked as such. This may
30
+ include source files, build scripts and documentation.
31
+
32
+ "Reserved Font Name" refers to any names specified as such after the
33
+ copyright statement(s).
34
+
35
+ "Original Version" refers to the collection of Font Software components as
36
+ distributed by the Copyright Holder(s).
37
+
38
+ "Modified Version" refers to any derivative made by adding to, deleting,
39
+ or substituting -- in part or in whole -- any of the components of the
40
+ Original Version, by changing formats or by porting the Font Software to a
41
+ new environment.
42
+
43
+ "Author" refers to any designer, engineer, programmer, technical
44
+ writer or other person who contributed to the Font Software.
45
+
46
+ PERMISSION AND CONDITIONS
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
49
+ redistribute, and sell modified and unmodified copies of the Font
50
+ Software, subject to the following conditions:
51
+
52
+ 1) Neither the Font Software nor any of its individual components,
53
+ in Original or Modified Versions, may be sold by itself.
54
+
55
+ 2) Original or Modified Versions of the Font Software may be bundled,
56
+ redistributed and/or sold with any software, provided that each copy
57
+ contains the above copyright notice and this license. These can be
58
+ included either as stand-alone text files, human-readable headers or
59
+ in the appropriate machine-readable metadata fields within text or
60
+ binary files as long as those fields can be easily viewed by the user.
61
+
62
+ 3) No Modified Version of the Font Software may use the Reserved Font
63
+ Name(s) unless explicit written permission is granted by the corresponding
64
+ Copyright Holder. This restriction only applies to the primary font name as
65
+ presented to the users.
66
+
67
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
68
+ Software shall not be used to promote, endorse or advertise any
69
+ Modified Version, except to acknowledge the contribution(s) of the
70
+ Copyright Holder(s) and the Author(s) or with their explicit written
71
+ permission.
72
+
73
+ 5) The Font Software, modified or unmodified, in part or in whole,
74
+ must be distributed entirely under this license, and must not be
75
+ distributed under any other license. The requirement for fonts to
76
+ remain under this license does not apply to any document created
77
+ using the Font Software.
78
+
79
+ TERMINATION
80
+ This license becomes null and void if any of the above conditions are
81
+ not met.
82
+
83
+ DISCLAIMER
84
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
85
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
86
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
87
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
88
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
89
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
90
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
91
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
92
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,8 @@
1
+ These unmodified font files are from Inter 4.1, distributed by the upstream
2
+ Inter project under the SIL Open Font License 1.1.
3
+
4
+ - `Inter-Regular.ttf`: Inter 4.1 Regular
5
+ - `Inter-Bold.ttf`: Inter 4.1 Bold
6
+ - License text: `OFL.txt`
7
+ - Upstream release: https://github.com/rsms/inter/releases/tag/v4.1
8
+ - License source: https://github.com/rsms/inter/blob/v4.1/LICENSE.txt
@@ -0,0 +1,138 @@
1
+ import assert from 'node:assert/strict';
2
+ import { createHash } from 'node:crypto';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { arch, cpus, platform } from 'node:os';
5
+ import { performance } from 'node:perf_hooks';
6
+ import { RateLimits } from '../dist/framework/rate-limits.js';
7
+ import { YuzuhaError } from '../dist/errors.js';
8
+
9
+ // Baseline: src/framework/rate-limits.ts at a227759f726420471ade044a3cf9600a6359a668, with TypeScript types removed.
10
+ class BaselineRateLimits {
11
+ now;
12
+ seen = new Map();
13
+ seenKeys = [];
14
+ seenExpirations = [];
15
+ seenCursor = 0;
16
+ cooldowns = new Map();
17
+ nextSweep = 0;
18
+
19
+ constructor(now = Date.now) { this.now = now; }
20
+
21
+ sweep(time) {
22
+ if (time < this.nextSweep) return;
23
+ for (const [key, until] of this.cooldowns) if (until <= time) this.cooldowns.delete(key);
24
+ this.nextSweep = time + 1000;
25
+ }
26
+
27
+ duplicate(channelID, messageID) {
28
+ const time = this.now();
29
+ this.sweep(time);
30
+ const key = `${channelID.length}:${channelID}${messageID}`;
31
+ if ((this.seen.get(key) ?? 0) > time) return true;
32
+ const previous = this.seenKeys[this.seenCursor];
33
+ if (previous !== undefined && this.seen.get(previous) === this.seenExpirations[this.seenCursor]) this.seen.delete(previous);
34
+ const until = time + 60_000;
35
+ this.seen.set(key, until);
36
+ this.seenKeys[this.seenCursor] = key; this.seenExpirations[this.seenCursor] = until;
37
+ this.seenCursor = (this.seenCursor + 1) % 10_000;
38
+ return false;
39
+ }
40
+
41
+ cooldown(key, duration) {
42
+ const time = this.now();
43
+ this.sweep(time);
44
+ const remaining = (this.cooldowns.get(key) ?? 0) - time;
45
+ if (remaining > 0) return remaining;
46
+ if (this.cooldowns.size >= 100_000) throw new YuzuhaError('COOLDOWN_CAPACITY', 'Capacidade de cooldown excedida.');
47
+ this.cooldowns.set(key, time + duration);
48
+ return 0;
49
+ }
50
+ }
51
+
52
+ const config = { samples: 7, normalIterations: 50_000, loadedIterations: 1000, entries: 25_000,
53
+ warmup: 2000, normalClockStepMs: 0, loadedClockStepMs: 1000, cooldownMs: 1_000_000_000_000 };
54
+ let json = false;
55
+ for (let index = 2; index < process.argv.length; index++) {
56
+ const option = process.argv[index];
57
+ if (option === '--json') { json = true; continue; }
58
+ const name = { '--samples': 'samples', '--normal-iterations': 'normalIterations', '--loaded-iterations': 'loadedIterations', '--entries': 'entries' }[option];
59
+ const value = Number(process.argv[++index]);
60
+ const max = { samples: 50, normalIterations: 90_000, loadedIterations: 100_000, entries: 100_000 }[name];
61
+ if (!max || !Number.isSafeInteger(value) || value < 1 || value > max) throw new Error(`Opção inválida: ${option}.`);
62
+ config[name] = value;
63
+ }
64
+
65
+ const scenarios = [
66
+ { name: 'duplicate/same-tick', operation: 'duplicate', loaded: false },
67
+ { name: 'cooldown/new-same-tick', operation: 'new', loaded: false },
68
+ { name: 'cooldown/active-same-tick', operation: 'active', loaded: false },
69
+ { name: 'duplicate/loaded-clock-steps', operation: 'duplicate', loaded: true },
70
+ { name: 'cooldown/loaded-clock-steps', operation: 'active', loaded: true },
71
+ ];
72
+
73
+ function fixture(Implementation, scenario, iterations) {
74
+ let now = 0;
75
+ const limits = new Implementation(() => now);
76
+ const step = scenario.loaded ? config.loadedClockStepMs : config.normalClockStepMs;
77
+ if (scenario.loaded) for (let index = 0; index < config.entries; index++) limits.cooldown(String(index), config.cooldownMs);
78
+ else if (scenario.operation === 'active') limits.cooldown('0', config.cooldownMs);
79
+ const outputs = new Array(iterations);
80
+ return {
81
+ run() {
82
+ for (let index = 0; index < iterations; index++) {
83
+ now += step;
84
+ outputs[index] = scenario.operation === 'duplicate' ? limits.duplicate('channel', String(index))
85
+ : limits.cooldown(scenario.operation === 'active' ? '0' : String(index), config.cooldownMs);
86
+ }
87
+ },
88
+ validate() {
89
+ for (let index = 0; index < iterations; index++) {
90
+ const expected = scenario.operation === 'duplicate' ? false
91
+ : scenario.operation === 'active' ? config.cooldownMs - step * (index + 1) : 0;
92
+ assert.equal(outputs[index], expected);
93
+ }
94
+ return outputs;
95
+ },
96
+ };
97
+ }
98
+
99
+ const median = values => [...values].sort((a, b) => a - b)[Math.ceil(values.length / 2) - 1];
100
+ const summarize = (samplesMs, iterations) => ({ samplesMs, medianMs: median(samplesMs),
101
+ operationsPerSecond: iterations * samplesMs.length / (samplesMs.reduce((sum, value) => sum + value, 0) / 1000) });
102
+ const implementations = [['baseline', BaselineRateLimits], ['current', RateLimits]];
103
+ const results = [];
104
+ for (const scenario of scenarios) {
105
+ const iterations = scenario.loaded ? config.loadedIterations : config.normalIterations;
106
+ for (const [, Implementation] of implementations) {
107
+ const warmup = fixture(Implementation, scenario, Math.min(config.warmup, iterations));
108
+ warmup.run(); warmup.validate();
109
+ }
110
+ const samples = { baseline: [], current: [] };
111
+ for (let sample = 0; sample < config.samples; sample++) {
112
+ const outputs = {};
113
+ for (const [name, Implementation] of sample % 2 ? [...implementations].reverse() : implementations) {
114
+ const trial = fixture(Implementation, scenario, iterations);
115
+ global.gc?.();
116
+ const start = performance.now();
117
+ trial.run();
118
+ samples[name].push(performance.now() - start);
119
+ outputs[name] = trial.validate();
120
+ }
121
+ assert.deepEqual(outputs.current, outputs.baseline);
122
+ }
123
+ const baseline = summarize(samples.baseline, iterations), current = summarize(samples.current, iterations);
124
+ results.push({ name: scenario.name, iterations, entries: scenario.loaded ? config.entries : scenario.operation === 'active' ? 1 : 0,
125
+ clockStepMs: scenario.loaded ? config.loadedClockStepMs : config.normalClockStepMs, baseline, current,
126
+ medianChangePercent: (current.medianMs / baseline.medianMs - 1) * 100 });
127
+ }
128
+ const hash = input => createHash('sha256').update(input).digest('hex');
129
+ const report = { suite: 'rate-limits', date: new Date().toISOString(), node: process.versions.node, platform: platform(), arch: arch(),
130
+ cpu: cpus()[0]?.model, gc: typeof global.gc === 'function', baselineCommit: 'a227759f726420471ade044a3cf9600a6359a668',
131
+ sourceHashes: { baselineImplementation: hash(BaselineRateLimits.toString()), currentDist: hash(await readFile(new URL('../dist/framework/rate-limits.js', import.meta.url))),
132
+ benchmark: hash(await readFile(new URL(import.meta.url))) }, config,
133
+ scope: 'Local synthetic workloads; advancing the fake clock simulates sweep boundaries, not wall-clock throughput of a bot.', results };
134
+ console.log(json ? JSON.stringify(report, null, 2) : [
135
+ `RateLimits · Node ${report.node} · ${report.cpu} · ${report.platform}/${report.arch}`,
136
+ report.scope,
137
+ ...results.map(row => `${row.name}: ${row.baseline.medianMs.toFixed(3)} -> ${row.current.medianMs.toFixed(3)} ms; ${row.iterations} operations; clock +${row.clockStepMs} ms/operation`),
138
+ ].join('\n'));