yuzuha 0.1.4 → 0.1.7

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 (375) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +154 -113
  3. package/VERSIONING.md +60 -7
  4. package/benchmarks/compare.mjs +8 -2
  5. package/benchmarks/parser.mjs +66 -0
  6. package/benchmarks/performance.mjs +87 -0
  7. package/benchmarks/refinement.mjs +99 -0
  8. package/benchmarks/results/v0.1.6/performance-0.1.5.json +205 -0
  9. package/benchmarks/results/v0.1.6/performance-0.1.6.json +263 -0
  10. package/benchmarks/results/v0.1.6/refinement-audio.json +147 -0
  11. package/benchmarks/results/v0.1.6/refinement-final-repeat.json +147 -0
  12. package/benchmarks/results/v0.1.6/refinement-final.json +147 -0
  13. package/benchmarks/results/v0.1.6/refinement-initial.json +117 -0
  14. package/benchmarks/results/v0.1.6/runtime-0.1.5.json +341 -0
  15. package/benchmarks/results/v0.1.6/runtime-0.1.6-refined.json +406 -0
  16. package/benchmarks/results/v0.1.6/runtime-0.1.6-repeat.json +406 -0
  17. package/benchmarks/results/v0.1.6/runtime-0.1.6.json +406 -0
  18. package/benchmarks/results/v0.1.7/parser-comparison.json +170 -0
  19. package/bridges/lavalink/README.md +101 -0
  20. package/bridges/lavalink/application.yml +20 -0
  21. package/bridges/lavalink/build.mjs +38 -0
  22. package/bridges/lavalink/integration.mjs +161 -0
  23. package/bridges/lavalink/results/node22.json +39 -0
  24. package/bridges/lavalink/results/node26.json +39 -0
  25. package/bridges/lavalink/src/AudioController.java +149 -0
  26. package/bridges/lavalink/src/WebmOpus.java +82 -0
  27. package/dist/cli/arguments.d.ts +2 -0
  28. package/dist/cli/arguments.d.ts.map +1 -1
  29. package/dist/cli/arguments.js +16 -9
  30. package/dist/cli/arguments.js.map +1 -1
  31. package/dist/cli/command-catalog.d.ts +14 -0
  32. package/dist/cli/command-catalog.d.ts.map +1 -0
  33. package/dist/cli/command-catalog.js +22 -0
  34. package/dist/cli/command-catalog.js.map +1 -0
  35. package/dist/cli/main.d.ts.map +1 -1
  36. package/dist/cli/main.js +11 -4
  37. package/dist/cli/main.js.map +1 -1
  38. package/dist/cli/scaffold.d.ts +1 -1
  39. package/dist/cli/scaffold.d.ts.map +1 -1
  40. package/dist/cli/scaffold.js +10 -7
  41. package/dist/cli/scaffold.js.map +1 -1
  42. package/dist/cli/version.d.ts +1 -3
  43. package/dist/cli/version.d.ts.map +1 -1
  44. package/dist/cli/version.js +1 -6
  45. package/dist/cli/version.js.map +1 -1
  46. package/dist/commands/arguments.d.ts +5 -0
  47. package/dist/commands/arguments.d.ts.map +1 -1
  48. package/dist/commands/arguments.js +121 -41
  49. package/dist/commands/arguments.js.map +1 -1
  50. package/dist/commands/builders.d.ts +2 -0
  51. package/dist/commands/builders.d.ts.map +1 -1
  52. package/dist/commands/builders.js +3 -0
  53. package/dist/commands/builders.js.map +1 -1
  54. package/dist/commands/context.d.ts +39 -9
  55. package/dist/commands/context.d.ts.map +1 -1
  56. package/dist/commands/context.js +98 -26
  57. package/dist/commands/context.js.map +1 -1
  58. package/dist/commands/definition.d.ts +12 -5
  59. package/dist/commands/definition.d.ts.map +1 -1
  60. package/dist/commands/definition.js +3 -5
  61. package/dist/commands/definition.js.map +1 -1
  62. package/dist/commands/help.d.ts +4 -0
  63. package/dist/commands/help.d.ts.map +1 -0
  64. package/dist/commands/help.js +45 -0
  65. package/dist/commands/help.js.map +1 -0
  66. package/dist/context.d.ts +1 -0
  67. package/dist/context.d.ts.map +1 -1
  68. package/dist/context.js +1 -0
  69. package/dist/context.js.map +1 -1
  70. package/dist/domain/decimal.d.ts +4 -0
  71. package/dist/domain/decimal.d.ts.map +1 -0
  72. package/dist/domain/decimal.js +84 -0
  73. package/dist/domain/decimal.js.map +1 -0
  74. package/dist/domain/music-state.d.ts +3 -0
  75. package/dist/domain/music-state.d.ts.map +1 -0
  76. package/dist/domain/music-state.js +10 -0
  77. package/dist/domain/music-state.js.map +1 -0
  78. package/dist/domain/music.d.ts +199 -0
  79. package/dist/domain/music.d.ts.map +1 -0
  80. package/dist/domain/music.js +2 -0
  81. package/dist/domain/music.js.map +1 -0
  82. package/dist/domain/state-validation.d.ts.map +1 -1
  83. package/dist/domain/state-validation.js +2 -0
  84. package/dist/domain/state-validation.js.map +1 -1
  85. package/dist/domain/state.d.ts +1 -0
  86. package/dist/domain/state.d.ts.map +1 -1
  87. package/dist/domain/state.js.map +1 -1
  88. package/dist/domain/track-queue.d.ts +24 -0
  89. package/dist/domain/track-queue.d.ts.map +1 -0
  90. package/dist/domain/track-queue.js +103 -0
  91. package/dist/domain/track-queue.js.map +1 -0
  92. package/dist/domain/variable-query.d.ts +29 -0
  93. package/dist/domain/variable-query.d.ts.map +1 -0
  94. package/dist/domain/variable-query.js +53 -0
  95. package/dist/domain/variable-query.js.map +1 -0
  96. package/dist/framework/bot.d.ts +17 -3
  97. package/dist/framework/bot.d.ts.map +1 -1
  98. package/dist/framework/bot.js +154 -41
  99. package/dist/framework/bot.js.map +1 -1
  100. package/dist/framework/command-registry.d.ts +8 -1
  101. package/dist/framework/command-registry.d.ts.map +1 -1
  102. package/dist/framework/command-registry.js +98 -36
  103. package/dist/framework/command-registry.js.map +1 -1
  104. package/dist/framework/options.d.ts +6 -0
  105. package/dist/framework/options.d.ts.map +1 -1
  106. package/dist/framework/options.js.map +1 -1
  107. package/dist/framework/rate-limits.d.ts +3 -0
  108. package/dist/framework/rate-limits.d.ts.map +1 -1
  109. package/dist/framework/rate-limits.js +15 -9
  110. package/dist/framework/rate-limits.js.map +1 -1
  111. package/dist/framework/reporting.js +1 -1
  112. package/dist/framework/reporting.js.map +1 -1
  113. package/dist/framework/routing.d.ts +1 -0
  114. package/dist/framework/routing.d.ts.map +1 -1
  115. package/dist/framework/routing.js +1 -1
  116. package/dist/framework/routing.js.map +1 -1
  117. package/dist/images.d.ts +3 -0
  118. package/dist/images.d.ts.map +1 -0
  119. package/dist/images.js +2 -0
  120. package/dist/images.js.map +1 -0
  121. package/dist/index.d.ts +5 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +2 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/infrastructure/fluxer/lavalink-bridge.d.ts +34 -0
  126. package/dist/infrastructure/fluxer/lavalink-bridge.d.ts.map +1 -0
  127. package/dist/infrastructure/fluxer/lavalink-bridge.js +250 -0
  128. package/dist/infrastructure/fluxer/lavalink-bridge.js.map +1 -0
  129. package/dist/infrastructure/fluxer/resources/users.d.ts.map +1 -1
  130. package/dist/infrastructure/fluxer/resources/users.js +6 -0
  131. package/dist/infrastructure/fluxer/resources/users.js.map +1 -1
  132. package/dist/infrastructure/fluxer/voice.d.ts +28 -0
  133. package/dist/infrastructure/fluxer/voice.d.ts.map +1 -0
  134. package/dist/infrastructure/fluxer/voice.js +157 -0
  135. package/dist/infrastructure/fluxer/voice.js.map +1 -0
  136. package/dist/infrastructure/images/transform.d.ts +21 -0
  137. package/dist/infrastructure/images/transform.d.ts.map +1 -0
  138. package/dist/infrastructure/images/transform.js +72 -0
  139. package/dist/infrastructure/images/transform.js.map +1 -0
  140. package/dist/infrastructure/images/worker.mjs +28 -0
  141. package/dist/infrastructure/lavalink/audio-stream.d.ts +12 -0
  142. package/dist/infrastructure/lavalink/audio-stream.d.ts.map +1 -0
  143. package/dist/infrastructure/lavalink/audio-stream.js +95 -0
  144. package/dist/infrastructure/lavalink/audio-stream.js.map +1 -0
  145. package/dist/infrastructure/lavalink/node.d.ts +147 -0
  146. package/dist/infrastructure/lavalink/node.d.ts.map +1 -0
  147. package/dist/infrastructure/lavalink/node.js +498 -0
  148. package/dist/infrastructure/lavalink/node.js.map +1 -0
  149. package/dist/infrastructure/lavalink/protocol.d.ts +10 -0
  150. package/dist/infrastructure/lavalink/protocol.d.ts.map +1 -0
  151. package/dist/infrastructure/lavalink/protocol.js +114 -0
  152. package/dist/infrastructure/lavalink/protocol.js.map +1 -0
  153. package/dist/infrastructure/storage/memory.d.ts +2 -0
  154. package/dist/infrastructure/storage/memory.d.ts.map +1 -1
  155. package/dist/infrastructure/storage/memory.js +8 -0
  156. package/dist/infrastructure/storage/memory.js.map +1 -1
  157. package/dist/infrastructure/storage/sqlite.d.ts +4 -0
  158. package/dist/infrastructure/storage/sqlite.d.ts.map +1 -1
  159. package/dist/infrastructure/storage/sqlite.js +53 -3
  160. package/dist/infrastructure/storage/sqlite.js.map +1 -1
  161. package/dist/music.d.ts +12 -0
  162. package/dist/music.d.ts.map +1 -0
  163. package/dist/music.js +6 -0
  164. package/dist/music.js.map +1 -0
  165. package/dist/ports/music.d.ts +25 -0
  166. package/dist/ports/music.d.ts.map +1 -0
  167. package/dist/ports/music.js +2 -0
  168. package/dist/ports/music.js.map +1 -0
  169. package/dist/ports/resources/users.d.ts +2 -0
  170. package/dist/ports/resources/users.d.ts.map +1 -1
  171. package/dist/ports/resources/users.js.map +1 -1
  172. package/dist/ports/store.d.ts +5 -1
  173. package/dist/ports/store.d.ts.map +1 -1
  174. package/dist/ports/store.js.map +1 -1
  175. package/dist/ports/voice.d.ts +28 -0
  176. package/dist/ports/voice.d.ts.map +1 -0
  177. package/dist/ports/voice.js +2 -0
  178. package/dist/ports/voice.js.map +1 -0
  179. package/dist/scripting/builtins/flow.d.ts.map +1 -1
  180. package/dist/scripting/builtins/flow.js +2 -1
  181. package/dist/scripting/builtins/flow.js.map +1 -1
  182. package/dist/scripting/builtins/http.d.ts.map +1 -1
  183. package/dist/scripting/builtins/http.js +59 -0
  184. package/dist/scripting/builtins/http.js.map +1 -1
  185. package/dist/scripting/builtins/language/decimals.d.ts +2 -0
  186. package/dist/scripting/builtins/language/decimals.d.ts.map +1 -0
  187. package/dist/scripting/builtins/language/decimals.js +9 -0
  188. package/dist/scripting/builtins/language/decimals.js.map +1 -0
  189. package/dist/scripting/builtins/language/index.d.ts.map +1 -1
  190. package/dist/scripting/builtins/language/index.js +6 -0
  191. package/dist/scripting/builtins/language/index.js.map +1 -1
  192. package/dist/scripting/builtins/language/loops.d.ts.map +1 -1
  193. package/dist/scripting/builtins/language/loops.js +69 -7
  194. package/dist/scripting/builtins/language/loops.js.map +1 -1
  195. package/dist/scripting/builtins/language/regex.d.ts +2 -0
  196. package/dist/scripting/builtins/language/regex.d.ts.map +1 -0
  197. package/dist/scripting/builtins/language/regex.js +17 -0
  198. package/dist/scripting/builtins/language/regex.js.map +1 -0
  199. package/dist/scripting/builtins/language/sort.d.ts +2 -0
  200. package/dist/scripting/builtins/language/sort.d.ts.map +1 -0
  201. package/dist/scripting/builtins/language/sort.js +55 -0
  202. package/dist/scripting/builtins/language/sort.js.map +1 -0
  203. package/dist/scripting/builtins/native-users.d.ts.map +1 -1
  204. package/dist/scripting/builtins/native-users.js +5 -0
  205. package/dist/scripting/builtins/native-users.js.map +1 -1
  206. package/dist/scripting/builtins/schedule.js +12 -12
  207. package/dist/scripting/builtins/schedule.js.map +1 -1
  208. package/dist/scripting/builtins/storage.d.ts.map +1 -1
  209. package/dist/scripting/builtins/storage.js +8 -0
  210. package/dist/scripting/builtins/storage.js.map +1 -1
  211. package/dist/scripting/control-flow.d.ts +8 -0
  212. package/dist/scripting/control-flow.d.ts.map +1 -0
  213. package/dist/scripting/control-flow.js +18 -0
  214. package/dist/scripting/control-flow.js.map +1 -0
  215. package/dist/scripting/evaluator.d.ts +1 -0
  216. package/dist/scripting/evaluator.d.ts.map +1 -1
  217. package/dist/scripting/evaluator.js +36 -11
  218. package/dist/scripting/evaluator.js.map +1 -1
  219. package/dist/scripting/parser.d.ts.map +1 -1
  220. package/dist/scripting/parser.js +20 -11
  221. package/dist/scripting/parser.js.map +1 -1
  222. package/dist/scripting/regex-worker.mjs +69 -0
  223. package/dist/scripting/regex.d.ts +19 -0
  224. package/dist/scripting/regex.d.ts.map +1 -0
  225. package/dist/scripting/regex.js +61 -0
  226. package/dist/scripting/regex.js.map +1 -0
  227. package/dist/scripting/registry.d.ts +2 -1
  228. package/dist/scripting/registry.d.ts.map +1 -1
  229. package/dist/scripting/registry.js +9 -2
  230. package/dist/scripting/registry.js.map +1 -1
  231. package/dist/services/attachments.d.ts +10 -0
  232. package/dist/services/attachments.d.ts.map +1 -0
  233. package/dist/services/attachments.js +52 -0
  234. package/dist/services/attachments.js.map +1 -0
  235. package/dist/services/authorization.d.ts +1 -0
  236. package/dist/services/authorization.d.ts.map +1 -1
  237. package/dist/services/authorization.js +10 -0
  238. package/dist/services/authorization.js.map +1 -1
  239. package/dist/services/music-player.d.ts +90 -0
  240. package/dist/services/music-player.d.ts.map +1 -0
  241. package/dist/services/music-player.js +475 -0
  242. package/dist/services/music-player.js.map +1 -0
  243. package/dist/services/music.d.ts +50 -0
  244. package/dist/services/music.d.ts.map +1 -0
  245. package/dist/services/music.js +177 -0
  246. package/dist/services/music.js.map +1 -0
  247. package/dist/services/native-data.d.ts +2 -0
  248. package/dist/services/native-data.d.ts.map +1 -1
  249. package/dist/services/native-data.js +3 -0
  250. package/dist/services/native-data.js.map +1 -1
  251. package/dist/services/scheduler.d.ts +4 -0
  252. package/dist/services/scheduler.d.ts.map +1 -1
  253. package/dist/services/scheduler.js +10 -2
  254. package/dist/services/scheduler.js.map +1 -1
  255. package/dist/services/variables.d.ts +2 -0
  256. package/dist/services/variables.d.ts.map +1 -1
  257. package/dist/services/variables.js +11 -0
  258. package/dist/services/variables.js.map +1 -1
  259. package/dist/shared/package.d.ts +4 -0
  260. package/dist/shared/package.d.ts.map +1 -0
  261. package/dist/shared/package.js +7 -0
  262. package/dist/shared/package.js.map +1 -0
  263. package/dist/testing/music.d.ts +35 -0
  264. package/dist/testing/music.d.ts.map +1 -0
  265. package/dist/testing/music.js +88 -0
  266. package/dist/testing/music.js.map +1 -0
  267. package/dist/testing.d.ts +36 -0
  268. package/dist/testing.d.ts.map +1 -1
  269. package/dist/testing.js +64 -2
  270. package/dist/testing.js.map +1 -1
  271. package/docs/API.md +60 -4
  272. package/docs/ARCHITECTURE.md +22 -3
  273. package/docs/BENCHMARKS.md +195 -2
  274. package/docs/CLI.md +41 -10
  275. package/docs/COOKBOOK.md +1 -1
  276. package/docs/EDITOR.md +2 -2
  277. package/docs/EVENTS.md +8 -0
  278. package/docs/FRAMEWORK.md +7 -0
  279. package/docs/FUNCTION-GAPS.md +51 -32
  280. package/docs/FUNCTIONS.md +22 -4
  281. package/docs/HTTP.md +23 -0
  282. package/docs/IMAGES.md +104 -0
  283. package/docs/INTEGRATIONS.md +69 -0
  284. package/docs/LANGUAGE-EXTENSIONS.md +106 -0
  285. package/docs/LANGUAGE.md +4 -4
  286. package/docs/MUSIC.md +339 -0
  287. package/docs/NATIVE.md +92 -6
  288. package/docs/PARITY.md +33 -20
  289. package/docs/PLAN.md +36 -1
  290. package/docs/PROJECT.md +35 -0
  291. package/docs/QUICKSTART.md +78 -50
  292. package/docs/README.md +39 -24
  293. package/docs/REPOSITORY.md +70 -0
  294. package/docs/SCHEDULER.md +17 -0
  295. package/docs/STORAGE.md +49 -0
  296. package/docs/TESTING.md +82 -2
  297. package/docs/TROUBLESHOOTING.md +13 -3
  298. package/docs/VALIDATION.md +206 -0
  299. package/docs/tutorials/DATA.md +100 -0
  300. package/docs/tutorials/FIRST-COMMAND.md +134 -0
  301. package/docs/tutorials/FUNCTION-MODE.md +100 -0
  302. package/docs/tutorials/TESTING.md +84 -0
  303. package/editors/vscode/functions.json +147 -3
  304. package/editors/vscode/package.json +1 -1
  305. package/examples/lavalink.ts +55 -0
  306. package/examples/music-offline.ts +25 -0
  307. package/examples/native-voice.ts +26 -0
  308. package/package.json +45 -4
  309. package/src/cli/arguments.ts +17 -11
  310. package/src/cli/command-catalog.ts +37 -0
  311. package/src/cli/main.ts +11 -4
  312. package/src/cli/scaffold.ts +10 -7
  313. package/src/cli/version.ts +1 -10
  314. package/src/commands/arguments.ts +96 -36
  315. package/src/commands/builders.ts +3 -0
  316. package/src/commands/context.ts +95 -25
  317. package/src/commands/definition.ts +15 -11
  318. package/src/commands/help.ts +37 -0
  319. package/src/context.ts +1 -0
  320. package/src/domain/decimal.ts +75 -0
  321. package/src/domain/music-state.ts +10 -0
  322. package/src/domain/music.ts +82 -0
  323. package/src/domain/state-validation.ts +1 -0
  324. package/src/domain/state.ts +1 -0
  325. package/src/domain/track-queue.ts +79 -0
  326. package/src/domain/variable-query.ts +58 -0
  327. package/src/framework/bot.ts +131 -36
  328. package/src/framework/command-registry.ts +93 -43
  329. package/src/framework/options.ts +6 -0
  330. package/src/framework/rate-limits.ts +11 -6
  331. package/src/framework/reporting.ts +1 -1
  332. package/src/framework/routing.ts +2 -2
  333. package/src/images.ts +2 -0
  334. package/src/index.ts +5 -0
  335. package/src/infrastructure/fluxer/lavalink-bridge.ts +200 -0
  336. package/src/infrastructure/fluxer/resources/users.ts +5 -0
  337. package/src/infrastructure/fluxer/voice.ts +108 -0
  338. package/src/infrastructure/images/transform.ts +66 -0
  339. package/src/infrastructure/images/worker.mjs +28 -0
  340. package/src/infrastructure/lavalink/audio-stream.ts +71 -0
  341. package/src/infrastructure/lavalink/node.ts +425 -0
  342. package/src/infrastructure/lavalink/protocol.ts +84 -0
  343. package/src/infrastructure/storage/memory.ts +10 -0
  344. package/src/infrastructure/storage/sqlite.ts +52 -4
  345. package/src/music.ts +11 -0
  346. package/src/ports/music.ts +24 -0
  347. package/src/ports/resources/users.ts +2 -0
  348. package/src/ports/store.ts +5 -1
  349. package/src/ports/voice.ts +26 -0
  350. package/src/scripting/builtins/flow.ts +2 -1
  351. package/src/scripting/builtins/http.ts +44 -0
  352. package/src/scripting/builtins/language/decimals.ts +10 -0
  353. package/src/scripting/builtins/language/index.ts +6 -0
  354. package/src/scripting/builtins/language/loops.ts +57 -8
  355. package/src/scripting/builtins/language/regex.ts +19 -0
  356. package/src/scripting/builtins/language/sort.ts +50 -0
  357. package/src/scripting/builtins/native-users.ts +5 -0
  358. package/src/scripting/builtins/schedule.ts +15 -15
  359. package/src/scripting/builtins/storage.ts +7 -0
  360. package/src/scripting/control-flow.ts +13 -0
  361. package/src/scripting/evaluator.ts +27 -9
  362. package/src/scripting/parser.ts +23 -10
  363. package/src/scripting/regex-worker.mjs +69 -0
  364. package/src/scripting/regex.ts +63 -0
  365. package/src/scripting/registry.ts +7 -2
  366. package/src/services/attachments.ts +49 -0
  367. package/src/services/authorization.ts +9 -0
  368. package/src/services/music-player.ts +340 -0
  369. package/src/services/music.ts +146 -0
  370. package/src/services/native-data.ts +5 -0
  371. package/src/services/scheduler.ts +11 -2
  372. package/src/services/variables.ts +11 -0
  373. package/src/shared/package.ts +10 -0
  374. package/src/testing/music.ts +71 -0
  375. package/src/testing.ts +92 -2
package/CHANGELOG.md CHANGED
@@ -21,6 +21,52 @@ documentos. Veja a [política completa](VERSIONING.md).
21
21
 
22
22
  </details>
23
23
 
24
+ ## v0.1.7 · 23/10/2026
25
+
26
+ 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).
27
+
28
+ - `yuzuha functions --search <termo>` filtra nomes, aliases e descrições por trecho, sem distinguir maiúsculas e minúsculas. Aceita `$` inicial e combina com categoria, JSON, exportação de catálogo e filtros de plugins, preservando a ordem dos resultados.
29
+ - Buscas sem resultados encerram com sucesso e retornam uma mensagem no terminal ou uma lista vazia em JSON. Termos vazios, ausentes ou repetidos são recusados; categorias desconhecidas continuam sendo erros.
30
+ - Consultas paginadas de variáveis por prefixo, com TTL e cursor; índice SQLite derivado do snapshot e invalidado por trigger. Streaming UTF-8 em scripts, com backpressure, controle de loop e cancelamento.
31
+ - `yuzuha/images` adiciona transformação opcional de PNG/JPEG/WebP com Sharp em processos limitados e canceláveis. `ctx.sendStream` lê anexos com orçamento e prazo antes do upload de bytes exigido pelo SDK.
32
+ - Auditoria de integrações documenta configuração de shards já suportada pelo core, gerenciamento externo de processos e ausência de contratos para componentes/comandos de aplicação.
33
+ - Tarefas aceitam prioridade persistida; `globalConcurrency` coordena claims no store compartilhado, preservando o limite local.
34
+ - **18 funções novas**, totalizando **306**: `guildFeatures`, `leaveGuild`, `while`, `break`, `continue`, `arraySortWith`, `sortLeft`, `sortRight`, `regexTest`, `regexMatch`, `regexReplace`, `decimal`, `decimalCompare`, `decimalRound`, `queryVars`, `httpStream`, `httpChunk` e `httpChunkIndex`.
35
+ - `ctx.guildFeatures()` copia as features do servidor; `ctx.leaveGuild()` só permite a saída solicitada pelo dono do servidor, com a mesma autorização nos scripts. Ports customizados antigos continuam válidos; ausência do recurso retorna `NATIVE_UNAVAILABLE`.
36
+ - Loops restauram o contexto ao sair; `break` e `continue` atravessam `$try` e afetam o corpo do loop mais próximo. Comparadores usam ordenação estável e orçamento compartilhado. Decimais retornam texto e usam até 1000 dígitos, sem perda por `Number`.
37
+ - Regex roda em workers limitados, com cancelamento, prazo e limites de entrada, correspondências e saída. O worker é incluído no tarball e não executa JavaScript fornecido pelo script.
38
+ - Inclui as otimizações de dispatch, runtime e estado, as APIs nativas de música, a integração Lavalink v4 e a ponte de áudio descritas na entrada 0.1.6. SDK 3.3.0, schema 2 e imports anteriores permanecem compatíveis.
39
+ - Erros do gateway e de shards chegam aos hooks `onError`/`onLog` mesmo sem listeners do usuário. Os listeners padrão permanecem ativos durante o encerramento e preservam os listeners de clients injetados.
40
+ - O parser salta trechos de texto comum mantendo offsets, escapes e diagnósticos. A limpeza de `$httpStream` não bloqueia o comando quando a fonte deixa o cancelamento pendente.
41
+ - Biblioteca e CLI voltam à raiz do repositório, com instalação npm, guias Markdown e exemplos incluídos no pacote. O site fica arquivado para uma etapa futura.
42
+
43
+ ## v0.1.6 · 22/10/2026
44
+
45
+ Dispatch, argumentos, runtime e leituras de estado mais rápidos, com ferramentas nativas para música e integração Lavalink v4. Esta atualização da biblioteca Yuzuha foi preparada em 22/10/2026 (v0.1.6).
46
+
47
+ - Deduplicação usa uma fila circular de 10000 entradas; mensagens ignoradas seguem um caminho curto. Prefixos estáticos são reaproveitados, o sinal de encerramento é compartilhado e serviços, mapas de argumentos e variáveis do contexto são criados sob demanda.
48
+ - Registro individual de comandos valida conflitos antes de inserir, sem copiar todo o catálogo. Carga e recarga continuam atômicas. Argumentos simples usam tokenização por trechos; o caminho de aspas/apóstrofos evita inspecionar repetidamente a palavra em construção. Escapes, flags e erros de entrada são preservados.
49
+ - Parser acumula trechos de texto; evaluator evita promises para literais e resolve funções com cache fraco por AST. A validação continua ativa para ASTs externos ou editados, com ordem, tipos, guards, orçamento e falhas parciais preservados.
50
+ - Leituras pontuais em memória e JSON copiam somente o valor solicitado e respeitam TTL e ordenação das transações. Stores próprios conservam o caminho anterior; `readVariable` é uma capacidade opcional. SQLite reutiliza statements sem alterar schema, WAL ou validação antes do commit.
51
+ - `yuzuha/music` entrega cliente Lavalink v4 com REST/WebSocket autenticados, retomada de sessão, reconexão limitada, cancelamento, limite de respostas/requisições, cache LRU com orçamento de bytes e compartilhamento de buscas simultâneas.
52
+ - Gerenciador de música com distribuição de novos players entre nodes disponíveis, filas limitadas por servidor, avanço automático, loop, pause, skip, stop, seek, volume e filtros. Controles e eventos são serializados; falhas de PATCH preservam as faixas pendentes.
53
+ - Sessões Lavalink perdidas são reconstruídas com concorrência limitada, posição, pausa, filtros e renovação de voz. Sessões retomadas preservam a reprodução; eventos aguardam a confirmação do handshake. Respostas antigas não alteram a fila.
54
+ - Filas permitem remover, mover, embaralhar e consultar páginas sem copiar todo o catálogo. Controles pendentes são limitados por player; eventos de fim mantêm capacidade reservada. Nodes consideram CPU, players e frames ao distribuir carga; saídas pelo plugin ignoram os contadores de voz Discord, evitando perda falsa no balanceamento.
55
+ - Buscas com signals distintos compartilham a requisição, com cancelamento por chamada e aborto quando todos desistem. Decode de faixas/lotes e diagnósticos de cache/rede completam a API; parsing de flags evita mapas e objetos temporários por valor.
56
+ - `FluxerVoice` carrega `@fluxerjs/voice` opcionalmente para áudio WebM/Opus nativo. `ctx.voice` e `ctx.music` recebem serviços configurados e participam do encerramento.
57
+ - `FluxerLavalinkBridge` e o plugin `yuzuha-audio` conectam a saída Opus do Lavalink 4.2.2 ao SDK do Fluxer. Mantêm uma publicação entre faixas, pausa, seek e filtros; transmissão incremental, limites, cancelamento e reconexão liberam os recursos por servidor. A integração local usa áudio e decoder reais, com publicação LiveKit simulada.
58
+ - `MockMusicBackend`, `mockTrack`, exemplo offline, guia de música e benchmarks adicionais acompanham a versão. Relatórios anteriores/atuais e método estão em [BENCHMARKS.md](docs/BENCHMARKS.md). SDK 3.3.0, schema 2 e 288 funções de script permanecem compatíveis.
59
+
60
+ ## v0.1.5 · 22/10/2026
61
+
62
+ Subcomandos e flags tipadas, ajuda derivada das definições e testes nativos com relógio controlável, com projetos gerados prontos para compartilhar. Esta atualização da biblioteca Yuzuha foi preparada em 22/10/2026 (v0.1.5).
63
+
64
+ - Comandos aceitam árvores de subcomandos e flags com inferência de tipos, aliases, valores entre aspas e separador `--`. As restrições dos grupos são preservadas na execução dos filhos.
65
+ - Ajuda detalha argumentos, flags, escolhas, valores padrão, exemplos e subcomandos. Erros de entrada incluem o uso esperado; metadados também ficam disponíveis no JSON de `check`.
66
+ - `createTestBot`, em `yuzuha/testing`, reúne transporte, recursos simulados, estado isolado, mensagens, erros e resultados. O relógio controlável permite verificar cooldown, TTL e tarefas sem aguardar tempo real; o descarte aguarda o encerramento.
67
+ - `init` usa dependência npm por padrão; `--local` seleciona a instalação local explicitamente. Projetos JS/TS incluem teste offline de exemplo e `npm test`.
68
+ - SDK permanece em 3.3.0 e o catálogo mantém 288 funções. Os contratos e exemplos novos são compartilhados com a documentação e a validação do pacote instalado.
69
+
24
70
  ## v0.1.4 · 22/10/2026
25
71
 
26
72
  Eventos em scripts, cron com fuso, HTTP em streaming e ferramentas de manutenção e testes offline, com autorização compartilhada nos recursos. Esta atualização da biblioteca Yuzuha foi preparada em 22/10/2026 (v0.1.4).
package/README.md CHANGED
@@ -1,157 +1,198 @@
1
1
  # Yuzuha
2
2
 
3
- Framework para bots do Fluxer: a ergonomia que falta no Fluxer.js, com comandos
4
- tipados, guards, estado, moderação, agendamentos e testes offline. Function mode
5
- (scripts no estilo ForgeScript) é opcional. Versão **0.1.4**.
3
+ Framework TypeScript para bots do [Fluxer](https://fluxer.app), com comandos
4
+ tipados em JavaScript/TypeScript e uma linguagem opcional de scripts.
5
+ Os dois modos compartilham permissões, moderação, estado e recursos.
6
6
 
7
- ```ts
8
- import { arg, defineCommand, Yuzuha } from 'yuzuha';
7
+ O Yuzuha usa **Fluxer.js 3.3.0**. Você continua tendo acesso ao client original
8
+ por `bot.client` e aos exports do SDK em `yuzuha/sdk`.
9
9
 
10
- const bot = new Yuzuha({ name: 'meu-bot', prefix: '!' });
10
+ [0.1.7](CHANGELOG.md) · Node **22.13+** · ESM · [MIT](LICENSE)
11
11
 
12
- bot.command(defineCommand({
13
- name: 'ban',
14
- description: 'Bane um membro e registra um caso.',
15
- args: {
16
- membro: arg.user().required(),
17
- motivo: arg.text().rest(),
18
- },
19
- async run(ctx) {
20
- const caso = await ctx.mod.ban(ctx.args.get('membro'), {
21
- reason: ctx.args.get('motivo') ?? '',
22
- });
23
- await ctx.reply(`Membro banido. Caso #${caso.id}.`);
24
- },
25
- }));
12
+ [Começar](#começar) · [Comandos](#escrever-comandos) · [Recursos](#recursos) · [Testes](#testar-sem-token) · [Documentação](#documentação)
13
+
14
+ ## Começar
15
+
16
+ ### Criar um bot
17
+
18
+ ```sh
19
+ npx yuzuha@0.1.7 init ./meu-bot --ts
20
+ cd meu-bot
21
+ npm install
22
+ npm run check
23
+ npm run typecheck
24
+ npm test
25
+ cp .env.example .env
26
+ ```
26
27
 
27
- await bot.login();
28
+ Preencha `FLUXER_BOT_TOKEN` no `.env` e inicie o bot:
29
+
30
+ ```sh
31
+ npm run dev
28
32
  ```
29
33
 
30
- Uso: `!ban @membro spam no chat`. `ctx.mod.ban` verifica permissões e hierarquia,
31
- executa o banimento e registra o caso. O token vem de `FLUXER_BOT_TOKEN`.
32
- `bot.client` continua sendo o client real do Fluxer.js.
34
+ O projeto inclui três comandos, configuração e um teste offline. Para JavaScript,
35
+ troque `--ts` por `--js` e omita `typecheck`. Acrescente `--functions` ao `init`
36
+ para incluir um comando de exemplo com scripts.
33
37
 
34
- ## O que o Yuzuha adiciona ao Fluxer.js
38
+ `npm run check`, `npm run typecheck` e `npm test` validam o projeto sem conectar o bot.
39
+ `npm run dev` conecta e recarrega os arquivos de comando ao editar;
40
+ `npm start` executa sem recarga automática.
35
41
 
36
- - Comandos com prefixos, aliases, argumentos tipados, cooldowns e permissões.
37
- - Guards, middleware, plugins, eventos tipados e recarga de comandos sem reiniciar.
38
- - Moderação compartilhada (ban, kick, timeout, unban) com casos por servidor.
39
- - Recursos prontos: usuários, cargos, canais, mensagens, convites, webhooks,
40
- emojis, stickers, threads e fóruns, incluindo reações, membros de threads,
41
- posição de cargos/canais e categorias.
42
- - Estado em memória, JSON ou SQLite, com transações e variáveis por escopo.
43
- - Agendamentos persistentes com cron, fuso IANA, concorrência e retry com jitter.
44
- - HTTP textual/binário, streaming e multipart, com limites e políticas por comando.
45
- - `MockTransport`, `mockResources` e `MemoryStore` para testar sem token.
46
- - Transações entre chaves, agendamentos editáveis com pausa/retry e apelidos com autorização compartilhada.
47
- - Limpeza de expirados, estatísticas e backup/restauração versionados com simulação.
48
- - `doctor`, lint JSON, cenários offline, catálogos de plugins e extensão VS Code.
49
- - SDK `@fluxerjs/core` **3.3.0** reexportado em `yuzuha/sdk`, sem esconder o original.
42
+ ### Usar em um projeto existente
50
43
 
51
- Não é um fork do Fluxer.js nem um wrapper de todos os métodos do SDK. O que não
52
- estiver no framework continua acessível por `bot.client` e pelos tipos originais.
44
+ ```sh
45
+ npm install yuzuha@0.1.7
46
+ ```
53
47
 
54
- ## Function mode (opcional)
48
+ Use `"type": "module"` no `package.json`. O [guia inicial](docs/QUICKSTART.md)
49
+ mostra como configurar o bot e carregar comandos.
55
50
 
56
- Quem preferir a sintaxe curta do ForgeScript pode usar `yuzuha/functions`. O
57
- runtime é ativado quando um comando com `code` ou um evento de script é registrado.
51
+ ## Escrever comandos
52
+
53
+ Salve **uma das versões** abaixo em `commands/eco.ts` (`.js` para JavaScript).
54
+ Ambas respondem a `!eco Olá, Yuzuha!` com `Olá, Yuzuha!`.
55
+
56
+ ### JavaScript / TypeScript
58
57
 
59
58
  ```ts
60
- import { script } from 'yuzuha/functions';
61
- import { Yuzuha } from 'yuzuha';
59
+ import { arg, defineCommand } from 'yuzuha';
62
60
 
63
- const bot = new Yuzuha({ prefix: '!' });
61
+ export default defineCommand({
62
+ name: 'eco',
63
+ description: 'Repete o texto informado.',
64
+ args: { texto: arg.text().rest().required() },
65
+ async run(ctx) {
66
+ await ctx.reply(ctx.args.get('texto'));
67
+ },
68
+ });
69
+ ```
70
+
71
+ Schemas `arg.*` inferem os tipos de argumentos e flags. Você também pode declarar
72
+ subcomandos, checks e middleware. O [guia nativo](docs/NATIVE.md) cobre esses
73
+ contratos, eventos, moderação e persistência.
74
+
75
+ ### Function mode do Yuzuha
76
+
77
+ ```ts
78
+ import { script } from 'yuzuha/functions';
64
79
 
65
- bot.command(script({
66
- name: 'ban',
67
- code: '$modBan[$mentioned[1];$messageSlice[1]]$reply[Membro banido. Caso #$caseID.]',
68
- }));
80
+ export default script({
81
+ name: 'eco',
82
+ description: 'Repete o texto informado.',
83
+ code: '$reply[$messageSlice[0]]',
84
+ });
69
85
  ```
70
86
 
71
- Os dois modos compartilham guards, estado, moderação e recursos. São
72
- **288 funções** com referência gerada, ou use `bot.enableFunctions()` para
73
- pré-carregar o runtime.
87
+ O function mode tem **306 funções** para mensagens, guards, moderação, variáveis,
88
+ JSON, arrays, loops, eventos e agendamentos. O runtime é ativado ao registrar um
89
+ comando com `code` ou um evento de script.
74
90
 
75
- `bot.scriptEvent()` registra scripts para entrada/saída de membros, edição/exclusão
76
- de mensagens e reações. O contexto preserva os dados disponíveis do evento e exige
77
- um canal real para enviar respostas. Veja [eventos](docs/EVENTS.md).
91
+ As funções seguem as assinaturas e regras do runtime do Yuzuha. Consulte a
92
+ [linguagem](docs/LANGUAGE.md), as [assinaturas das funções](docs/FUNCTIONS.md)
93
+ e a [cobertura](docs/PARITY.md).
78
94
 
79
- ## Instalar pelo npm
95
+ ## Recursos
80
96
 
81
- Requer Node **22.13 ou mais recente**. O pacote é ESM; use `"type": "module"`
82
- no `package.json` do seu projeto.
97
+ | Área | O que está disponível |
98
+ |---|---|
99
+ | Comandos | Prefixos, aliases, subcomandos, argumentos e flags tipadas, cooldowns e ajuda gerada dos metadados |
100
+ | Extensões | Plugins, eventos, checks, middleware e recarga atômica de comandos |
101
+ | Moderação | Ban, kick, timeout, unban e moderação de voz, com permissões, hierarquia e casos por servidor |
102
+ | Fluxer | Usuários, membros, cargos, canais, mensagens, reações, anexos, threads, convites, webhooks e expressões |
103
+ | Dados | Memória, JSON e SQLite; TTL, transações, limpeza e backup/restauração com simulação |
104
+ | Agendamentos | Tarefas persistentes, cron, fusos IANA, pausa/retomada, histórico e retry |
105
+ | HTTP | Texto, bytes, streaming e multipart, com limites, cancelamento e políticas por comando |
106
+ | Música | Lavalink v4 com plugin e ponte de áudio para Fluxer, recuperação, filas editáveis, loop, seek, volume e filtros |
107
+ | Desenvolvimento | CLI, autocomplete e diagnósticos no VS Code, mocks e relógio controlável para testes |
83
108
 
84
- ```sh
85
- npm install yuzuha@0.1.4
86
- ```
109
+ ## Testar sem token
87
110
 
88
- Para gerar um bot novo:
111
+ O scaffold já inclui um teste executável com `npm test`. Para testar o comando
112
+ `eco` acima, crie `test/eco.test.ts` (`.js` para JavaScript):
89
113
 
90
- ```sh
91
- npx yuzuha@0.1.4 init ./meu-bot --ts
92
- cd meu-bot
93
- npm install yuzuha@0.1.4
94
- npm run check
95
- npm run typecheck
96
- cp .env.example .env
114
+ ```ts
115
+ import test from 'node:test';
116
+ import assert from 'node:assert/strict';
117
+ import { createTestBot } from 'yuzuha/testing';
118
+ import eco from '../commands/eco.js';
119
+
120
+ test('eco responde com o texto informado', async t => {
121
+ const fixture = createTestBot({ commands: [eco] });
122
+ t.after(() => fixture.destroy());
123
+
124
+ assert.equal(await fixture.send('!eco Olá, Yuzuha!'), 'success');
125
+ assert.equal(fixture.messages.at(-1)?.payload.content, 'Olá, Yuzuha!');
126
+ });
97
127
  ```
98
128
 
99
- `init` aponta inicialmente para a instalação que o executou. O `npm install`
100
- acima troca essa referência local pela versão do registro, permitindo mover e
101
- compartilhar o projeto. Para JavaScript, use `--js` e omita `typecheck`.
102
- Para acrescentar um exemplo de script, use `--functions`.
129
+ `createTestBot` usa transporte e recursos simulados, com estado isolado. O relógio
130
+ controlável permite testar cooldown, TTL e tarefas sem aguardar tempo real.
131
+ Veja fixtures, stores e cenários na [documentação de testes](docs/TESTING.md).
132
+
133
+ ## CLI
134
+
135
+ Execute estes comandos no diretório do seu bot:
136
+
137
+ | Comando | Uso |
138
+ |---|---|
139
+ | `npx yuzuha check` | Validar configuração e comandos sem login |
140
+ | `npx yuzuha doctor` | Diagnosticar ambiente, configuração e store |
141
+ | `npx yuzuha lint commands --json` | Analisar scripts sem importar módulos |
142
+ | `npx yuzuha functions --category moderation` | Consultar funções e assinaturas |
143
+ | `npx yuzuha functions --search mensagem` | Buscar funções por nome, alias ou descrição |
144
+ | `npx yuzuha editor` | Encontrar a extensão VS Code incluída no pacote |
145
+
146
+ `check` importa configurações e comandos JS/TS de confiança; a verificação de
147
+ tipos é feita por `npm run typecheck`. A [referência da CLI](docs/CLI.md) também cobre
148
+ catálogos de plugins, cenários offline e manutenção de dados.
149
+
150
+ ## Documentação
103
151
 
104
- Preencha `FLUXER_BOT_TOKEN` no `.env` e execute `npm run dev`.
152
+ O [índice completo](docs/README.md) reúne os guias e as referências.
105
153
 
106
- ## Desenvolver a biblioteca localmente
154
+ | Quero… | Ler |
155
+ |---|---|
156
+ | Criar e configurar um bot | [Guia inicial](docs/QUICKSTART.md) |
157
+ | Programar em JS/TS | [Guia nativo](docs/NATIVE.md), [framework](docs/FRAMEWORK.md) e [API](docs/API.md) |
158
+ | Criar um bot de música | [Lavalink, filas e voz Fluxer](docs/MUSIC.md) |
159
+ | Medir performance | [Benchmarks e comparações com a 0.1.5](docs/BENCHMARKS.md) |
160
+ | Escrever scripts `$...` | [Linguagem](docs/LANGUAGE.md) e [referência de funções](docs/FUNCTIONS.md) |
161
+ | Copiar exemplos | [Receitas](docs/COOKBOOK.md) e [código de exemplo](examples) |
162
+ | Usar o editor ou diagnosticar um erro | [VS Code](docs/EDITOR.md) e [problemas comuns](docs/TROUBLESHOOTING.md) |
163
+ | Entender a cobertura | [Paridade](docs/PARITY.md) e [funções ausentes](docs/FUNCTION-GAPS.md) |
164
+ | Conferir mudanças e validação | [Changelog](CHANGELOG.md), [versionamento](VERSIONING.md) e [evidências](docs/VALIDATION.md) |
165
+
166
+ ## Desenvolver a biblioteca
167
+
168
+ Na cópia do repositório:
107
169
 
108
170
  ```sh
109
- cd ~/Projects/yuzuha
171
+ git clone https://github.com/horizzon3507/yuzuha.git
172
+ cd yuzuha
110
173
  npm ci
111
- npm run build
112
- node dist/cli.js init ~/Projects/meu-bot --ts
113
- cd ~/Projects/meu-bot
114
- npm install
115
174
  npm run check
116
- npm run typecheck
117
- cp .env.example .env
175
+ npm run smoke:package
118
176
  ```
119
177
 
120
- O scaffold desse fluxo usa a biblioteca local. O
121
- [guia inicial](docs/QUICKSTART.md) explica instalação e configuração.
122
-
123
- ## Experimentar sem token
178
+ Para experimentar os exemplos offline:
124
179
 
125
180
  ```sh
126
181
  npx tsx examples/offline.ts
127
182
  npx tsx examples/function-mode.ts
128
- node dist/cli.js check examples/yuzuha.config.js --json
129
- node dist/cli.js functions --category moderation
130
183
  ```
131
184
 
132
- Os exemplos usam `MockTransport`; nenhuma ação chega ao Fluxer. `check` importa
133
- config e comandos JS/TS de confiança, valida os scripts e não chama `login`.
134
- Ele não substitui o typecheck do TypeScript.
185
+ Para gerar um bot que use sua instalação local da biblioteca:
135
186
 
136
- ## Documentação
187
+ ```sh
188
+ node dist/cli.js init ../meu-bot-local --ts --local
189
+ ```
137
190
 
138
- Comece pelo [índice da documentação](docs/README.md).
191
+ O `init` usa a dependência npm por padrão; `--local` aponta para a instalação
192
+ que executa a CLI. Veja [contribuição](CONTRIBUTING.md) para as regras de código
193
+ e as verificações do projeto.
139
194
 
140
- | Preciso de… | Documento |
141
- |---|---|
142
- | Criar meu primeiro bot JS ou TS | [Guia inicial](docs/QUICKSTART.md) |
143
- | Programar comandos, eventos e plugins | [Guia nativo JS/TS](docs/NATIVE.md) |
144
- | Escrever scripts `$...` | [Function mode](docs/LANGUAGE.md) e [referência](docs/FUNCTIONS.md) |
145
- | Saber quais funções de script existem | [Lacunas auditadas](docs/FUNCTION-GAPS.md) |
146
- | Usar comandos, contexto e extensões | [Framework](docs/FRAMEWORK.md) e [API](docs/API.md) |
147
- | Copiar exemplos completos | [Receitas](docs/COOKBOOK.md) |
148
- | Usar a linha de comando | [CLI](docs/CLI.md) |
149
- | Entender módulos e dependências | [Arquitetura](docs/ARCHITECTURE.md) |
150
- | Escolher persistência e tratar falhas | [Estado e execução](docs/STORAGE.md) |
151
- | Diagnosticar ou testar | [Problemas comuns](docs/TROUBLESHOOTING.md) e [testes](docs/TESTING.md) |
152
- | Usar autocomplete e diagnóstico offline | [Editor e doctor](docs/EDITOR.md) |
153
- | Medir dispatch, runtime e memória | [Benchmarks](docs/BENCHMARKS.md) |
154
- | Ver evidência local | [Validação](docs/VALIDATION.md) |
155
-
156
- As mudanças estão no [changelog](CHANGELOG.md); a política de versões está em
157
- [VERSIONING.md](VERSIONING.md). Leia [CONTRIBUTING.md](CONTRIBUTING.md) para contribuir.
195
+ Transformações opcionais de imagens e entrada de anexos por stream estão em
196
+ [IMAGES.md](docs/IMAGES.md); consultas por prefixo e cursor em
197
+ [STORAGE.md](docs/STORAGE.md), e limites das integrações em
198
+ [INTEGRATIONS.md](docs/INTEGRATIONS.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.4**.
4
+ A versão desta atualização é **0.1.7**.
5
5
 
6
6
  ## Pacote e histórico
7
7
 
8
8
  | Lugar | Formato nesta versão |
9
9
  |---|---|
10
- | `package.json` e raiz do `package-lock.json` | `0.1.4` |
11
- | Pacote npm e saída de `yuzuha --version` | `0.1.4` |
12
- | Título do changelog | `## v0.1.4 · 22/10/2026` |
13
- | Eventual tag Git | `v0.1.4` |
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` |
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,7 @@ 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` e `yuzuha/tooling`. A organização interna de `src/` não cria estabilidade de deep
33
+ `yuzuha/testing`, `yuzuha/tooling`, `yuzuha/music` e `yuzuha/images`. A organização interna de `src/` não cria estabilidade de deep
34
34
  imports. Schema persistido,
35
35
  gramática e funções documentadas também fazem parte da compatibilidade.
36
36
 
@@ -40,6 +40,59 @@ gerado por `init` pertence ao consumidor e não precisa acompanhar a biblioteca.
40
40
 
41
41
  ## Preparar uma atualização
42
42
 
43
+ ### Migrar para 0.1.7
44
+
45
+ A distribuição 0.1.7 inclui o conteúdo preparado na 0.1.6 e acrescenta
46
+ `yuzuha functions --search <termo>`. A busca combina com os filtros e formatos
47
+ existentes sem alterar imports anteriores, schema 2 ou SDK 3.3.0.
48
+ A linguagem recebe 18 funções, chegando a 306. `GuildInfo.features` e
49
+ `UsersResources.leaveGuild` são opcionais para preservar recursos customizados;
50
+ os novos auxiliares do contexto recusam recursos ausentes explicitamente.
51
+ O port `Store.queryVariables` também é opcional; memória/JSON mantêm fallback
52
+ por snapshot. SQLite cria um índice derivado automaticamente na primeira consulta,
53
+ sem alterar schema 2. Prioridade padrão é zero e capacidade compartilhada só é
54
+ ativada com `globalConcurrency`. `yuzuha/images` requer instalar Sharp; o restante
55
+ da biblioteca continua independente dele. Não há mudanças obrigatórias nos bots
56
+ existentes.
57
+ As instruções da 0.1.6 abaixo continuam aplicáveis ao atualizar da 0.1.5.
58
+
59
+ ### Migrar para 0.1.6
60
+
61
+ Imports, schema 2, SDK 3.3.0 e 288 funções permanecem disponíveis. Os serviços do
62
+ contexto e seus mapas são inicializados sob demanda; as referências devolvidas
63
+ continuam estáveis por contexto. Mensagens ignoradas não criam uma execução.
64
+ O sinal de cancelamento pode ser compartilhado entre comandos do mesmo bot;
65
+ não dependa de sua identidade para correlacionar execuções: use `executionID`.
66
+
67
+ `Store.readVariable` é opcional e deve retornar uma cópia isolada, respeitar a
68
+ ordenação das transações e avaliar o callback de relógio `now` dentro da leitura,
69
+ após aguardar operações anteriores. `undefined` indica
70
+ ausente/expirado; `null` continua sendo um valor JSON válido. Não há migração de
71
+ disco. SQLite conserva validação do estado completo antes de cada commit.
72
+
73
+ `yuzuha/music` é um import adicional. Configure `music`/`voice` explicitamente;
74
+ o bot encerra os serviços fornecidos e o chamador fecha os nodes Lavalink.
75
+ `@fluxerjs/voice` é um peer opcional carregado em `join`. Para áudio Lavalink no
76
+ Fluxer, configure `FluxerLavalinkBridge` e instale o plugin `yuzuha-audio` fornecido
77
+ pelo Yuzuha no servidor; veja [MUSIC.md](docs/MUSIC.md).
78
+ Não há wrappers de música no function mode nesta versão.
79
+
80
+ Benchmarks agora exigem a versão exata do Node e o mesmo modo de GC, suíte e
81
+ carga. Relatórios de outro runtime devem ser executados novamente antes de comparar.
82
+
83
+ ### Migrar para 0.1.5
84
+
85
+ Imports, argumentos posicionais e comandos existentes continuam disponíveis.
86
+ Flags são interpretadas somente em comandos que as declaram. Grupos de
87
+ subcomandos não declaram argumentos ou flags próprios; a folha define sua entrada.
88
+ Permissões, checks, middleware e demais restrições dos grupos continuam valendo
89
+ nos filhos. Veja o contrato em [NATIVE.md](docs/NATIVE.md).
90
+
91
+ O scaffold agora declara a versão npm do Yuzuha. Para desenvolver contra a
92
+ instalação que executa a CLI, use `init --local`. Projetos já gerados conservam
93
+ suas dependências; a atualização não reescreve projetos consumidores.
94
+ O schema de persistência permanece em 2 e o SDK em 3.3.0.
95
+
43
96
  ### Migrar para 0.1.4
44
97
 
45
98
  O schema persistido continua em 2. Cron, timezone, missedRun e retryJitter são
@@ -120,7 +173,7 @@ externos para idempotência. Veja [NATIVE.md](docs/NATIVE.md) e
120
173
 
121
174
  ### Procedimento
122
175
 
123
- 1. Atualize manifest e lockfile para a mesma versão.
176
+ 1. Atualize `package.json` e regenere `package-lock.json` para a mesma versão.
124
177
  2. Acrescente a entrada no [CHANGELOG.md](CHANGELOG.md), com data real e mudanças verificáveis.
125
178
  3. Atualize migração, cobertura e documentação quando o contrato mudar.
126
179
  4. Rode `npm run check` e `npm run smoke:package` e registre a evidência.
@@ -2,17 +2,23 @@ export function compareReports(current, baseline) {
2
2
  for (const field of ['platform', 'arch', 'cpu']) {
3
3
  if (current[field] !== baseline[field]) throw new Error(`Baseline incompatível: ${field}.`);
4
4
  }
5
- if (current.node.split('.')[0] !== baseline.node?.split('.')[0]) throw new Error('Baseline incompatível: versão principal do Node.');
5
+ if (current.node !== baseline.node) throw new Error('Baseline incompatível: versão exata do Node.');
6
+ if (current.suite !== baseline.suite) throw new Error('Baseline incompatível: suíte.');
7
+ if (baseline.gc !== undefined && current.gc !== baseline.gc) throw new Error('Baseline incompatível: GC explícito.');
6
8
  for (const field of ['iterations', 'samples', 'concurrency']) {
7
9
  if (current.config[field] !== baseline.config?.[field]) throw new Error(`Baseline incompatível: ${field}.`);
8
10
  }
9
- for (const field of ['catalogSize', 'payloadSize', 'soakRounds']) {
11
+ for (const field of ['catalogSize', 'payloadSize', 'soakRounds', 'stateKeys', 'queueSize', 'pageSize', 'fanout', 'warmup']) {
10
12
  if (baseline.config?.[field] !== undefined && current.config[field] !== baseline.config[field]) throw new Error(`Baseline incompatível: ${field}.`);
11
13
  }
12
14
  if (!Array.isArray(baseline.results)) throw new Error('Baseline sem resultados.');
13
15
  return current.results.map(row => {
14
16
  const previous = baseline.results.find(item => item.name === row.name);
15
17
  if (!previous) return { name: row.name, status: 'new' };
18
+ for (const field of ['iterations', 'unitsPerOperation']) {
19
+ if (previous[field] !== undefined && row[field] !== previous[field]) throw new Error(`Baseline incompatível: ${row.name}.${field}.`);
20
+ }
21
+ if (!(row.operationsPerSecond > 0) || !Number.isFinite(row.operationsPerSecond)) throw new Error(`Medição atual inválida: ${row.name}.`);
16
22
  if (!(previous.operationsPerSecond > 0) || !Number.isFinite(previous.operationsPerSecond)) throw new Error(`Baseline inválida: ${row.name}.`);
17
23
  const throughputChangePercent = (row.operationsPerSecond / previous.operationsPerSecond - 1) * 100;
18
24
  return { name: row.name, status: 'compared', throughputChangePercent,
@@ -0,0 +1,66 @@
1
+ import assert from 'node:assert/strict';
2
+ import { performance } from 'node:perf_hooks';
3
+ import { cpus, platform, arch } from 'node:os';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { createHash } from 'node:crypto';
6
+ import { resolve } from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+
9
+ const modules = { current: new URL('../dist/scripting/parser.js', import.meta.url) };
10
+ for (let index = 2; index < process.argv.length; index += 2) {
11
+ const key = { '--parser-module': 'current', '--baseline-module': 'baseline' }[process.argv[index]];
12
+ const value = process.argv[index + 1];
13
+ if (!key || !value || value.startsWith('--')) throw new Error('Uso: node benchmarks/parser.mjs [--parser-module caminho] [--baseline-module caminho]');
14
+ modules[key] = pathToFileURL(resolve(value));
15
+ }
16
+ const implementations = {};
17
+ for (const [label, url] of Object.entries(modules)) implementations[label] = {
18
+ parse: (await import(url)).parse,
19
+ sourceHash: createHash('sha256').update(await readFile(url)).digest('hex'),
20
+ };
21
+ const iterations = 20_000, warmup = 2000, samples = 9, differentialCases = 20_000;
22
+ const cases = {
23
+ plain: 'a'.repeat(8000),
24
+ interpolated: `prefix ${'abc '.repeat(100)}$name suffix ${'xyz '.repeat(100)}`,
25
+ short: '$reply[Olá $username!]',
26
+ dense: '$f[a;b;$g[c]]'.repeat(20),
27
+ };
28
+ const outcome = (parse, source) => {
29
+ try { return parse(source); }
30
+ catch (error) { return { code: error.code, offset: error.offset, message: error.message }; }
31
+ };
32
+ if (implementations.baseline) {
33
+ const alphabet = ['a', '$', '[', ']', ';', '\\', 'é', '\n', '1'];
34
+ for (let seed = 0; seed < differentialCases; seed++) {
35
+ let state = seed + 1, source = '';
36
+ for (let index = 0; index < 50; index++) {
37
+ state = (Math.imul(state, 1664525) + 1013904223) >>> 0;
38
+ source += alphabet[state % alphabet.length];
39
+ }
40
+ assert.deepEqual(outcome(implementations.current.parse, source), outcome(implementations.baseline.parse, source), source);
41
+ }
42
+ }
43
+ const results = [];
44
+ for (const [name, source] of Object.entries(cases)) {
45
+ if (implementations.baseline) assert.deepEqual(implementations.current.parse(source), implementations.baseline.parse(source));
46
+ const times = Object.fromEntries(Object.keys(implementations).map(label => [label, []]));
47
+ for (let sample = 0; sample < samples; sample++) {
48
+ const entries = Object.entries(implementations);
49
+ if (sample % 2) entries.reverse();
50
+ for (const [label, { parse }] of entries) {
51
+ for (let index = 0; index < warmup; index++) parse(source);
52
+ const start = performance.now();
53
+ for (let index = 0; index < iterations; index++) parse(source);
54
+ times[label].push(performance.now() - start);
55
+ }
56
+ }
57
+ for (const [implementation, samplesMs] of Object.entries(times)) {
58
+ const sorted = [...samplesMs].sort((a, b) => a - b);
59
+ results.push({ name, implementation, characters: source.length, iterations, medianMs: sorted[Math.floor(samples / 2)], samplesMs });
60
+ }
61
+ }
62
+ console.log(JSON.stringify({ suite: 'parser', date: new Date().toISOString(), node: process.versions.node,
63
+ platform: platform(), arch: arch(), cpu: cpus()[0]?.model, warmup, samples,
64
+ differentialCases: implementations.baseline ? differentialCases : 0,
65
+ modules: Object.fromEntries(Object.entries(implementations).map(([label, entry]) => [label, { path: modules[label].href, sourceHash: entry.sourceHash }])),
66
+ results }, null, 2));