allyhub 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/dist/commands/add.js +2 -2
  2. package/dist/commands/auth.js +4 -4
  3. package/dist/commands/cloud-tools.js +9 -10
  4. package/dist/commands/dev.js +1 -1
  5. package/dist/commands/doctor.js +4 -4
  6. package/dist/commands/frames/piece.js +1 -1
  7. package/dist/commands/frames.js +6 -6
  8. package/dist/commands/index.js +1 -1
  9. package/dist/commands/inspect/contrast.js +1 -1
  10. package/dist/commands/inspect/layout.js +1 -1
  11. package/dist/commands/orgs.js +2 -2
  12. package/dist/commands/render.js +2 -2
  13. package/dist/commands/sheet.js +2 -2
  14. package/dist/commands/slides.js +3 -0
  15. package/dist/main.js +3 -3
  16. package/dist/text/facts-text.js +5 -5
  17. package/dist/text/format.js +2 -2
  18. package/dist/works.js +1 -1
  19. package/editor-web/assets/browser-B31cR_c2.js +105 -0
  20. package/editor-web/assets/dist-6TNEuNMX.js +4 -0
  21. package/editor-web/assets/dist-Cm2TIjW5.js +2 -0
  22. package/editor-web/assets/dist-Cpt0p8bX.js +6 -0
  23. package/editor-web/assets/dist-D2GccKEJ.js +1 -0
  24. package/editor-web/assets/dist-Z0zvYXmu.js +233 -0
  25. package/editor-web/assets/dist-fs4ONrUV.js +32 -0
  26. package/editor-web/assets/index-CAcsAZ9u.js +70 -0
  27. package/editor-web/assets/index-DlcJckhO.css +2 -0
  28. package/editor-web/assets/list-D2v7U8K8.js +1 -0
  29. package/editor-web/assets/react-D0RmGe2w.js +101 -0
  30. package/editor-web/assets/rolldown-runtime-XKyaHtl9.js +1 -0
  31. package/editor-web/assets/text-align-start-B3k2cx5f.js +1 -0
  32. package/editor-web/assets/undo-2-Ecr7-Obc.js +1 -0
  33. package/editor-web/index.html +4 -4
  34. package/node_modules/@allyhub-next/audio/package.json +1 -1
  35. package/node_modules/@allyhub-next/browser/package.json +1 -1
  36. package/node_modules/@allyhub-next/build/dist/data.js +1 -1
  37. package/node_modules/@allyhub-next/build/dist/meta-worker.d.ts +10 -0
  38. package/node_modules/@allyhub-next/build/dist/meta-worker.js +2 -2
  39. package/node_modules/@allyhub-next/build/dist/model-info.js +2 -1
  40. package/node_modules/@allyhub-next/build/dist/plugin.d.ts +2 -0
  41. package/node_modules/@allyhub-next/build/dist/plugin.js +9 -8
  42. package/node_modules/@allyhub-next/build/dist/prepare.d.ts +13 -1
  43. package/node_modules/@allyhub-next/build/dist/prepare.js +2 -2
  44. package/node_modules/@allyhub-next/build/dist/scan.d.ts +1 -1
  45. package/node_modules/@allyhub-next/build/dist/scan.js +1 -1
  46. package/node_modules/@allyhub-next/build/dist/types.js +3 -3
  47. package/node_modules/@allyhub-next/build/package.json +1 -1
  48. package/node_modules/@allyhub-next/check/dist/check.js +3 -3
  49. package/node_modules/@allyhub-next/check/dist/generated.d.ts +1 -1
  50. package/node_modules/@allyhub-next/check/package.json +1 -1
  51. package/node_modules/@allyhub-next/cloud/dist/index.js +1 -1
  52. package/node_modules/@allyhub-next/cloud/dist/signin.js +2 -2
  53. package/node_modules/@allyhub-next/cloud/dist/token.js +1 -1
  54. package/node_modules/@allyhub-next/cloud/package.json +1 -1
  55. package/node_modules/@allyhub-next/components/package.json +1 -1
  56. package/node_modules/@allyhub-next/dev-server/dist/card.d.ts +2 -11
  57. package/node_modules/@allyhub-next/dev-server/dist/card.js +1 -1
  58. package/node_modules/@allyhub-next/dev-server/dist/exports.d.ts +2 -2
  59. package/node_modules/@allyhub-next/dev-server/dist/exports.js +1 -1
  60. package/node_modules/@allyhub-next/dev-server/dist/index.d.ts +1 -1
  61. package/node_modules/@allyhub-next/dev-server/dist/index.js +1 -1
  62. package/node_modules/@allyhub-next/dev-server/dist/live.d.ts +3 -0
  63. package/node_modules/@allyhub-next/dev-server/dist/live.js +1 -1
  64. package/node_modules/@allyhub-next/dev-server/dist/project.d.ts +3 -0
  65. package/node_modules/@allyhub-next/dev-server/dist/project.js +1 -1
  66. package/node_modules/@allyhub-next/dev-server/dist/reveal.d.ts +6 -0
  67. package/node_modules/@allyhub-next/dev-server/dist/reveal.js +2 -0
  68. package/node_modules/@allyhub-next/dev-server/dist/server.js +1 -1
  69. package/node_modules/@allyhub-next/dev-server/dist/stage.d.ts +2 -0
  70. package/node_modules/@allyhub-next/dev-server/dist/stage.js +22 -2
  71. package/node_modules/@allyhub-next/dev-server/dist/tools.d.ts +2 -0
  72. package/node_modules/@allyhub-next/dev-server/dist/tools.js +1 -1
  73. package/node_modules/@allyhub-next/dev-server/package.json +1 -1
  74. package/node_modules/@allyhub-next/doc/dist/docx.d.ts +28 -0
  75. package/node_modules/@allyhub-next/doc/dist/docx.js +4 -0
  76. package/node_modules/@allyhub-next/doc/dist/html.d.ts +3 -0
  77. package/node_modules/@allyhub-next/doc/dist/html.js +1 -1
  78. package/node_modules/@allyhub-next/doc/package.json +5 -1
  79. package/node_modules/@allyhub-next/export/dist/deck-fonts.d.ts +24 -0
  80. package/node_modules/@allyhub-next/export/dist/deck-fonts.js +2 -0
  81. package/node_modules/@allyhub-next/export/dist/deck-pptx.d.ts +12 -0
  82. package/node_modules/@allyhub-next/export/dist/deck-pptx.js +2 -0
  83. package/node_modules/@allyhub-next/export/dist/export.d.ts +12 -3
  84. package/node_modules/@allyhub-next/export/dist/export.js +2 -2
  85. package/node_modules/@allyhub-next/export/dist/index.d.ts +1 -0
  86. package/node_modules/@allyhub-next/export/dist/index.js +1 -1
  87. package/node_modules/@allyhub-next/export/dist/names.d.ts +11 -6
  88. package/node_modules/@allyhub-next/export/dist/names.js +1 -1
  89. package/node_modules/@allyhub-next/export/package.json +1 -1
  90. package/node_modules/@allyhub-next/formats/dist/data/script.d.ts +22 -0
  91. package/node_modules/@allyhub-next/formats/dist/data/script.js +1 -1
  92. package/node_modules/@allyhub-next/formats/dist/data/slides.d.ts +1494 -0
  93. package/node_modules/@allyhub-next/formats/dist/data/slides.js +2 -0
  94. package/node_modules/@allyhub-next/formats/dist/index.d.ts +2 -0
  95. package/node_modules/@allyhub-next/formats/dist/index.js +1 -1
  96. package/node_modules/@allyhub-next/formats/dist/items.d.ts +21 -0
  97. package/node_modules/@allyhub-next/formats/dist/items.js +1 -1
  98. package/node_modules/@allyhub-next/formats/dist/note-shape.d.ts +39 -0
  99. package/node_modules/@allyhub-next/formats/dist/note-shape.js +2 -0
  100. package/node_modules/@allyhub-next/formats/dist/schemas.d.ts +418 -0
  101. package/node_modules/@allyhub-next/formats/dist/schemas.js +1 -1
  102. package/node_modules/@allyhub-next/formats/package.json +1 -1
  103. package/node_modules/@allyhub-next/measure/dist/index.d.ts +1 -1
  104. package/node_modules/@allyhub-next/measure/dist/index.js +1 -1
  105. package/node_modules/@allyhub-next/measure/dist/overlay.d.ts +14 -1
  106. package/node_modules/@allyhub-next/measure/dist/overlay.js +1 -1
  107. package/node_modules/@allyhub-next/measure/package.json +1 -1
  108. package/node_modules/@allyhub-next/media/dist/asr/parakeet.d.ts +1 -4
  109. package/node_modules/@allyhub-next/media/dist/asr/parakeet.js +4 -4
  110. package/node_modules/@allyhub-next/media/dist/asr/transcribe.d.ts +1 -1
  111. package/node_modules/@allyhub-next/media/dist/asr/transcribe.js +1 -1
  112. package/node_modules/@allyhub-next/media/dist/grid.d.ts +3 -3
  113. package/node_modules/@allyhub-next/media/dist/grid.js +5 -5
  114. package/node_modules/@allyhub-next/media/dist/local.d.ts +3 -0
  115. package/node_modules/@allyhub-next/media/dist/local.js +1 -1
  116. package/node_modules/@allyhub-next/media/dist/ocr/tesseract.d.ts +8 -2
  117. package/node_modules/@allyhub-next/media/dist/ocr/tesseract.js +1 -1
  118. package/node_modules/@allyhub-next/media/dist/ocr/text.js +3 -3
  119. package/node_modules/@allyhub-next/media/dist/ocr/worker.js +1 -1
  120. package/node_modules/@allyhub-next/media/dist/sheet.js +3 -3
  121. package/node_modules/@allyhub-next/media/dist/tools.d.ts +11 -1
  122. package/node_modules/@allyhub-next/media/dist/tools.js +1 -1
  123. package/node_modules/@allyhub-next/media/dist/vision/faces.js +1 -1
  124. package/node_modules/@allyhub-next/media/dist/vision/matte.js +1 -1
  125. package/node_modules/@allyhub-next/media/dist/vision/runtime.d.ts +1 -1
  126. package/node_modules/@allyhub-next/media/dist/vision/runtime.js +2 -2
  127. package/node_modules/@allyhub-next/media/dist/worker-process.d.ts +1 -1
  128. package/node_modules/@allyhub-next/media/dist/worker-process.js +1 -1
  129. package/node_modules/@allyhub-next/media/package.json +1 -1
  130. package/node_modules/@allyhub-next/model/dist/build-job.d.ts +2 -0
  131. package/node_modules/@allyhub-next/model/dist/build-worker.js +1 -1
  132. package/node_modules/@allyhub-next/model/dist/build.d.ts +10 -0
  133. package/node_modules/@allyhub-next/model/dist/build.js +2 -1
  134. package/node_modules/@allyhub-next/model/package.json +1 -1
  135. package/node_modules/@allyhub-next/project/dist/digest.d.ts +1 -3
  136. package/node_modules/@allyhub-next/project/dist/digest.js +1 -1
  137. package/node_modules/@allyhub-next/project/dist/page.d.ts +0 -5
  138. package/node_modules/@allyhub-next/project/dist/page.js +2 -2
  139. package/node_modules/@allyhub-next/project/dist/session.js +1 -1
  140. package/node_modules/@allyhub-next/project/package.json +1 -1
  141. package/node_modules/@allyhub-next/protocol/dist/app.d.ts +0 -64
  142. package/node_modules/@allyhub-next/protocol/dist/app.js +1 -1
  143. package/node_modules/@allyhub-next/protocol/dist/auth.d.ts +0 -17
  144. package/node_modules/@allyhub-next/protocol/dist/auth.js +1 -1
  145. package/node_modules/@allyhub-next/protocol/dist/cli.d.ts +0 -4
  146. package/node_modules/@allyhub-next/protocol/dist/cli.js +1 -1
  147. package/node_modules/@allyhub-next/protocol/dist/editor.d.ts +9 -26
  148. package/node_modules/@allyhub-next/protocol/dist/editor.js +1 -1
  149. package/node_modules/@allyhub-next/protocol/dist/index.d.ts +1 -0
  150. package/node_modules/@allyhub-next/protocol/dist/index.js +1 -1
  151. package/node_modules/@allyhub-next/protocol/dist/notes.d.ts +163 -0
  152. package/node_modules/@allyhub-next/protocol/dist/notes.js +2 -0
  153. package/node_modules/@allyhub-next/protocol/dist/registry.d.ts +1 -1
  154. package/node_modules/@allyhub-next/protocol/dist/runtimes.d.ts +3 -0
  155. package/node_modules/@allyhub-next/protocol/dist/runtimes.js +1 -1
  156. package/node_modules/@allyhub-next/protocol/dist/tools.d.ts +37 -0
  157. package/node_modules/@allyhub-next/protocol/dist/tools.js +1 -1
  158. package/node_modules/@allyhub-next/protocol/package.json +1 -1
  159. package/node_modules/@allyhub-next/registry/dist/registry.js +1 -1
  160. package/node_modules/@allyhub-next/registry/package.json +1 -1
  161. package/node_modules/@allyhub-next/render/dist/doc/index.d.ts +1 -1
  162. package/node_modules/@allyhub-next/render/dist/doc/index.js +1 -1
  163. package/node_modules/@allyhub-next/render/dist/doc/print.d.ts +11 -0
  164. package/node_modules/@allyhub-next/render/dist/doc/print.js +17 -1
  165. package/node_modules/@allyhub-next/render/dist/exports.d.ts +29 -4
  166. package/node_modules/@allyhub-next/render/dist/exports.js +2 -2
  167. package/node_modules/@allyhub-next/render/dist/page.d.ts +11 -1
  168. package/node_modules/@allyhub-next/render/dist/render.d.ts +2 -0
  169. package/node_modules/@allyhub-next/render/dist/render.js +2 -2
  170. package/node_modules/@allyhub-next/render/package.json +1 -1
  171. package/node_modules/@allyhub-next/runtime/LICENSE +241 -0
  172. package/node_modules/@allyhub-next/runtime/dist/bridge.d.ts +13 -3
  173. package/node_modules/@allyhub-next/runtime/dist/clock.js +1 -1
  174. package/node_modules/@allyhub-next/runtime/dist/env.js +1 -1
  175. package/node_modules/@allyhub-next/runtime/dist/facade.js +1 -1
  176. package/node_modules/@allyhub-next/runtime/dist/footage.js +1 -1
  177. package/node_modules/@allyhub-next/runtime/dist/frame.js +1 -1
  178. package/node_modules/@allyhub-next/runtime/dist/index.d.ts +2 -0
  179. package/node_modules/@allyhub-next/runtime/dist/index.js +1 -1
  180. package/node_modules/@allyhub-next/runtime/dist/locate.d.ts +11 -0
  181. package/node_modules/@allyhub-next/runtime/dist/locate.js +2 -0
  182. package/node_modules/@allyhub-next/runtime/dist/measure.d.ts +2 -1
  183. package/node_modules/@allyhub-next/runtime/dist/measure.js +1 -1
  184. package/node_modules/@allyhub-next/runtime/dist/music.js +1 -1
  185. package/node_modules/@allyhub-next/runtime/dist/output.js +1 -1
  186. package/node_modules/@allyhub-next/runtime/dist/piece.d.ts +5 -9
  187. package/node_modules/@allyhub-next/runtime/dist/piece.js +2 -2
  188. package/node_modules/@allyhub-next/runtime/dist/player/player.js +1 -1
  189. package/node_modules/@allyhub-next/runtime/dist/reads.d.ts +2 -0
  190. package/node_modules/@allyhub-next/runtime/dist/reads.js +1 -1
  191. package/node_modules/@allyhub-next/runtime/dist/sound.js +1 -1
  192. package/node_modules/@allyhub-next/runtime/dist/stage-kit.d.ts +12 -0
  193. package/node_modules/@allyhub-next/runtime/dist/stage-kit.js +2 -0
  194. package/node_modules/@allyhub-next/runtime/package.json +5 -6
  195. package/node_modules/@allyhub-next/runtimes/dist/errors.d.ts +5 -1
  196. package/node_modules/@allyhub-next/runtimes/dist/index.d.ts +1 -0
  197. package/node_modules/@allyhub-next/runtimes/dist/index.js +1 -1
  198. package/node_modules/@allyhub-next/runtimes/dist/node-program.d.ts +3 -0
  199. package/node_modules/@allyhub-next/runtimes/dist/node-program.js +2 -0
  200. package/node_modules/@allyhub-next/runtimes/dist/packages.d.ts +65 -0
  201. package/node_modules/@allyhub-next/runtimes/dist/packages.js +4 -0
  202. package/node_modules/@allyhub-next/runtimes/dist/runtimes.js +2 -2
  203. package/node_modules/@allyhub-next/runtimes/dist/unpack.d.ts +7 -0
  204. package/node_modules/@allyhub-next/runtimes/dist/unpack.js +1 -1
  205. package/node_modules/@allyhub-next/runtimes/package.json +5 -1
  206. package/node_modules/@allyhub-next/runtimes/pins/docx/package-lock.json +67 -0
  207. package/node_modules/@allyhub-next/runtimes/pins/docx/package.json +9 -0
  208. package/node_modules/@allyhub-next/runtimes/pins/exceljs/package-lock.json +2533 -0
  209. package/node_modules/@allyhub-next/runtimes/pins/exceljs/package.json +8 -0
  210. package/node_modules/@allyhub-next/runtimes/pins/gltf-tools/package-lock.json +753 -0
  211. package/node_modules/@allyhub-next/runtimes/pins/gltf-tools/package.json +14 -0
  212. package/node_modules/@allyhub-next/runtimes/pins/manifold-3d/package-lock.json +950 -0
  213. package/node_modules/@allyhub-next/runtimes/pins/manifold-3d/package.json +8 -0
  214. package/node_modules/@allyhub-next/runtimes/pins/onnxruntime-node/package-lock.json +227 -0
  215. package/node_modules/@allyhub-next/runtimes/pins/onnxruntime-node/package.json +8 -0
  216. package/node_modules/@allyhub-next/runtimes/pins/sherpa-onnx-node/package-lock.json +105 -0
  217. package/node_modules/@allyhub-next/runtimes/pins/sherpa-onnx-node/package.json +8 -0
  218. package/node_modules/@allyhub-next/runtimes/pins/tesseract.js/package-lock.json +128 -0
  219. package/node_modules/@allyhub-next/runtimes/pins/tesseract.js/package.json +9 -0
  220. package/node_modules/@allyhub-next/runtimes/schemas/runtimes.schema.json +5 -24
  221. package/node_modules/@allyhub-next/scaffold/dist/index.js +3 -3
  222. package/node_modules/@allyhub-next/scaffold/package.json +1 -1
  223. package/node_modules/@allyhub-next/scenery/package.json +1 -1
  224. package/node_modules/@allyhub-next/scenery-host/dist/bundle.d.ts +2 -2
  225. package/node_modules/@allyhub-next/scenery-host/dist/bundle.js +3 -3
  226. package/node_modules/@allyhub-next/scenery-host/dist/viewer.d.ts +11 -0
  227. package/node_modules/@allyhub-next/scenery-host/dist/viewer.js +1 -1
  228. package/node_modules/@allyhub-next/scenery-host/package.json +1 -1
  229. package/node_modules/@allyhub-next/sheet/package.json +1 -1
  230. package/node_modules/@allyhub-next/site/dist/media.js +2 -2
  231. package/node_modules/@allyhub-next/site/package.json +1 -1
  232. package/node_modules/@allyhub-next/slides-core/LICENSE +241 -0
  233. package/node_modules/@allyhub-next/slides-core/dist/animation.d.ts +129 -0
  234. package/node_modules/@allyhub-next/slides-core/dist/animation.js +2 -0
  235. package/node_modules/@allyhub-next/slides-core/dist/api.d.ts +649 -0
  236. package/node_modules/@allyhub-next/slides-core/dist/api.js +4 -0
  237. package/node_modules/@allyhub-next/slides-core/dist/capabilities.d.ts +18 -0
  238. package/node_modules/@allyhub-next/slides-core/dist/capabilities.js +2 -0
  239. package/node_modules/@allyhub-next/slides-core/dist/chart-api.d.ts +165 -0
  240. package/node_modules/@allyhub-next/slides-core/dist/chart-api.js +2 -0
  241. package/node_modules/@allyhub-next/slides-core/dist/chart-file.d.ts +11 -0
  242. package/node_modules/@allyhub-next/slides-core/dist/chart-file.js +2 -0
  243. package/node_modules/@allyhub-next/slides-core/dist/chart.d.ts +184 -0
  244. package/node_modules/@allyhub-next/slides-core/dist/chart.js +2 -0
  245. package/node_modules/@allyhub-next/slides-core/dist/check.d.ts +7 -0
  246. package/node_modules/@allyhub-next/slides-core/dist/check.js +2 -0
  247. package/node_modules/@allyhub-next/slides-core/dist/enums.d.ts +146 -0
  248. package/node_modules/@allyhub-next/slides-core/dist/enums.js +2 -0
  249. package/node_modules/@allyhub-next/slides-core/dist/file.d.ts +109 -0
  250. package/node_modules/@allyhub-next/slides-core/dist/file.js +4 -0
  251. package/node_modules/@allyhub-next/slides-core/dist/index.d.ts +21 -0
  252. package/node_modules/@allyhub-next/slides-core/dist/index.js +2 -0
  253. package/node_modules/@allyhub-next/slides-core/dist/measure.d.ts +34 -0
  254. package/node_modules/@allyhub-next/slides-core/dist/measure.js +2 -0
  255. package/node_modules/@allyhub-next/slides-core/dist/model.d.ts +278 -0
  256. package/node_modules/@allyhub-next/slides-core/dist/model.js +2 -0
  257. package/node_modules/@allyhub-next/slides-core/dist/office.d.ts +58 -0
  258. package/node_modules/@allyhub-next/slides-core/dist/office.js +2 -0
  259. package/node_modules/@allyhub-next/slides-core/dist/path.d.ts +6 -0
  260. package/node_modules/@allyhub-next/slides-core/dist/path.js +2 -0
  261. package/node_modules/@allyhub-next/slides-core/dist/placeholders.d.ts +7 -0
  262. package/node_modules/@allyhub-next/slides-core/dist/placeholders.js +2 -0
  263. package/node_modules/@allyhub-next/slides-core/dist/resolve.d.ts +181 -0
  264. package/node_modules/@allyhub-next/slides-core/dist/resolve.js +2 -0
  265. package/node_modules/@allyhub-next/slides-core/dist/script.d.ts +43 -0
  266. package/node_modules/@allyhub-next/slides-core/dist/script.js +3 -0
  267. package/node_modules/@allyhub-next/slides-core/dist/stage.d.ts +63 -0
  268. package/node_modules/@allyhub-next/slides-core/dist/stage.js +2 -0
  269. package/node_modules/@allyhub-next/slides-core/dist/strict.d.ts +23 -0
  270. package/node_modules/@allyhub-next/slides-core/dist/strict.js +2 -0
  271. package/node_modules/@allyhub-next/slides-core/dist/theme.d.ts +72 -0
  272. package/node_modules/@allyhub-next/slides-core/dist/theme.js +2 -0
  273. package/node_modules/@allyhub-next/slides-core/dist/units.d.ts +35 -0
  274. package/node_modules/@allyhub-next/slides-core/dist/units.js +2 -0
  275. package/node_modules/@allyhub-next/slides-core/package.json +14 -0
  276. package/node_modules/@allyhub-next/slides-pptx/LICENSE +241 -0
  277. package/node_modules/@allyhub-next/slides-pptx/dist/charts.d.ts +6 -0
  278. package/node_modules/@allyhub-next/slides-pptx/dist/charts.js +2 -0
  279. package/node_modules/@allyhub-next/slides-pptx/dist/fonts.d.ts +45 -0
  280. package/node_modules/@allyhub-next/slides-pptx/dist/fonts.js +2 -0
  281. package/node_modules/@allyhub-next/slides-pptx/dist/import.d.ts +18 -0
  282. package/node_modules/@allyhub-next/slides-pptx/dist/import.js +3 -0
  283. package/node_modules/@allyhub-next/slides-pptx/dist/index.d.ts +5 -0
  284. package/node_modules/@allyhub-next/slides-pptx/dist/index.js +2 -0
  285. package/node_modules/@allyhub-next/slides-pptx/dist/read.d.ts +55 -0
  286. package/node_modules/@allyhub-next/slides-pptx/dist/read.js +4 -0
  287. package/node_modules/@allyhub-next/slides-pptx/dist/shapes.d.ts +67 -0
  288. package/node_modules/@allyhub-next/slides-pptx/dist/shapes.js +2 -0
  289. package/node_modules/@allyhub-next/slides-pptx/dist/text.d.ts +21 -0
  290. package/node_modules/@allyhub-next/slides-pptx/dist/text.js +2 -0
  291. package/node_modules/@allyhub-next/slides-pptx/dist/theme.d.ts +4 -0
  292. package/node_modules/@allyhub-next/slides-pptx/dist/theme.js +2 -0
  293. package/node_modules/@allyhub-next/slides-pptx/dist/timing.d.ts +32 -0
  294. package/node_modules/@allyhub-next/slides-pptx/dist/timing.js +2 -0
  295. package/node_modules/@allyhub-next/slides-pptx/dist/write.d.ts +32 -0
  296. package/node_modules/@allyhub-next/slides-pptx/dist/write.js +3 -0
  297. package/node_modules/@allyhub-next/slides-pptx/dist/xml.d.ts +26 -0
  298. package/node_modules/@allyhub-next/slides-pptx/dist/xml.js +3 -0
  299. package/node_modules/@allyhub-next/slides-pptx/package.json +14 -0
  300. package/node_modules/@allyhub-next/slides-runtime/LICENSE +241 -0
  301. package/node_modules/@allyhub-next/slides-runtime/dist/draw.d.ts +40 -0
  302. package/node_modules/@allyhub-next/slides-runtime/dist/draw.js +3 -0
  303. package/node_modules/@allyhub-next/slides-runtime/dist/edit.d.ts +4 -0
  304. package/node_modules/@allyhub-next/slides-runtime/dist/edit.js +2 -0
  305. package/node_modules/@allyhub-next/slides-runtime/dist/index.d.ts +4 -0
  306. package/node_modules/@allyhub-next/slides-runtime/dist/index.js +2 -0
  307. package/node_modules/@allyhub-next/slides-runtime/dist/ink.d.ts +10 -0
  308. package/node_modules/@allyhub-next/slides-runtime/dist/ink.js +2 -0
  309. package/node_modules/@allyhub-next/slides-runtime/dist/load.d.ts +6 -0
  310. package/node_modules/@allyhub-next/slides-runtime/dist/load.js +6 -0
  311. package/node_modules/@allyhub-next/slides-runtime/package.json +14 -0
  312. package/node_modules/@allyhub-next/stage/dist/graphics.js +1 -1
  313. package/node_modules/@allyhub-next/stage/dist/identity.js +1 -1
  314. package/node_modules/@allyhub-next/stage/dist/page.d.ts +9 -0
  315. package/node_modules/@allyhub-next/stage/dist/page.js +12 -2
  316. package/node_modules/@allyhub-next/stage/dist/server.js +1 -1
  317. package/node_modules/@allyhub-next/stage/package.json +1 -1
  318. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/400-italic.css +79 -0
  319. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/400.css +79 -0
  320. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/700-italic.css +79 -0
  321. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/700.css +79 -0
  322. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/LICENSE +93 -0
  323. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/arial.css +316 -0
  324. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-400-italic.woff2 +0 -0
  325. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-400-normal.woff2 +0 -0
  326. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-700-italic.woff2 +0 -0
  327. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-700-normal.woff2 +0 -0
  328. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-ext-400-italic.woff2 +0 -0
  329. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-ext-400-normal.woff2 +0 -0
  330. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-ext-700-italic.woff2 +0 -0
  331. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-cyrillic-ext-700-normal.woff2 +0 -0
  332. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-400-italic.woff2 +0 -0
  333. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-400-normal.woff2 +0 -0
  334. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-700-italic.woff2 +0 -0
  335. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-700-normal.woff2 +0 -0
  336. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-ext-400-italic.woff2 +0 -0
  337. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-ext-400-normal.woff2 +0 -0
  338. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-ext-700-italic.woff2 +0 -0
  339. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-greek-ext-700-normal.woff2 +0 -0
  340. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-hebrew-400-italic.woff2 +0 -0
  341. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-hebrew-400-normal.woff2 +0 -0
  342. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-hebrew-700-italic.woff2 +0 -0
  343. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-hebrew-700-normal.woff2 +0 -0
  344. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-400-italic.woff2 +0 -0
  345. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-400-normal.woff2 +0 -0
  346. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-700-italic.woff2 +0 -0
  347. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-700-normal.woff2 +0 -0
  348. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-ext-400-italic.woff2 +0 -0
  349. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-ext-400-normal.woff2 +0 -0
  350. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-ext-700-italic.woff2 +0 -0
  351. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-latin-ext-700-normal.woff2 +0 -0
  352. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-vietnamese-400-italic.woff2 +0 -0
  353. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-vietnamese-400-normal.woff2 +0 -0
  354. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-vietnamese-700-italic.woff2 +0 -0
  355. package/node_modules/@allyhub-next/stage-page/dist/fonts/arimo/files/arimo-vietnamese-700-normal.woff2 +0 -0
  356. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/400-italic.css +69 -0
  357. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/400.css +69 -0
  358. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/700-italic.css +69 -0
  359. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/700.css +69 -0
  360. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/LICENSE +93 -0
  361. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/calibri.css +276 -0
  362. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-400-italic.woff2 +0 -0
  363. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-400-normal.woff2 +0 -0
  364. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-700-italic.woff2 +0 -0
  365. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-700-normal.woff2 +0 -0
  366. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-ext-400-italic.woff2 +0 -0
  367. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-ext-400-normal.woff2 +0 -0
  368. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-ext-700-italic.woff2 +0 -0
  369. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-cyrillic-ext-700-normal.woff2 +0 -0
  370. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-400-italic.woff2 +0 -0
  371. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-400-normal.woff2 +0 -0
  372. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-700-italic.woff2 +0 -0
  373. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-700-normal.woff2 +0 -0
  374. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-ext-400-italic.woff2 +0 -0
  375. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-ext-400-normal.woff2 +0 -0
  376. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-ext-700-italic.woff2 +0 -0
  377. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-greek-ext-700-normal.woff2 +0 -0
  378. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-400-italic.woff2 +0 -0
  379. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-400-normal.woff2 +0 -0
  380. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-700-italic.woff2 +0 -0
  381. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-700-normal.woff2 +0 -0
  382. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-ext-400-italic.woff2 +0 -0
  383. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-ext-400-normal.woff2 +0 -0
  384. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-ext-700-italic.woff2 +0 -0
  385. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-latin-ext-700-normal.woff2 +0 -0
  386. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-vietnamese-400-italic.woff2 +0 -0
  387. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-vietnamese-400-normal.woff2 +0 -0
  388. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-vietnamese-700-italic.woff2 +0 -0
  389. package/node_modules/@allyhub-next/stage-page/dist/fonts/carlito/files/carlito-vietnamese-700-normal.woff2 +0 -0
  390. package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/400.css +1 -1
  391. package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/700.css +1 -1
  392. package/node_modules/@allyhub-next/stage-page/dist/fonts/noto-sans-sc/microsoft-yahei.css +2018 -0
  393. package/node_modules/@allyhub-next/stage-page/dist/host.js +21 -0
  394. package/node_modules/@allyhub-next/stage-page/dist/page.js +79 -0
  395. package/node_modules/@allyhub-next/stage-page/package.json +14 -0
  396. package/node_modules/@allyhub-next/video-core/dist/export.d.ts +6 -5
  397. package/node_modules/@allyhub-next/video-core/dist/export.js +1 -1
  398. package/node_modules/@allyhub-next/video-core/dist/fact.d.ts +173 -4
  399. package/node_modules/@allyhub-next/video-core/dist/fact.js +1 -1
  400. package/node_modules/@allyhub-next/video-core/dist/formats.d.ts +6 -13
  401. package/node_modules/@allyhub-next/video-core/dist/formats.js +1 -1
  402. package/node_modules/@allyhub-next/video-core/dist/index.d.ts +0 -1
  403. package/node_modules/@allyhub-next/video-core/dist/index.js +1 -1
  404. package/node_modules/@allyhub-next/video-core/dist/measure.d.ts +83 -0
  405. package/node_modules/@allyhub-next/video-core/dist/piece.d.ts +8 -9
  406. package/node_modules/@allyhub-next/video-core/dist/piece.js +1 -1
  407. package/node_modules/@allyhub-next/video-core/dist/problem.d.ts +5 -1
  408. package/node_modules/@allyhub-next/video-core/dist/problem.js +1 -1
  409. package/node_modules/@allyhub-next/video-core/dist/schema.d.ts +0 -2
  410. package/node_modules/@allyhub-next/video-core/dist/script-edit.d.ts +4 -0
  411. package/node_modules/@allyhub-next/video-core/dist/script.d.ts +8 -0
  412. package/node_modules/@allyhub-next/video-core/dist/script.js +1 -1
  413. package/node_modules/@allyhub-next/video-core/dist/timeline.d.ts +34 -1
  414. package/node_modules/@allyhub-next/video-core/package.json +1 -1
  415. package/package.json +48 -41
  416. package/dist/commands/mcp-app.js +0 -3
  417. package/dist/commands/mcp-docs.js +0 -2
  418. package/dist/commands/mcp.js +0 -2
  419. package/editor-app/view.html +0 -128
  420. package/editor-web/assets/chevron-left-W6sP7nB1.js +0 -1
  421. package/editor-web/assets/chevron-up-566GQpAm.js +0 -1
  422. package/editor-web/assets/dist-BKDr73BR.js +0 -136
  423. package/editor-web/assets/dist-CPCNTYVu.js +0 -8
  424. package/editor-web/assets/dist-C_NajYp0.js +0 -1
  425. package/editor-web/assets/dist-mA6NrAKh.js +0 -232
  426. package/editor-web/assets/floating-ui.react-dom-BUxFRF6t.js +0 -1
  427. package/editor-web/assets/index-CFZhjTQW.js +0 -56
  428. package/editor-web/assets/index-DgU-lyX6.css +0 -2
  429. package/editor-web/assets/react-Ff_buMj8.js +0 -61
  430. package/editor-web/assets/undo-2-BKFItM3X.js +0 -1
  431. package/node_modules/@allyhub-next/runtime/dist/host.js +0 -21
  432. package/node_modules/@allyhub-next/runtime/dist/page.js +0 -72
  433. package/node_modules/@allyhub-next/runtime/dist/paged.d.ts +0 -16
  434. package/node_modules/@allyhub-next/runtime/dist/paged.js +0 -2
  435. package/node_modules/@allyhub-next/video-core/dist/slides.d.ts +0 -37
  436. package/node_modules/@allyhub-next/video-core/dist/slides.js +0 -2
  437. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-color-emoji/LICENSE +0 -0
  438. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-color-emoji/emoji.css +0 -0
  439. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-color-emoji/files/noto-color-emoji-emoji-400-normal.woff2 +0 -0
  440. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/LICENSE +0 -0
  441. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-100-400-normal.woff2 +0 -0
  442. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-100-700-normal.woff2 +0 -0
  443. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-101-400-normal.woff2 +0 -0
  444. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-101-700-normal.woff2 +0 -0
  445. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-102-400-normal.woff2 +0 -0
  446. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-102-700-normal.woff2 +0 -0
  447. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-103-400-normal.woff2 +0 -0
  448. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-103-700-normal.woff2 +0 -0
  449. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-104-400-normal.woff2 +0 -0
  450. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-104-700-normal.woff2 +0 -0
  451. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-105-400-normal.woff2 +0 -0
  452. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-105-700-normal.woff2 +0 -0
  453. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-106-400-normal.woff2 +0 -0
  454. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-106-700-normal.woff2 +0 -0
  455. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-107-400-normal.woff2 +0 -0
  456. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-107-700-normal.woff2 +0 -0
  457. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-108-400-normal.woff2 +0 -0
  458. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-108-700-normal.woff2 +0 -0
  459. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-109-400-normal.woff2 +0 -0
  460. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-109-700-normal.woff2 +0 -0
  461. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-110-400-normal.woff2 +0 -0
  462. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-110-700-normal.woff2 +0 -0
  463. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-111-400-normal.woff2 +0 -0
  464. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-111-700-normal.woff2 +0 -0
  465. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-112-400-normal.woff2 +0 -0
  466. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-112-700-normal.woff2 +0 -0
  467. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-113-400-normal.woff2 +0 -0
  468. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-113-700-normal.woff2 +0 -0
  469. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-114-400-normal.woff2 +0 -0
  470. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-114-700-normal.woff2 +0 -0
  471. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-115-400-normal.woff2 +0 -0
  472. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-115-700-normal.woff2 +0 -0
  473. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-116-400-normal.woff2 +0 -0
  474. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-116-700-normal.woff2 +0 -0
  475. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-117-400-normal.woff2 +0 -0
  476. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-117-700-normal.woff2 +0 -0
  477. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-118-400-normal.woff2 +0 -0
  478. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-118-700-normal.woff2 +0 -0
  479. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-119-400-normal.woff2 +0 -0
  480. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-119-700-normal.woff2 +0 -0
  481. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-21-400-normal.woff2 +0 -0
  482. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-21-700-normal.woff2 +0 -0
  483. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-22-400-normal.woff2 +0 -0
  484. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-22-700-normal.woff2 +0 -0
  485. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-23-400-normal.woff2 +0 -0
  486. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-23-700-normal.woff2 +0 -0
  487. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-24-400-normal.woff2 +0 -0
  488. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-24-700-normal.woff2 +0 -0
  489. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-25-400-normal.woff2 +0 -0
  490. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-25-700-normal.woff2 +0 -0
  491. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-26-400-normal.woff2 +0 -0
  492. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-26-700-normal.woff2 +0 -0
  493. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-27-400-normal.woff2 +0 -0
  494. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-27-700-normal.woff2 +0 -0
  495. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-28-400-normal.woff2 +0 -0
  496. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-28-700-normal.woff2 +0 -0
  497. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-29-400-normal.woff2 +0 -0
  498. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-29-700-normal.woff2 +0 -0
  499. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-30-400-normal.woff2 +0 -0
  500. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-30-700-normal.woff2 +0 -0
  501. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-31-400-normal.woff2 +0 -0
  502. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-31-700-normal.woff2 +0 -0
  503. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-32-400-normal.woff2 +0 -0
  504. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-32-700-normal.woff2 +0 -0
  505. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-33-400-normal.woff2 +0 -0
  506. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-33-700-normal.woff2 +0 -0
  507. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-34-400-normal.woff2 +0 -0
  508. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-34-700-normal.woff2 +0 -0
  509. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-35-400-normal.woff2 +0 -0
  510. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-35-700-normal.woff2 +0 -0
  511. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-36-400-normal.woff2 +0 -0
  512. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-36-700-normal.woff2 +0 -0
  513. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-37-400-normal.woff2 +0 -0
  514. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-37-700-normal.woff2 +0 -0
  515. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-38-400-normal.woff2 +0 -0
  516. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-38-700-normal.woff2 +0 -0
  517. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-39-400-normal.woff2 +0 -0
  518. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-39-700-normal.woff2 +0 -0
  519. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-4-400-normal.woff2 +0 -0
  520. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-4-700-normal.woff2 +0 -0
  521. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-40-400-normal.woff2 +0 -0
  522. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-40-700-normal.woff2 +0 -0
  523. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-41-400-normal.woff2 +0 -0
  524. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-41-700-normal.woff2 +0 -0
  525. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-42-400-normal.woff2 +0 -0
  526. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-42-700-normal.woff2 +0 -0
  527. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-43-400-normal.woff2 +0 -0
  528. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-43-700-normal.woff2 +0 -0
  529. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-44-400-normal.woff2 +0 -0
  530. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-44-700-normal.woff2 +0 -0
  531. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-45-400-normal.woff2 +0 -0
  532. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-45-700-normal.woff2 +0 -0
  533. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-46-400-normal.woff2 +0 -0
  534. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-46-700-normal.woff2 +0 -0
  535. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-47-400-normal.woff2 +0 -0
  536. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-47-700-normal.woff2 +0 -0
  537. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-48-400-normal.woff2 +0 -0
  538. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-48-700-normal.woff2 +0 -0
  539. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-49-400-normal.woff2 +0 -0
  540. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-49-700-normal.woff2 +0 -0
  541. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-5-400-normal.woff2 +0 -0
  542. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-5-700-normal.woff2 +0 -0
  543. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-50-400-normal.woff2 +0 -0
  544. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-50-700-normal.woff2 +0 -0
  545. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-51-400-normal.woff2 +0 -0
  546. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-51-700-normal.woff2 +0 -0
  547. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-52-400-normal.woff2 +0 -0
  548. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-52-700-normal.woff2 +0 -0
  549. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-53-400-normal.woff2 +0 -0
  550. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-53-700-normal.woff2 +0 -0
  551. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-54-400-normal.woff2 +0 -0
  552. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-54-700-normal.woff2 +0 -0
  553. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-55-400-normal.woff2 +0 -0
  554. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-55-700-normal.woff2 +0 -0
  555. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-56-400-normal.woff2 +0 -0
  556. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-56-700-normal.woff2 +0 -0
  557. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-57-400-normal.woff2 +0 -0
  558. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-57-700-normal.woff2 +0 -0
  559. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-58-400-normal.woff2 +0 -0
  560. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-58-700-normal.woff2 +0 -0
  561. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-59-400-normal.woff2 +0 -0
  562. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-59-700-normal.woff2 +0 -0
  563. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-6-400-normal.woff2 +0 -0
  564. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-6-700-normal.woff2 +0 -0
  565. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-60-400-normal.woff2 +0 -0
  566. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-60-700-normal.woff2 +0 -0
  567. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-61-400-normal.woff2 +0 -0
  568. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-61-700-normal.woff2 +0 -0
  569. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-62-400-normal.woff2 +0 -0
  570. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-62-700-normal.woff2 +0 -0
  571. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-63-400-normal.woff2 +0 -0
  572. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-63-700-normal.woff2 +0 -0
  573. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-64-400-normal.woff2 +0 -0
  574. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-64-700-normal.woff2 +0 -0
  575. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-65-400-normal.woff2 +0 -0
  576. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-65-700-normal.woff2 +0 -0
  577. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-66-400-normal.woff2 +0 -0
  578. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-66-700-normal.woff2 +0 -0
  579. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-67-400-normal.woff2 +0 -0
  580. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-67-700-normal.woff2 +0 -0
  581. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-68-400-normal.woff2 +0 -0
  582. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-68-700-normal.woff2 +0 -0
  583. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-69-400-normal.woff2 +0 -0
  584. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-69-700-normal.woff2 +0 -0
  585. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-70-400-normal.woff2 +0 -0
  586. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-70-700-normal.woff2 +0 -0
  587. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-71-400-normal.woff2 +0 -0
  588. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-71-700-normal.woff2 +0 -0
  589. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-72-400-normal.woff2 +0 -0
  590. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-72-700-normal.woff2 +0 -0
  591. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-73-400-normal.woff2 +0 -0
  592. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-73-700-normal.woff2 +0 -0
  593. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-74-400-normal.woff2 +0 -0
  594. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-74-700-normal.woff2 +0 -0
  595. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-75-400-normal.woff2 +0 -0
  596. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-75-700-normal.woff2 +0 -0
  597. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-76-400-normal.woff2 +0 -0
  598. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-76-700-normal.woff2 +0 -0
  599. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-77-400-normal.woff2 +0 -0
  600. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-77-700-normal.woff2 +0 -0
  601. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-78-400-normal.woff2 +0 -0
  602. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-78-700-normal.woff2 +0 -0
  603. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-79-400-normal.woff2 +0 -0
  604. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-79-700-normal.woff2 +0 -0
  605. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-80-400-normal.woff2 +0 -0
  606. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-80-700-normal.woff2 +0 -0
  607. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-81-400-normal.woff2 +0 -0
  608. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-81-700-normal.woff2 +0 -0
  609. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-82-400-normal.woff2 +0 -0
  610. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-82-700-normal.woff2 +0 -0
  611. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-83-400-normal.woff2 +0 -0
  612. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-83-700-normal.woff2 +0 -0
  613. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-84-400-normal.woff2 +0 -0
  614. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-84-700-normal.woff2 +0 -0
  615. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-85-400-normal.woff2 +0 -0
  616. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-85-700-normal.woff2 +0 -0
  617. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-86-400-normal.woff2 +0 -0
  618. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-86-700-normal.woff2 +0 -0
  619. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-87-400-normal.woff2 +0 -0
  620. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-87-700-normal.woff2 +0 -0
  621. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-88-400-normal.woff2 +0 -0
  622. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-88-700-normal.woff2 +0 -0
  623. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-89-400-normal.woff2 +0 -0
  624. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-89-700-normal.woff2 +0 -0
  625. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-90-400-normal.woff2 +0 -0
  626. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-90-700-normal.woff2 +0 -0
  627. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-91-400-normal.woff2 +0 -0
  628. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-91-700-normal.woff2 +0 -0
  629. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-97-400-normal.woff2 +0 -0
  630. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-97-700-normal.woff2 +0 -0
  631. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-98-400-normal.woff2 +0 -0
  632. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-98-700-normal.woff2 +0 -0
  633. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-99-400-normal.woff2 +0 -0
  634. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-99-700-normal.woff2 +0 -0
  635. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-cyrillic-400-normal.woff2 +0 -0
  636. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-cyrillic-700-normal.woff2 +0 -0
  637. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-latin-400-normal.woff2 +0 -0
  638. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-latin-700-normal.woff2 +0 -0
  639. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-latin-ext-400-normal.woff2 +0 -0
  640. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-latin-ext-700-normal.woff2 +0 -0
  641. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-vietnamese-400-normal.woff2 +0 -0
  642. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/fonts/noto-sans-sc/files/noto-sans-sc-vietnamese-700-normal.woff2 +0 -0
  643. /package/node_modules/@allyhub-next/{runtime → stage-page}/dist/host.d.ts +0 -0
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));export{s as n,l as r,o as t};
@@ -0,0 +1 @@
1
+ import{Ot as e}from"./react-D0RmGe2w.js";var t=e(`image`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,ry:`2`,key:`1m3agn`}],[`circle`,{cx:`9`,cy:`9`,r:`2`,key:`af1f0g`}],[`path`,{d:`m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21`,key:`1xmnt7`}]]),n=e(`text-align-center`,[[`path`,{d:`M21 5H3`,key:`1fi0y6`}],[`path`,{d:`M17 12H7`,key:`16if0g`}],[`path`,{d:`M19 19H5`,key:`vjpgq2`}]]),r=e(`text-align-end`,[[`path`,{d:`M21 5H3`,key:`1fi0y6`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M21 19H7`,key:`4cu937`}]]),i=e(`text-align-justify`,[[`path`,{d:`M3 5h18`,key:`1u36vt`}],[`path`,{d:`M3 12h18`,key:`1i2n21`}],[`path`,{d:`M3 19h18`,key:`awlh7x`}]]),a=e(`text-align-start`,[[`path`,{d:`M21 5H3`,key:`1fi0y6`}],[`path`,{d:`M15 12H3`,key:`6jk70r`}],[`path`,{d:`M17 19H3`,key:`z6ezky`}]]);export{t as a,n as i,i as n,r,a as t};
@@ -0,0 +1 @@
1
+ import{Ot as e}from"./react-D0RmGe2w.js";var t=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),n=e(`trash-2`,[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]]),r=e(`undo-2`,[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]);export{n,t as r,r as t};
@@ -5,10 +5,10 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>AllyHub</title>
8
- <script type="module" crossorigin src="/assets/index-CFZhjTQW.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/react-Ff_buMj8.js">
10
- <link rel="modulepreload" crossorigin href="/assets/floating-ui.react-dom-BUxFRF6t.js">
11
- <link rel="stylesheet" crossorigin href="/assets/index-DgU-lyX6.css">
8
+ <script type="module" crossorigin src="/assets/index-CAcsAZ9u.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-XKyaHtl9.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/react-D0RmGe2w.js">
11
+ <link rel="stylesheet" crossorigin href="/assets/index-DlcJckhO.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/audio",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/browser",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,3 +1,3 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{createHash as p}from"node:crypto";import{readFile as l}from"node:fs/promises";import{join as d}from"node:path";import{parse as E}from"yaml";import{ITEM_KINDS as T,SHEET_SPEC as g,TEXT_DIR as u,baseOf as f,within as h}from"@allyhub-next/formats";import{csvRows as y}from"@allyhub-next/sheet";const j=/^-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/iu;export function parseCsv(t){const[r,...a]=y(t);if(!r)return[];const s=r.map(o=>o.trim()),e=s.map((o,n)=>a.every(i=>{const c=(i[n]??"").trim();return c===""||j.test(c)})&&a.some(i=>(i[n]??"").trim()!==""));return a.map(o=>{const n={};return s.forEach((i,c)=>{const m=(o[c]??"").trim();n[i]=e[c]&&m!==""?Number(m):m}),n})}const v=/\.(csv|ya?ml|json)$/iu,w=/(^|\/)(package(-lock)?\.json|tsconfig(\.[\w-]+)?\.json|jsconfig\.json|pnpm-(lock|workspace)\.yaml|[^/]+\.(words|elements|gen)\.json|script\.[\w-]+\.ya?ml|comments\.json)$/u,D=T.sheet.entries[0];export function isDataFile(t,r=u){return v.test(t)&&!w.test(t)&&f(t)!==g&&!h(t,r)}export const MAX_DATA_BYTES=5*1024*1024;export function parseData(t,r){return/\.csv$/iu.test(t)?parseCsv(r):/\.ya?ml$/iu.test(t)?E(r)??null:JSON.parse(r)}export async function readData(t,r,a=u){const s={};for(const e of r){if(!isDataFile(e,a)&&f(e)!==D)continue;const o=await l(d(t,e)).catch(()=>{});if(!o)continue;const n=p("sha256").update(o).digest("hex");if(o.byteLength>MAX_DATA_BYTES){s[e]={sha256:n,error:`larger than ${String(MAX_DATA_BYTES/1024/1024)} MB; import it instead`};continue}try{s[e]={sha256:n,value:parseData(e,o.toString("utf8"))}}catch(i){s[e]={sha256:n,error:i.message.split(`
2
+ import{createHash as p}from"node:crypto";import{readFile as l}from"node:fs/promises";import{join as d}from"node:path";import{parse as E}from"yaml";import{ITEM_KINDS as T,SHEET_SPEC as g,TEXT_DIR as u,baseOf as f,within as y}from"@allyhub-next/formats";import{csvRows as h}from"@allyhub-next/sheet";const j=/^-?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/iu;export function parseCsv(t){const[r,...a]=h(t);if(!r)return[];const s=r.map(o=>o.trim()),e=s.map((o,n)=>a.every(i=>{const c=(i[n]??"").trim();return c===""||j.test(c)})&&a.some(i=>(i[n]??"").trim()!==""));return a.map(o=>{const n={};return s.forEach((i,c)=>{const m=(o[c]??"").trim();n[i]=e[c]&&m!==""?Number(m):m}),n})}const v=/\.(csv|ya?ml|json)$/iu,w=/(^|\/)(package(-lock)?\.json|tsconfig(\.[\w-]+)?\.json|jsconfig\.json|pnpm-(lock|workspace)\.yaml|[^/]+\.(words|elements|gen)\.json|script\.[\w-]+\.ya?ml|slides\.yaml|comments\.json)$/u,D=T.sheet.entries[0];export function isDataFile(t,r=u){return v.test(t)&&!w.test(t)&&f(t)!==g&&!y(t,r)}export const MAX_DATA_BYTES=5*1024*1024;export function parseData(t,r){return/\.csv$/iu.test(t)?parseCsv(r):/\.ya?ml$/iu.test(t)?E(r)??null:JSON.parse(r)}export async function readData(t,r,a=u){const s={};for(const e of r){if(!isDataFile(e,a)&&f(e)!==D)continue;const o=await l(d(t,e)).catch(()=>{});if(!o)continue;const n=p("sha256").update(o).digest("hex");if(o.byteLength>MAX_DATA_BYTES){s[e]={sha256:n,error:`larger than ${String(MAX_DATA_BYTES/1024/1024)} MB; import it instead`};continue}try{s[e]={sha256:n,value:parseData(e,o.toString("utf8"))}}catch(i){s[e]={sha256:n,error:i.message.split(`
3
3
  `)[0]??""}}}return s}
@@ -1,3 +1,4 @@
1
+ import { type SlidesFile } from "@allyhub-next/formats";
1
2
  import { type MediaInfo, type Problem } from "@allyhub-next/video-core";
2
3
  export interface WorkerInit {
3
4
  root: string;
@@ -12,6 +13,15 @@ export type WorkerRequest = {
12
13
  id: number;
13
14
  type: "piece";
14
15
  file: string;
16
+ } | {
17
+ id: number;
18
+ type: "deck";
19
+ file: string;
20
+ /** Its slides.yaml as read; none when it has none or it is not the format. */
21
+ slides: SlidesFile | undefined;
22
+ /** The default language's messages, by key: the script's words. */
23
+ words: Record<string, unknown>;
24
+ prefix: string;
15
25
  } | {
16
26
  id: number;
17
27
  type: "components";
@@ -1,3 +1,3 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import g from"node:net";import{join as k}from"node:path";import{format as R}from"node:util";import{parentPort as j,workerData as N}from"node:worker_threads";import{posix as l}from"node:path";import{projectPath as v}from"@allyhub-next/formats";import{MEDIA_BRAND as y,isPieceDefinition as C,outputName as K,outputOf as F,problem as $}from"@allyhub-next/video-core";import{allyhubPlugin as H}from"./plugin.js";import{SDK as _}from"./scan.js";import{createModuleLoader as B,loadUserVite as I}from"./vite.js";const d=N,m=[];let M=!1;for(const t of["log","info","warn","error","debug"])console[t]=(...n)=>{M||process.stderr.write(`${R(...n)}
3
- `)};const D=Date.UTC(2026,0,1),A=Date,U=Math.random,V=globalThis.fetch,W=Reflect.get(g.Socket.prototype,"connect");function z(t){let n=t>>>0;return()=>{n=n+1831565813|0;let e=Math.imul(n^n>>>15,1|n);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}function L(t){let n=2166136261;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,16777619);return n>>>0}async function x(t,n,e,o=`reading the metadata of ${n}`,r=!0){const i=globalThis;class a extends A{constructor(...u){u.length===0?super(D):super(...u)}static now(){return D}}const s=f=>{m.push($("AK-B003",`A network request was made while ${o}: ${f}. The build has no network: put the data in the project and import it.`,{where:{file:n}}))};i.Date=a,Math.random=z(L(t)),i.fetch=f=>(s(typeof f=="string"?f:f.url??"a request"),Promise.reject(new TypeError("network blocked by AllyHub"))),Reflect.set(g.Socket.prototype,"connect",function(...f){const[u]=f;return s(typeof u=="object"&&u!==null?`${u.host??""}:${String(u.port??"")}`:String(u)),this.destroy(new Error("network blocked by AllyHub")),this}),M=r;try{return await e()}finally{M=!1,i.Date=A,Math.random=U,i.fetch=V,Reflect.set(g.Socket.prototype,"connect",W)}}function c(t,n,e){if(typeof t=="function"){e.push(n);return}if(t===null||typeof t!="object")return typeof t=="bigint"||typeof t=="symbol"?String(t):t;if(y in t)return t.path;if(Array.isArray(t))return t.map((r,i)=>c(r,`${n}[${String(i)}]`,e));const o={};for(const[r,i]of Object.entries(t)){const a=c(i,n?`${n}.${r}`:r,e);a!==void 0&&(o[r]=a)}return o}function O(t,n){const e=l.normalize(n.startsWith("/")?n.slice(1):l.join(t,n));return e.startsWith("..")?void 0:v(e)}function S(t,n){return typeof t=="string"?O(n,t)??t:typeof t=="object"&&t!==null&&y in t?t.path:t}const w=(t,n)=>t===""?n:`${t}.${n}`;function G(t,n,e,o,r={}){const i={};for(const[a,s]of Object.entries(t)){if(a==="covers"){typeof s=="function"?i.covers=!0:s!==void 0&&(i.covers=c(s,w(o,"covers"),e));continue}if(a==="post"&&typeof s=="object"&&s!==null){const u=c(s,w(o,"post"),e),h=s.lut;i.post={...u,...typeof h=="string"?{lut:O(r.post??l.dirname(n),h)??h}:{}};continue}if(a==="music"&&s!==void 0){const u=typeof s=="string"||typeof s=="object"&&s!==null&&y in s?{file:s}:s,h=c({...u,file:void 0},w(o,"music"),e),p=u.file;i.music={...h,...p===void 0?{}:typeof p=="object"&&p!==null&&!(y in p)?{file:Object.fromEntries(Object.entries(p).map(([T,P])=>[T,S(P,r.music??l.dirname(n))]))}:{file:S(p,r.music??l.dirname(n))}};continue}const f=c(s,w(o,a),e);f!==void 0&&(i[a]=f)}return i}process.env.NODE_ENV="production";const b=(async()=>{const t=d.user?await I(d.root):void 0;return B(d.root,[H({root:d.root,media:d.media,dependencies:new Set(d.dependencies),...d.lent?{lent:d.lent}:{}})],{mode:"production",inline:[_,...Object.keys(d.lent??{})],...t?{user:t}:{}})})();function E(t,n,e){const o=t.written?.file;return t.written?.paths?.[n]?.[1]??l.dirname(o!==void 0&&o!==""?o:e)}async function J(t){const e=(await x(t,t,async()=>(await b).import(k(d.root,t)))).default;if(!C(e))throw new Error("The default export is not a piece: an item's video.ts exports video({ … }), its slides.ts slides({ … })");const o=[],r=F(e),i={[K(r.kind)]:{kind:r.kind,options:r.kind==="video"?G(r.options,t,o,"",{music:E(e,"music",t),post:E(e,"post",t)}):c(r.options,"",o)}},a={written:e.written?.file??t,...e.id===void 0?{}:{id:c(e.id,"id",o)},...e.title===void 0?{}:{title:c(e.title,"title",o)},...e.format===void 0?{}:{format:c(e.format,"format",o)},...e.matrix===void 0?{}:{matrix:c(e.matrix,"matrix",o)},...e.meta===void 0?{}:{meta:c(e.meta,"meta",o)},outputs:i};return o.length>0&&m.push($("AK-M001",`These places of the piece in ${t} are functions and cannot be read as metadata: ${o.join(", ")}. Make them plain data (text, numbers, lists, objects).`,{where:{file:t}})),a}async function Q(t){const n=await x(t,t,async()=>(await b).import(k(d.root,t))),e=[];for(const o of Object.values(n)){if(typeof o!="function")continue;const r=o.info;if(r===void 0||typeof o.componentName!="string")continue;const i=[],a=c(r,"",i);i.length>0&&m.push($("AK-M001",`These places in the component declaration in ${t} are functions and cannot be read as metadata: ${i.join(", ")}. The types and examples of props must be plain data.`,{where:{file:t}})),e.push({...a,file:t})}return e}async function X(t){const n=await x(t,t,async()=>(await b).import(k(d.root,t)),void 0,!1);return c(n.default,"",[])}j?.on("message",t=>{(async()=>{m.length=0;try{await b;const n=t.type==="piece"?await J(t.file):t.type==="components"?await Q(t.file):await X(t.file),e={id:t.id,ok:!0,value:n,problems:[...m]};j?.postMessage(e)}catch(n){const e={id:t.id,ok:!1,error:n instanceof Error?n.message:String(n),...n instanceof Error&&n.stack?{stack:n.stack}:{},problems:[...m]};j?.postMessage(e)}})()});
2
+ import{readFileSync as N}from"node:fs";import j from"node:net";import{join as y}from"node:path";import{format as P}from"node:util";import{parentPort as $,workerData as R}from"node:worker_threads";import{posix as m}from"node:path";import{projectPath as C}from"@allyhub-next/formats";import{evaluateDeck as _,isDeck as F,joinPath as K,resolveDeck as H}from"@allyhub-next/slides-core";import{MEDIA_BRAND as g,isPieceDefinition as W,outputName as z,outputOf as B,problem as x}from"@allyhub-next/video-core";import{parseCsv as I,parseData as J}from"./data.js";import{allyhubPlugin as U}from"./plugin.js";import{SDK as V}from"./scan.js";import{createModuleLoader as L,loadUserVite as G}from"./vite.js";const d=R,h=[];let O=!1;for(const t of["log","info","warn","error","debug"])console[t]=(...e)=>{O||process.stderr.write(`${P(...e)}
3
+ `)};const M=Date.UTC(2026,0,1),D=Date,Q=Math.random,X=globalThis.fetch,Y=Reflect.get(j.Socket.prototype,"connect");function Z(t){let e=t>>>0;return()=>{e=e+1831565813|0;let o=Math.imul(e^e>>>15,1|e);return o=o+Math.imul(o^o>>>7,61|o)^o,((o^o>>>14)>>>0)/4294967296}}function q(t){let e=2166136261;for(let o=0;o<t.length;o++)e^=t.charCodeAt(o),e=Math.imul(e,16777619);return e>>>0}async function b(t,e,o,n=`reading the metadata of ${e}`,i=!0){const s=globalThis;class c extends D{constructor(...a){a.length===0?super(M):super(...a)}static now(){return M}}const r=u=>{h.push(x("AK-B003",`A network request was made while ${n}: ${u}. The build has no network: put the data in the project and import it.`,{where:{file:e}}))};s.Date=c,Math.random=Z(q(t)),s.fetch=u=>(r(typeof u=="string"?u:u.url??"a request"),Promise.reject(new TypeError("network blocked by AllyHub"))),Reflect.set(j.Socket.prototype,"connect",function(...u){const[a]=u;return r(typeof a=="object"&&a!==null?`${a.host??""}:${String(a.port??"")}`:String(a)),this.destroy(new Error("network blocked by AllyHub")),this}),O=i;try{return await o()}finally{O=!1,s.Date=D,Math.random=Q,s.fetch=X,Reflect.set(j.Socket.prototype,"connect",Y)}}function f(t,e,o){if(typeof t=="function"){o.push(e);return}if(t===null||typeof t!="object")return typeof t=="bigint"||typeof t=="symbol"?String(t):t;if(g in t)return t.path;if(Array.isArray(t))return t.map((i,s)=>f(i,`${e}[${String(s)}]`,o));const n={};for(const[i,s]of Object.entries(t)){const c=f(s,e?`${e}.${i}`:i,o);c!==void 0&&(n[i]=c)}return n}function S(t,e){const o=m.normalize(e.startsWith("/")?e.slice(1):m.join(t,e));return o.startsWith("..")?void 0:C(o)}function v(t,e){return typeof t=="string"?S(e,t)??t:typeof t=="object"&&t!==null&&g in t?t.path:t}const k=(t,e)=>t===""?e:`${t}.${e}`;function tt(t,e,o,n,i={}){const s={};for(const[c,r]of Object.entries(t)){if(c==="covers"){typeof r=="function"?s.covers=!0:r!==void 0&&(s.covers=f(r,k(n,"covers"),o));continue}if(c==="post"&&typeof r=="object"&&r!==null){const a=f(r,k(n,"post"),o),p=r.lut;s.post={...a,...typeof p=="string"?{lut:S(i.post??m.dirname(e),p)??p}:{}};continue}if(c==="music"&&r!==void 0){const a=typeof r=="string"||typeof r=="object"&&r!==null&&g in r?{file:r}:r,p=f({...a,file:void 0},k(n,"music"),o),l=a.file;s.music={...p,...l===void 0?{}:typeof l=="object"&&l!==null&&!(g in l)?{file:Object.fromEntries(Object.entries(l).map(([A,T])=>[A,v(T,i.music??m.dirname(e))]))}:{file:v(l,i.music??m.dirname(e))}};continue}const u=f(r,k(n,c),o);u!==void 0&&(s[c]=u)}return s}process.env.NODE_ENV="production";const w=(async()=>{const t=d.user?await G(d.root):void 0;return L(d.root,[U({root:d.root,media:d.media,dependencies:new Set(d.dependencies),...d.lent?{lent:d.lent}:{}})],{mode:"production",inline:[V,...Object.keys(d.lent??{})],...t?{user:t}:{}})})();function E(t,e,o){const n=t.written?.file;return t.written?.paths?.[e]?.[1]??m.dirname(n!==void 0&&n!==""?n:o)}async function et(t){const o=(await b(t,t,async()=>(await w).import(y(d.root,t)))).default;if(!W(o))throw new Error("The default export is not a video: an item's video.ts exports video({ … })");const n=[],i=B(o),s={[z(i.kind)]:{kind:i.kind,options:tt(i.options,t,n,"",{music:E(o,"music",t),post:E(o,"post",t)})}},c={written:o.written?.file??t,...o.id===void 0?{}:{id:f(o.id,"id",n)},...o.title===void 0?{}:{title:f(o.title,"title",n)},...o.format===void 0?{}:{format:f(o.format,"format",n)},...o.matrix===void 0?{}:{matrix:f(o.matrix,"matrix",n)},...o.meta===void 0?{}:{meta:f(o.meta,"meta",n)},outputs:s};return n.length>0&&h.push(x("AK-M001",`These places of the piece in ${t} are functions and cannot be read as metadata: ${n.join(", ")}. Make them plain data (text, numbers, lists, objects).`,{where:{file:t}})),c}async function ot(t){const e=await b(t,t,async()=>(await w).import(y(d.root,t))),o=[];for(const n of Object.values(e)){if(typeof n!="function")continue;const i=n.info;if(i===void 0||typeof n.componentName!="string")continue;const s=[],c=f(i,"",s);s.length>0&&h.push(x("AK-M001",`These places in the component declaration in ${t} are functions and cannot be read as metadata: ${s.join(", ")}. The types and examples of props must be plain data.`,{where:{file:t}})),o.push({...c,file:t})}return o}async function nt(t){const e=await b(t,t,async()=>(await w).import(y(d.root,t)),void 0,!1);return f(e.default,"",[])}function rt(t){const e=Object.keys(t),o=n=>{const i=t[n];if(typeof i=="string")return i;if(typeof i=="object"&&i!==null&&"display"in i)return String(i.display);const s=`${n}.`,c=[...new Set(e.filter(r=>r.startsWith(s)).map(r=>r.slice(s.length).split(".")[0]).filter(r=>r!==void 0&&/^\d+$/u.test(r)))].sort((r,u)=>Number(r)-Number(u));if(c.length!==0)return c.map(r=>o(`${n}.${r}`)).filter(r=>r!==void 0)};return o}async function it(t){const{file:e}=t,n=(await b(e,e,async()=>(await w).import(y(d.root,e)))).default;if(!F(n))throw new Error("The default export is not a deck: an item's slides.ts exports presentation((prs) => { … }) from @allyhub/sdk/slides");const i=await b(e,e,()=>Promise.resolve(_(n))),s=m.dirname(e),c=a=>{const p=K(s,a),l=N(y(d.root,p),"utf8");return/\.csv$/iu.test(p)?I(l):J(p,l)},{deck:r,problems:u}=H({def:i,file:t.slides??{slides:[]},words:rt(t.words),prefix:t.prefix,base:s,data:c});return{...n.options.title===void 0?{}:{title:n.options.title},size:[i.slide_width,i.slide_height],layouts:i.masters.flatMap(a=>a.layouts.map(p=>p.name)),components:Object.fromEntries(Object.entries(i.components).map(([a,p])=>[a,f(p.props,a,[])])),generators:Object.keys(i.generators),resolved:JSON.parse(JSON.stringify(r)),problems:u}}$?.on("message",t=>{(async()=>{h.length=0;try{await w;const e=t.type==="piece"?await et(t.file):t.type==="deck"?await it(t):t.type==="components"?await ot(t.file):await nt(t.file),o={id:t.id,ok:!0,value:e,problems:[...h]};$?.postMessage(o)}catch(e){const o={id:t.id,ok:!1,error:e instanceof Error?e.message:String(e),...e instanceof Error&&e.stack?{stack:e.stack}:{},problems:[...h]};$?.postMessage(o)}})()});
@@ -1,3 +1,4 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{readFile as S,stat as v}from"node:fs/promises";import{join as f,posix as p}from"node:path";const M=new Set(["KHR_draco_mesh_compression","EXT_meshopt_compression","KHR_meshopt_compression","KHR_texture_basisu","KHR_mesh_quantization","KHR_texture_transform","KHR_materials_unlit","KHR_materials_emissive_strength","KHR_materials_clearcoat","KHR_materials_transmission","KHR_materials_volume","KHR_materials_ior","KHR_materials_specular","KHR_materials_sheen","KHR_materials_iridescence","KHR_materials_anisotropy","KHR_materials_dispersion","KHR_lights_punctual","EXT_mesh_gpu_instancing","EXT_texture_webp","EXT_texture_avif"]),U=20;function N(n,t){if(!t)return JSON.parse(n.toString("utf8"));if(n.readUInt32LE(0)!==1179937895)throw new Error("not a GLB (no glTF magic)");const a=n.readUInt32LE(12);if(n.readUInt32LE(16)!==1313821514)throw new Error("its first chunk is not JSON");return JSON.parse(n.subarray(20,20+a).toString("utf8"))}function I(n,t){const a=p.dirname(n);return[...t.buffers??[],...t.images??[]].map(s=>s.uri).filter(s=>typeof s=="string"&&!s.startsWith("data:")).map(s=>p.normalize(p.join(a,decodeURIComponent(s))))}export async function missingFiles(n,t){try{const a=await S(f(n,t)),m=N(a,/\.glb$/i.test(t)),s=[];for(const c of I(t,m))await v(f(n,c)).then(i=>i.isFile()).catch(()=>!1)||s.push(c);return s}catch{return[]}}function $(n){const t=n.nodes??[],a=[],m=new Set,s=(i,r)=>{if(m.has(i))return;m.add(i);const l=t[i];if(!l)return;const u=l.name!==void 0&&l.name!==""?l.name:`Node[${String(i)}]`,g=r===""?u:`${r}/${u}`;l.name&&a.push({name:l.name,path:g});for(const x of l.children??[])s(x,g)},c=n.scenes?.[n.scene??0];for(const i of c?.nodes??[])s(i,"");return a}async function A(n,t,a){try{const{validateBytes:m}=await import("gltf-validator"),c=(await m(new Uint8Array(a),{uri:p.basename(t),maxIssues:200,externalResourceFunction:async i=>new Uint8Array(await S(f(n,p.dirname(t),decodeURIComponent(i))))})).issues;return{errors:c.numErrors,warnings:c.numWarnings,infos:c.numInfos,hints:c.numHints,messages:c.messages.slice(0,U).map(i=>({code:i.code,severity:i.severity,message:i.message,...i.pointer?{pointer:i.pointer}:{}}))}}catch{return}}const d=n=>Math.round(n*1e6)/1e6;export async function modelInfo(n,t,a){const m=/\.glb$/i.test(t);let s;try{s=N(a,m)}catch(u){return{container:m?"glb":"gltf",extensionsUsed:[],extensionsRequired:[],unsupported:[],missing:[],nodes:[],skins:0,morphTargets:0,cameras:0,lights:0,contentsMissing:`its description could not be read: ${u.message}`}}const c=s.extensionsRequired??[],i=s.extensions?.KHR_lights_punctual?.lights?.length??0,r={container:m?"glb":"gltf",...s.asset?.generator?{generator:s.asset.generator}:{},...s.asset?.copyright?{copyright:s.asset.copyright}:{},...(s.extensionsUsed??[]).includes("KHR_xmp_json_ld")?{rights:!0}:{},extensionsUsed:s.extensionsUsed??[],extensionsRequired:c,unsupported:c.filter(u=>!M.has(u)),missing:await missingFiles(n,t),nodes:$(s),skins:s.skins?.length??0,morphTargets:(s.meshes??[]).filter(u=>(u.primitives??[]).some(g=>(g.targets?.length??0)>0)).length,cameras:s.cameras?.length??0,lights:i},l=await A(n,t,a);if(l&&(r.validator=l),r.missing.length>0)return r.contentsMissing=`it names files that are not there (${r.missing.join(", ")})`,r;try{const[{NodeIO:u},{ALL_EXTENSIONS:g},{inspect:x},T,{MeshoptDecoder:y}]=await Promise.all([import("@gltf-transform/core"),import("@gltf-transform/extensions"),import("@gltf-transform/functions"),import("draco3dgltf"),import("meshoptimizer")]),b=new Set(g.map(e=>e.EXTENSION_NAME)),E=c.filter(e=>!b.has(e));if(E.length>0)return r.contentsMissing=`glTF-Transform does not read ${E.join(", ")}`,r;await y.ready;const H=new u().registerExtensions(g).registerDependencies({"draco3d.decoder":await T.createDecoderModule(),"meshopt.decoder":y}),w=m?await H.readBinary(new Uint8Array(a)):await H.read(f(n,t)),h=x(w),R=h.scenes.properties[0];if(R){const e=R.bboxMin,o=R.bboxMax,K=[d(o[0]-e[0]),d(o[1]-e[1]),d(o[2]-e[2])];r.bounds={min:[d(e[0]),d(e[1]),d(e[2])],max:[d(o[0]),d(o[1]),d(o[2])],size:K,largest:Math.max(...K)}}const _=h.meshes.properties;r.counts={nodes:w.getRoot().listNodes().length,meshes:_.length,primitives:_.reduce((e,o)=>e+o.meshPrimitives,0),triangles:_.reduce((e,o)=>e+o.glPrimitives*Math.max(1,o.instances),0),instances:_.reduce((e,o)=>e+o.instances,0)},r.materials=w.getRoot().listMaterials().map(e=>({name:e.getName(),extensions:e.listExtensions().map(o=>o.extensionName)})),r.textures=h.textures.properties.map(e=>({name:e.name,mimeType:e.mimeType,...e.resolution?{width:Number(e.resolution.split("x")[0]),height:Number(e.resolution.split("x")[1])}:{},bytes:e.size,...e.gpuSize!==null?{gpuBytes:e.gpuSize}:{}})),r.animations=h.animations.properties.map(e=>({name:e.name,duration:d(e.duration),channels:e.channels}))}catch(u){r.contentsMissing=`glTF-Transform could not read it: ${u.message.split(`
2
+ import{readFile as T,stat as M}from"node:fs/promises";import{join as x,posix as f}from"node:path";import{createPackages as U}from"@allyhub-next/runtimes";const I=new Set(["KHR_draco_mesh_compression","EXT_meshopt_compression","KHR_meshopt_compression","KHR_texture_basisu","KHR_mesh_quantization","KHR_texture_transform","KHR_materials_unlit","KHR_materials_emissive_strength","KHR_materials_clearcoat","KHR_materials_transmission","KHR_materials_volume","KHR_materials_ior","KHR_materials_specular","KHR_materials_sheen","KHR_materials_iridescence","KHR_materials_anisotropy","KHR_materials_dispersion","KHR_lights_punctual","EXT_mesh_gpu_instancing","EXT_texture_webp","EXT_texture_avif"]),F=20,p=t=>U().load("gltf-tools",{module:t,onFetch:()=>{process.stderr.write(`Getting the glTF tools, once, to read 3D models…
3
+ `)}});function N(t,n){if(!n)return JSON.parse(t.toString("utf8"));if(t.readUInt32LE(0)!==1179937895)throw new Error("not a GLB (no glTF magic)");const a=t.readUInt32LE(12);if(t.readUInt32LE(16)!==1313821514)throw new Error("its first chunk is not JSON");return JSON.parse(t.subarray(20,20+a).toString("utf8"))}function $(t,n){const a=f.dirname(t);return[...n.buffers??[],...n.images??[]].map(s=>s.uri).filter(s=>typeof s=="string"&&!s.startsWith("data:")).map(s=>f.normalize(f.join(a,decodeURIComponent(s))))}export async function missingFiles(t,n){try{const a=await T(x(t,n)),m=N(a,/\.glb$/i.test(n)),s=[];for(const c of $(n,m))await M(x(t,c)).then(i=>i.isFile()).catch(()=>!1)||s.push(c);return s}catch{return[]}}function A(t){const n=t.nodes??[],a=[],m=new Set,s=(i,r)=>{if(m.has(i))return;m.add(i);const d=n[i];if(!d)return;const l=d.name!==void 0&&d.name!==""?d.name:`Node[${String(i)}]`,g=r===""?l:`${r}/${l}`;d.name&&a.push({name:d.name,path:g});for(const w of d.children??[])s(w,g)},c=t.scenes?.[t.scene??0];for(const i of c?.nodes??[])s(i,"");return a}async function L(t,n,a){try{const{validateBytes:m}=await p("gltf-validator"),c=(await m(new Uint8Array(a),{uri:f.basename(n),maxIssues:200,externalResourceFunction:async i=>new Uint8Array(await T(x(t,f.dirname(n),decodeURIComponent(i))))})).issues;return{errors:c.numErrors,warnings:c.numWarnings,infos:c.numInfos,hints:c.numHints,messages:c.messages.slice(0,F).map(i=>({code:i.code,severity:i.severity,message:i.message,...i.pointer?{pointer:i.pointer}:{}}))}}catch{return}}const u=t=>Math.round(t*1e6)/1e6;export async function modelInfo(t,n,a){const m=/\.glb$/i.test(n);let s;try{s=N(a,m)}catch(l){return{container:m?"glb":"gltf",extensionsUsed:[],extensionsRequired:[],unsupported:[],missing:[],nodes:[],skins:0,morphTargets:0,cameras:0,lights:0,contentsMissing:`its description could not be read: ${l.message}`}}const c=s.extensionsRequired??[],i=s.extensions?.KHR_lights_punctual?.lights?.length??0,r={container:m?"glb":"gltf",...s.asset?.generator?{generator:s.asset.generator}:{},...s.asset?.copyright?{copyright:s.asset.copyright}:{},...(s.extensionsUsed??[]).includes("KHR_xmp_json_ld")?{rights:!0}:{},extensionsUsed:s.extensionsUsed??[],extensionsRequired:c,unsupported:c.filter(l=>!I.has(l)),missing:await missingFiles(t,n),nodes:A(s),skins:s.skins?.length??0,morphTargets:(s.meshes??[]).filter(l=>(l.primitives??[]).some(g=>(g.targets?.length??0)>0)).length,cameras:s.cameras?.length??0,lights:i},d=await L(t,n,a);if(d&&(r.validator=d),r.missing.length>0)return r.contentsMissing=`it names files that are not there (${r.missing.join(", ")})`,r;try{const[{NodeIO:l},{ALL_EXTENSIONS:g},{inspect:w},v,{MeshoptDecoder:E}]=await Promise.all([p("@gltf-transform/core"),p("@gltf-transform/extensions"),p("@gltf-transform/functions"),p("draco3dgltf"),p("meshoptimizer")]),b=new Set(g.map(e=>e.EXTENSION_NAME)),H=c.filter(e=>!b.has(e));if(H.length>0)return r.contentsMissing=`glTF-Transform does not read ${H.join(", ")}`,r;await E.ready;const K=new l().registerExtensions(g).registerDependencies({"draco3d.decoder":await v.createDecoderModule(),"meshopt.decoder":E}),R=m?await K.readBinary(new Uint8Array(a)):await K.read(x(t,n)),h=w(R),y=h.scenes.properties[0];if(y){const e=y.bboxMin,o=y.bboxMax,S=[u(o[0]-e[0]),u(o[1]-e[1]),u(o[2]-e[2])];r.bounds={min:[u(e[0]),u(e[1]),u(e[2])],max:[u(o[0]),u(o[1]),u(o[2])],size:S,largest:Math.max(...S)}}const _=h.meshes.properties;r.counts={nodes:R.getRoot().listNodes().length,meshes:_.length,primitives:_.reduce((e,o)=>e+o.meshPrimitives,0),triangles:_.reduce((e,o)=>e+o.glPrimitives*Math.max(1,o.instances),0),instances:_.reduce((e,o)=>e+o.instances,0)},r.materials=R.getRoot().listMaterials().map(e=>({name:e.getName(),extensions:e.listExtensions().map(o=>o.extensionName)})),r.textures=h.textures.properties.map(e=>({name:e.name,mimeType:e.mimeType,...e.resolution?{width:Number(e.resolution.split("x")[0]),height:Number(e.resolution.split("x")[1])}:{},bytes:e.size,...e.gpuSize!==null?{gpuBytes:e.gpuSize}:{}})),r.animations=h.animations.properties.map(e=>({name:e.name,duration:u(e.duration),channels:e.channels}))}catch(l){r.contentsMissing=`glTF-Transform could not read it: ${l.message.split(`
3
4
  `)[0]??""}`}return r}
@@ -27,5 +27,7 @@ export interface PluginOptions {
27
27
  export declare function lentSdk(): string | undefined;
28
28
  /** The module a project file imports as the SDK: the SDK bound to that file. */
29
29
  export declare function boundSdk(file: string): string;
30
+ /** The module a project file imports as @allyhub/sdk/slides: presentation() bound to that file. */
31
+ export declare function boundSlides(file: string): string;
30
32
  export declare function allyhubPlugin(options: PluginOptions): Plugin;
31
33
  //# sourceMappingURL=plugin.d.ts.map
@@ -1,11 +1,12 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{realpathSync as j}from"node:fs";import{readFile as b}from"node:fs/promises";import{builtinModules as w}from"node:module";import{dirname as D,isAbsolute as u,relative as v,sep as x}from"node:path";import{fileURLToPath as J}from"node:url";import{mediaKindOf as E}from"@allyhub-next/video-core";import{parseCsv as F,parseData as L}from"./data.js";import{FONTS_MODULE as h,fontsModule as T}from"./fonts.js";import{LENT as I,SDK as l,packageName as P}from"./scan.js";const i="\0allyhub-blocked:",m="\0allyhub-sdk:",U=`\0${h}`,B=new Set([...w,...w.map(n=>`node:${n}`)]),$=n=>n.replace(/[?#].*$/u,""),C=n=>`/media/${n.split("/").map(encodeURIComponent).join("/")}`;export function lentSdk(){try{return D(J(import.meta.resolve(`${l}/package.json`)))}catch{return}}export function boundSdk(n){return[`export * from ${JSON.stringify(l)};`,`import { sdkFor } from ${JSON.stringify(l)};`,`export const { video, slides, part, take, footage } = sdkFor({ file: ${JSON.stringify(n)} });`,""].join(`
3
- `)}export function allyhubPlugin(n){const{root:s}=n,W=n.mediaUrl??C,y=[s];try{const t=j.native(s);t!==s&&y.push(t)}catch{}const S=t=>{for(const e of y){const r=v(e,t);if(!r.startsWith("..")&&!u(r))return r}},g=t=>(S(t)??v(s,t)).split(x).join("/"),c=t=>S(t)!==void 0,p=t=>t.split(x).includes("node_modules"),N=t=>{try{return J(import.meta.resolve(t))}catch{return`${i}${t}`}};return{name:"allyhub",enforce:"pre",async resolveId(t,e,r){if(t===h)return U;if(t.startsWith(m))return t;if(t.startsWith("\0"))return null;const o=e?$(e):void 0,k=o!==void 0&&u(o)&&c(o)&&!p(o);if(/^(https?:)?\/\//iu.test(t))return`${i}${t}`;const f=P(t);if(f===l){if(t===l&&k)return`${m}${g(o)}`;const a=await this.resolve(t,e,{...r,skipSelf:!0});return a||(n.dependencies.has(l)?`${i}${t}`:N(t))}const O=n.lent?.[f];if(O!==void 0&&!n.dependencies.has(f))return await this.resolve(t,O,{...r,skipSelf:!0})??`${i}${t}`;if(I.has(f))return n.dependencies.has(f)?null:N(t);if(!k)return null;if(!t.startsWith(".")&&!t.startsWith("/")&&!u(t)&&!B.has(t))return n.dependencies.has(f)?null:`${i}${t}`;const d=await this.resolve(t,e,{...r,skipSelf:!0});if(d&&!d.external){const a=$(d.id);if(u(a)&&!c(a)&&!p(a))return`${i}${t}`}return d},async load(t){if(t===U)return T(s,n.fonts?.()??[]);if(t.startsWith(m))return boundSdk(t.slice(m.length));if(t.startsWith(i)){const r=`AllyHub blocked the import of ${t.slice(i.length)}`;return`throw new Error(${JSON.stringify(r)});
2
+ import{realpathSync as j}from"node:fs";import{readFile as x}from"node:fs/promises";import{builtinModules as J}from"node:module";import{dirname as F,isAbsolute as u,relative as w,sep as v}from"node:path";import{fileURLToPath as W}from"node:url";import{mediaKindOf as E}from"@allyhub-next/video-core";import{parseCsv as L,parseData as I}from"./data.js";import{FONTS_MODULE as S,fontsModule as T}from"./fonts.js";import{LENT as B,SDK as i,packageName as P}from"./scan.js";const s="\0allyhub-blocked:",m="\0allyhub-sdk:",p="\0allyhub-sdk-slides:",U=`\0${S}`,C=new Set([...J,...J.map(n=>`node:${n}`)]),g=n=>n.replace(/[?#].*$/u,""),K=n=>`/media/${n.split("/").map(encodeURIComponent).join("/")}`;export function lentSdk(){try{return F(W(import.meta.resolve(`${i}/package.json`)))}catch{return}}export function boundSdk(n){return[`export * from ${JSON.stringify(i)};`,`import { sdkFor } from ${JSON.stringify(i)};`,`export const { video, part, take, footage } = sdkFor({ file: ${JSON.stringify(n)} });`,""].join(`
3
+ `)}export function boundSlides(n){return[`export * from ${JSON.stringify(`${i}/slides`)};`,`import { presentationFor } from ${JSON.stringify(`${i}/slides`)};`,`export const presentation = presentationFor(${JSON.stringify(n)});`,""].join(`
4
+ `)}export function allyhubPlugin(n){const{root:o}=n,D=n.mediaUrl??K,N=[o];try{const t=j.native(o);t!==o&&N.push(t)}catch{}const O=t=>{for(const e of N){const r=w(e,t);if(!r.startsWith("..")&&!u(r))return r}},c=t=>(O(t)??w(o,t)).split(v).join("/"),h=t=>O(t)!==void 0,$=t=>t.split(v).includes("node_modules"),k=t=>{try{return W(import.meta.resolve(t))}catch{return`${s}${t}`}};return{name:"allyhub",enforce:"pre",async resolveId(t,e,r){if(t===S)return U;if(t.startsWith(m)||t.startsWith(p))return t;if(t.startsWith("\0"))return null;const a=e?g(e):void 0,y=a!==void 0&&u(a)&&h(a)&&!$(a);if(/^(https?:)?\/\//iu.test(t))return`${s}${t}`;const f=P(t);if(f===i){if(t===i&&y)return`${m}${c(a)}`;if(t===`${i}/slides`&&y)return`${p}${c(a)}`;const l=await this.resolve(t,e,{...r,skipSelf:!0});return l||(n.dependencies.has(i)?`${s}${t}`:k(t))}const b=n.lent?.[f];if(b!==void 0&&!n.dependencies.has(f))return await this.resolve(t,b,{...r,skipSelf:!0})??`${s}${t}`;if(B.has(f))return n.dependencies.has(f)?null:k(t);if(!y)return null;if(!t.startsWith(".")&&!t.startsWith("/")&&!u(t)&&!C.has(t))return n.dependencies.has(f)?null:`${s}${t}`;const d=await this.resolve(t,e,{...r,skipSelf:!0});if(d&&!d.external){const l=g(d.id);if(u(l)&&!h(l)&&!$(l))return`${s}${t}`}return d},async load(t){if(t===U)return T(o,n.fonts?.()??[]);if(t.startsWith(p))return boundSlides(t.slice(p.length));if(t.startsWith(m))return boundSdk(t.slice(m.length));if(t.startsWith(s)){const r=`AllyHub blocked the import of ${t.slice(s.length)}`;return`throw new Error(${JSON.stringify(r)});
4
5
  export default undefined;
5
- `}if(t.startsWith("\0")||/[?#]/u.test(t)||!u(t)||!c(t)||p(t))return null;const e=g(t);if(E(e)){const r=n.media[e];return r?`import { media } from ${JSON.stringify(`${l}/media`)};
6
- export default media(${JSON.stringify({...r,url:W(e)})});
7
- `:null}return/\.csv$/iu.test(e)?`export default ${JSON.stringify(F(await b(t,"utf8")))};
8
- `:/\.ya?ml$/iu.test(e)?`export default ${JSON.stringify(L(e,await b(t,"utf8")))};
9
- `:null},transform(t,e){return n.stageEntries?.has($(e))?{code:`${t}
10
- import ${JSON.stringify(h)};
6
+ `}if(t.startsWith("\0")||/[?#]/u.test(t)||!u(t)||!h(t)||$(t))return null;const e=c(t);if(E(e)){const r=n.media[e];return r?`import { media } from ${JSON.stringify(`${i}/media`)};
7
+ export default media(${JSON.stringify({...r,url:D(e)})});
8
+ `:null}return/\.csv$/iu.test(e)?`export default ${JSON.stringify(L(await x(t,"utf8")))};
9
+ `:/\.ya?ml$/iu.test(e)?`export default ${JSON.stringify(I(e,await x(t,"utf8")))};
10
+ `:null},transform(t,e){const r=g(e);return n.stageEntries?.has(r)?{code:`${t}
11
+ import ${JSON.stringify(S)};
11
12
  `,map:null}:null}}}
@@ -1,4 +1,4 @@
1
- import { type Config, type Item } from "@allyhub-next/formats";
1
+ import { type SlidesFile, type Config, type Item } from "@allyhub-next/formats";
2
2
  import { type BuildSource, type Combo, type Dims, type FormatEntry, type MatrixPlan, type Problem, type VideoConfig } from "@allyhub-next/video-core";
3
3
  import { type DocInfo, type SheetInfo } from "./content.js";
4
4
  import { readData } from "./data.js";
@@ -28,6 +28,14 @@ export interface PieceInfo {
28
28
  /** Its output's options, as read in Node. */
29
29
  options: Record<string, unknown>;
30
30
  meta: Record<string, unknown>;
31
+ /** A deck's: its slides.yaml as read (none when it has none or it is not the format), its size in EMU, and its layouts', components' and generators' names. */
32
+ deck?: {
33
+ file?: SlidesFile;
34
+ size: [width: number, height: number];
35
+ layouts: string[];
36
+ components: Record<string, unknown>;
37
+ generators: string[];
38
+ };
31
39
  }
32
40
  export interface Prepared {
33
41
  root: string;
@@ -78,4 +86,8 @@ export declare function prepare(root: string, options?: PrepareOptions): Promise
78
86
  * the build's bundles (an URL ending in "/"), `mediaUrl` a project file.
79
87
  */
80
88
  export declare function sourceOf(prepared: Prepared, piece: PieceInfo, served: string, mediaUrl: (path: string) => string): BuildSource;
89
+ /** A deck's pixels: its size at 144 dots an inch (a 16:9 deck is 1920 × 1080). */
90
+ export declare const DECK_DPI = 144;
91
+ /** The stage's size of a deck, as a WxH format. */
92
+ export declare const deckFormat: ([w, h]: readonly [number, number]) => string;
81
93
  //# sourceMappingURL=prepare.d.ts.map
@@ -1,3 +1,3 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{readFile as C,readdir as Q}from"node:fs/promises";import{join as S}from"node:path";import{BAKE_DIR as G,CONFIG_FILES as Y,ConfigSchema as q,PACKAGE_FILE as Z,TEXT_DIR as K,scanItems as ee}from"@allyhub-next/formats";import{FORMAT_HELP as te,PagedOptionsMeta as se,PieceMeta as ie,VIDEO_FORMAT_HELP as ne,VideoConfigSchema as oe,VideoOptionsMeta as ae,formatName as re,isFormat as ce,isVideoFormat as le,looksOf as de,problem as l,resolveDims as me}from"@allyhub-next/video-core";import{readDocs as fe,readSheets as ue}from"./content.js";import{readData as he}from"./data.js";import{listFiles as pe}from"./files.js";import{fontStyles as we}from"./fonts.js";import{resolveMatrix as ye}from"./matrix.js";import{readMedia as be}from"./media.js";import{mergeScripts as ge,readMessages as $e}from"./messages.js";import{MetaLoader as ve}from"./meta.js";import{allyhubPlugin as xe}from"./plugin.js";import{checkImports as ke,discover as H,parse as Me}from"./scan.js";import{writeMessageTypes as Ae}from"./types.js";import{bundleForStage as Se,loadUserVite as je}from"./vite.js";import{nodeStackPlace as B}from"./places.js";function Oe(t){switch(t.code){case"two-entries":return l("AK-M003",`${t.dir} has more than one entry file (${t.entries.join(", ")}): an item has one. Remove all but one.`,{where:{file:t.entries[0]??t.dir}});case"nested":return l("AK-M003",`${t.dir} is an item inside the item ${t.inside}: items do not nest. Move it out.`,{where:{file:t.dir}});case"at-root":return l("AK-M002",`${t.entry} is at the project's root: an item is a folder of its own. Move it into one.`,{where:{file:t.entry}})}}function J(t,i,s){const r=s?`${i} (at ${s.file}:${String(s.line)}:${String(s.column)})`:i,m=/\b(window|document|navigator|self|HTMLElement|customElements) is not defined/u.test(i);return l("AK-R001",m?`${t} uses something at its top level that only exists in the browser (${r}). The top level of a piece module must load in Node: move it into the output's function, or import it inside a component.`:`Failed to load ${t}: ${r}`,{where:s?{file:s.file,line:s.line}:{file:t}})}const D=t=>t.issues.map(i=>`${i.path.map(String).join(".")||"(root)"}: ${i.message}`).join("; ");async function Ee(t){try{const i=JSON.parse(await C(S(t,Z),"utf8"));return new Set(["dependencies","devDependencies","peerDependencies","optionalDependencies"].flatMap(s=>Object.keys(i[s]??{})))}catch{return new Set}}async function Fe(t){return(await Q(S(t,G)).catch(()=>[])).filter(s=>/^[0-9a-f]+\.[\w-]+\.bin$/u.test(s)).map(s=>`${G}/${s}`)}export async function prepare(t,i={}){const s=[],r=await pe(t),m=ee(r);for(const n of m.problems)s.push(Oe(n));const u=await Ee(t),g=await be(t,[...r,...await Fe(t)]),p=new ve({root:t,media:g,dependencies:[...u],user:!0,...i.host?{lent:{...i.host.lent}}:{}},i.metaTimeout);try{let n=q.parse({});const c=Y.find(e=>r.includes(e));if(c){const e=await p.request({type:"config",file:c});if(s.push(...e.problems),!e.ok)s.push(J(c,e.error??"",B(e.stack,t)));else{const a=q.safeParse(e.value??{}),o=oe.safeParse(e.value??{});a.success&&o.success?n={...a.data,...o.data}:s.push(l("AK-M001",`${c} is not valid: ${[a.error,o.error].flatMap(h=>h?[D(h)]:[]).join("; ")}.`,{where:{file:c}}))}}const $=n.defaults?.format??"16x9",w=we(t,n);for(const e of w.missing)s.push(l("AK-A001",`allyhub.config's fonts name ${e}, which is not in the project or its packages.`,{where:{file:c??"allyhub.config.ts"}}));const y=await $e(t,r,{...n.locales?{locales:n.locales}:{},text:n.text??K});s.push(...y.problems);const W=await he(t,r,n.text??K),P=await fe(t,m.items,r),T=await ue(t,m.items,r);s.push(...P.problems,...T.problems);const X=r.filter(e=>/\.(ts|tsx|js|jsx|mts|mjs)$/u.test(e)&&!e.endsWith(".d.ts")),j=new Map;for(const e of X){const a=Me(e,await C(S(t,e),"utf8"));j.set(e,a),s.push(...ke(e,a,u,new Set(Object.keys(i.host?.lent??{}))))}const _=[];for(const[e,a]of j){if(!H(e,a).components)continue;const o=await p.request({type:"components",file:e});if(s.push(...o.problems),!!o.ok)for(const h of o.value??[])typeof h.name=="string"&&_.push({name:h.name,file:e})}const v=[],I=new Map;for(const e of m.items){if(e.kind!=="video"&&e.kind!=="slides")continue;const a=j.get(e.entry);if(a){const F=H(e.entry,a);if(s.push(...F.problems),!F.piece&&F.problems.length>0)continue}const o=await p.request({type:"piece",file:e.entry});if(s.push(...o.problems),!o.ok){o.error!=="timeout"&&s.push(J(e.entry,o.error??"",B(o.stack,t)));continue}const h={...o.value};delete h.written;const d=ie.safeParse(h);if(!d.success){s.push(l("AK-M001",`The piece in ${e.entry} is not valid: ${D(d.error)}.`,{where:{file:e.entry}}));continue}const L=e.dir,f=d.data.id??L,N=I.get(f);if(N!==void 0){s.push(l("AK-B001",`${e.entry} and ${N} both have the piece id ${f}. Give one of them another (video({ id, … })).`,{where:{file:e.entry}}));continue}I.set(f,e.entry),s.push(...ge(y,[{id:f,dir:e.dir}]));const[k]=Object.values(d.data.outputs);if(!k)continue;const b=e.kind,z=b==="slides"?"paged":"video";if(k.kind!==z){s.push(l("AK-M003",`${e.entry} exports ${k.kind==="paged"?"slides({ … })":"video({ … })"}, but its name makes the item ${b==="slides"?"slides":"a video"}. Name the file for what it exports.`,{piece:f,where:{file:e.entry}}));continue}const U=d.data.format??$,M=re(U);if(!(b==="video"?le(M):ce(M))){s.push(l("AK-G001",`${e.entry} cannot render in the format "${M}". Use ${b==="video"?ne:te}.`,{piece:f,where:{file:e.entry}}));continue}const E=(b==="video"?ae:se).safeParse(k.options);if(!E.success){s.push(l("AK-M001",`The ${b==="video"?"video":"slides"} of ${e.entry} are not valid: ${D(E.error)}.`,{piece:f,where:{file:e.entry}}));continue}const V=me(d.data.matrix?.dims,{locales:y.locales}),A=await ye({root:t,piece:f,file:e.entry,dims:V,matrix:d.data.matrix,files:r});s.push(...A.problems),v.push({id:f,idFrom:d.data.id===void 0?"path":"code",kind:b,dir:e.dir,file:e.entry,place:L,...d.data.title===void 0?{}:{title:d.data.title},format:M,formatEntry:U,dims:V,combos:A.combos,...A.plan?{matrix:A.plan}:{},options:E.data,meta:d.data.meta??{}})}const x=y.locales[0];await Ae(t,x===void 0?{}:y.messages[x]??{},x===void 0?void 0:y.files[x]);let O;if(i.buildDir&&v.length>0){const e=Object.fromEntries(v.map(o=>[o.id.replaceAll("/","__"),S(t,o.file)])),a=await je(t);try{const o=await Se({root:t,entries:e,outDir:i.buildDir,plugins:[xe({root:t,media:g,dependencies:u,fonts:()=>w.styles,stageEntries:new Set(Object.values(e)),...i.host?{lent:i.host.lent}:{},...i.mediaUrl?{mediaUrl:i.mediaUrl}:{}}),...i.host?.plugins??[]],...a?{user:a}:{}});O={dir:i.buildDir,chunks:o}}catch(o){s.push(l("AK-R001",`The pieces could not be bundled for the stage: ${o.message.split(`
3
- `).slice(0,3).join(" ")}`,{}))}}const R=new Set;return{root:t,files:r,items:m.items,config:n,defaultFormat:$,dependencies:[...u].sort(),messages:y,media:g,data:W,docs:P.docs,sheets:T.sheets,pieces:v,components:_,fonts:w.styles,...O?{bundle:O}:{},problems:s.filter(e=>{const a=`${e.code}|${e.message}|${e.where?.file??""}|${String(e.where?.line??"")}`;return R.has(a)?!1:(R.add(a),!0)})}}finally{await p.close()}}export function sourceOf(t,i,s,r){const m=i.id.replaceAll("/","__"),u=t.bundle?.chunks.entries[m];if(!u)throw new Error(`${i.id} was not bundled for the stage.`);const g=new Set,p=(n,c)=>{if(c.has(n))return;c.add(n);const $=t.bundle?.chunks.chunks[n];if($){for(const w of $.css)g.add(`${s}${w}`);for(const w of $.imports)p(w,c)}};return p(u.file,new Set),{piece:i.id,file:i.file,module:`${s}${u.file}`,styles:[...g],dims:i.dims,...i.matrix?{matrix:{space:i.matrix.space,rules:i.matrix.rules}}:{},format:i.format,locales:t.messages.locales,messages:t.messages.messages,anchors:t.messages.anchors,text:t.config.text??K,media:Object.fromEntries(Object.entries(t.media).map(([n,c])=>[n,{...c,url:r(n)}])),data:t.data,...de(t.config),pieces:Object.fromEntries(t.pieces.map(n=>[n.id,{file:n.file,dims:n.dims,format:n.format,...n.matrix?{matrix:{space:n.matrix.space,rules:n.matrix.rules}}:{}}]))}}
2
+ import{readFile as _,readdir as te}from"node:fs/promises";import{join as M}from"node:path";import{BAKE_DIR as B,CONFIG_FILES as se,ConfigSchema as H,PACKAGE_FILE as ie,SLIDES_FILE as P,TEXT_DIR as I,scanItems as ne,slidesFileFor as oe}from"@allyhub-next/formats";import{PieceMeta as re,VIDEO_FORMAT_HELP as ae,VideoConfigSchema as ce,VideoOptionsMeta as de,formatName as le,isVideoFormat as fe,looksOf as me,messagePrefix as ue,problem as f,resolveDims as J}from"@allyhub-next/video-core";import{checkDeck as he,readSlidesFile as pe}from"@allyhub-next/slides-core";import{readDocs as we,readSheets as ye}from"./content.js";import{readData as be}from"./data.js";import{listFiles as ge}from"./files.js";import{fontStyles as $e}from"./fonts.js";import{resolveMatrix as W}from"./matrix.js";import{readMedia as ke}from"./media.js";import{mergeScripts as X,readMessages as ve}from"./messages.js";import{MetaLoader as xe}from"./meta.js";import{allyhubPlugin as Me}from"./plugin.js";import{checkImports as Se,discover as Q,parse as Ae}from"./scan.js";import{writeMessageTypes as Ee}from"./types.js";import{bundleForStage as Fe,loadUserVite as Ke}from"./vite.js";import{nodeStackPlace as T}from"./places.js";function je(e){switch(e.code){case"two-entries":return f("AK-M003",`${e.dir} has more than one entry file (${e.entries.join(", ")}): an item has one. Remove all but one.`,{where:{file:e.entries[0]??e.dir}});case"nested":return f("AK-M003",`${e.dir} is an item inside the item ${e.inside}: items do not nest. Move it out.`,{where:{file:e.dir}});case"at-root":return f("AK-M002",`${e.entry} is at the project's root: an item is a folder of its own. Move it into one.`,{where:{file:e.entry}})}}function L(e,t,i){const c=i?`${t} (at ${i.file}:${String(i.line)}:${String(i.column)})`:t,m=/\b(window|document|navigator|self|HTMLElement|customElements) is not defined/u.test(t);return f("AK-R001",m?`${e} uses something at its top level that only exists in the browser (${c}). The top level of a piece module must load in Node: move it into the output's function, or import it inside a component.`:`Failed to load ${e}: ${c}`,{where:i?{file:i.file,line:i.line}:{file:e}})}const R=e=>e.issues.map(t=>`${t.path.map(String).join(".")||"(root)"}: ${t.message}`).join("; ");async function Oe(e){try{const t=JSON.parse(await _(M(e,ie),"utf8"));return new Set(["dependencies","devDependencies","peerDependencies","optionalDependencies"].flatMap(i=>Object.keys(t[i]??{})))}catch{return new Set}}async function De(e){return(await te(M(e,B)).catch(()=>[])).filter(i=>/^[0-9a-f]+\.[\w-]+\.bin$/u.test(i)).map(i=>`${B}/${i}`)}export async function prepare(e,t={}){const i=[],c=await ge(e),m=ne(c);for(const n of m.problems)i.push(je(n));const h=await Oe(e),u=await ke(e,[...c,...await De(e)]),p=new xe({root:e,media:u,dependencies:[...h],user:!0,...t.host?{lent:{...t.host.lent}}:{}},t.metaTimeout);try{let n=H.parse({});const r=se.find(s=>c.includes(s));if(r){const s=await p.request({type:"config",file:r});if(i.push(...s.problems),!s.ok)i.push(L(r,s.error??"",T(s.stack,e)));else{const d=H.safeParse(s.value??{}),o=ce.safeParse(s.value??{});d.success&&o.success?n={...d.data,...o.data}:i.push(f("AK-M001",`${r} is not valid: ${[d.error,o.error].flatMap(g=>g?[R(g)]:[]).join("; ")}.`,{where:{file:r}}))}}const l=n.defaults?.format??"16x9",y=$e(e,n);for(const s of y.missing)i.push(f("AK-A001",`allyhub.config's fonts name ${s}, which is not in the project or its packages.`,{where:{file:r??"allyhub.config.ts"}}));const b=await ve(e,c,{...n.locales?{locales:n.locales}:{},text:n.text??I});i.push(...b.problems);const S=await be(e,c,n.text??I),a=await we(e,m.items,c),k=await ye(e,m.items,c);i.push(...a.problems,...k.problems);const Z=c.filter(s=>/\.(ts|tsx|js|jsx|mts|mjs)$/u.test(s)&&!s.endsWith(".d.ts")),F=new Map;for(const s of Z){const d=Ae(s,await _(M(e,s),"utf8"));F.set(s,d),i.push(...Se(s,d,h,new Set(Object.keys(t.host?.lent??{}))))}const C=[];for(const[s,d]of F){if(!Q(s,d).components)continue;const o=await p.request({type:"components",file:s});if(i.push(...o.problems),!!o.ok)for(const g of o.value??[])typeof g.name=="string"&&C.push({name:g.name,file:s})}const x=[],K=new Map;for(const s of m.items){if(s.kind==="slides"){const v=await _e(s,{root:e,meta:p,messages:b,media:u,ids:K,problems:i});v&&x.push(v);continue}if(s.kind!=="video")continue;const d=F.get(s.entry);if(d){const v=Q(s.entry,d);if(i.push(...v.problems),!v.piece&&v.problems.length>0)continue}const o=await p.request({type:"piece",file:s.entry});if(i.push(...o.problems),!o.ok){o.error!=="timeout"&&i.push(L(s.entry,o.error??"",T(o.stack,e)));continue}const g={...o.value};delete g.written;const w=re.safeParse(g);if(!w.success){i.push(f("AK-M001",`The piece in ${s.entry} is not valid: ${R(w.error)}.`,{where:{file:s.entry}}));continue}const N=s.dir,$=w.data.id??N,V=K.get($);if(V!==void 0){i.push(f("AK-B001",`${s.entry} and ${V} both have the piece id ${$}. Give one of them another (video({ id, … })).`,{where:{file:s.entry}}));continue}K.set($,s.entry),i.push(...X(b,[{id:$,dir:s.dir}]));const[q]=Object.values(w.data.outputs);if(!q)continue;const ee=s.kind,G=w.data.format??l,O=le(G);if(!fe(O)){i.push(f("AK-G001",`${s.entry} cannot render in the format "${O}". Use ${ae}.`,{piece:$,where:{file:s.entry}}));continue}const D=de.safeParse(q.options);if(!D.success){i.push(f("AK-M001",`The video of ${s.entry} is not valid: ${R(D.error)}.`,{piece:$,where:{file:s.entry}}));continue}const z=J(w.data.matrix?.dims,{locales:b.locales}),E=await W({root:e,piece:$,file:s.entry,dims:z,matrix:w.data.matrix,files:c});i.push(...E.problems),x.push({id:$,idFrom:w.data.id===void 0?"path":"code",kind:ee,dir:s.dir,file:s.entry,place:N,...w.data.title===void 0?{}:{title:w.data.title},format:O,formatEntry:G,dims:z,combos:E.combos,...E.plan?{matrix:E.plan}:{},options:D.data,meta:w.data.meta??{}})}const A=b.locales[0];await Ee(e,A===void 0?{}:b.messages[A]??{},A===void 0?void 0:b.files[A]);let j;if(t.buildDir&&x.length>0){const s=Object.fromEntries(x.map(o=>[o.id.replaceAll("/","__"),M(e,o.file)])),d=await Ke(e);try{const o=await Fe({root:e,entries:s,outDir:t.buildDir,plugins:[Me({root:e,media:u,dependencies:h,fonts:()=>y.styles,stageEntries:new Set(Object.values(s)),...t.host?{lent:t.host.lent}:{},...t.mediaUrl?{mediaUrl:t.mediaUrl}:{}}),...t.host?.plugins??[]],...d?{user:d}:{}});j={dir:t.buildDir,chunks:o}}catch(o){i.push(f("AK-R001",`The pieces could not be bundled for the stage: ${o.message.split(`
3
+ `).slice(0,3).join(" ")}`,{}))}}const U=new Set;return{root:e,files:c,items:m.items,config:n,defaultFormat:l,dependencies:[...h].sort(),messages:b,media:u,data:S,docs:a.docs,sheets:k.sheets,pieces:x,components:C,fonts:y.styles,...j?{bundle:j}:{},problems:i.filter(s=>{const d=`${s.code}|${s.message}|${s.where?.file??""}|${String(s.where?.line??"")}`;return U.has(d)?!1:(U.add(d),!0)})}}finally{await p.close()}}export function sourceOf(e,t,i,c){const m=t.id.replaceAll("/","__"),h=e.bundle?.chunks.entries[m];if(!h)throw new Error(`${t.id} was not bundled for the stage.`);const u=new Set,p=(n,r)=>{if(r.has(n))return;r.add(n);const l=e.bundle?.chunks.chunks[n];if(l){for(const y of l.css)u.add(`${i}${y}`);for(const y of l.imports)p(y,r)}};return p(h.file,new Set),{piece:t.id,file:t.file,module:`${i}${h.file}`,styles:[...u],dims:t.dims,...t.matrix?{matrix:{space:t.matrix.space,rules:t.matrix.rules}}:{},format:t.format,locales:e.messages.locales,messages:e.messages.messages,anchors:e.messages.anchors,text:e.config.text??I,media:Object.fromEntries(Object.entries(e.media).map(([n,r])=>[n,{...r,url:c(n)}])),data:e.data,...t.kind==="slides"?{kind:"slides",slides:t.deck?.file??{slides:[]}}:{},...me(e.config),pieces:Object.fromEntries(e.pieces.map(n=>[n.id,{file:n.file,dims:n.dims,format:n.format,...n.matrix?{matrix:{space:n.matrix.space,rules:n.matrix.rules}}:{}}]))}}export const DECK_DPI=144;const Y=914400;export const deckFormat=([e,t])=>`${String(Math.round(e/Y*DECK_DPI))}x${String(Math.round(t/Y*DECK_DPI))}`;async function _e(e,t){const i=e.dir,c=t.ids.get(i);if(c!==void 0){t.problems.push(f("AK-B001",`${e.entry} and ${c} both have the piece id ${i}.`,{where:{file:e.entry}}));return}t.ids.set(i,e.entry),t.problems.push(...X(t.messages,[{id:i,dir:e.dir}]));const m=oe(e.dir),h=a=>({file:m,...a===void 0?{}:{line:a}});let u,p=()=>{};try{const a=pe(await _(M(t.root,m),"utf8"));p=a.lineOf;for(const k of a.problems)t.problems.push(f("AK-M011",`${P}: ${k.message}`,{piece:i,where:h(k.line)}));u=a.file}catch{t.problems.push(f("AK-M011",`The deck ${e.dir} has no ${P}: its slides are listed there, each on one of slides.ts's layouts (slides: [{ id: cover, layout: Title Slide }]).`,{piece:i,where:{file:m}}))}const n=t.messages.locales[0],r=await t.meta.request({type:"deck",file:e.entry,slides:u,words:n===void 0?{}:t.messages.messages[n]??{},prefix:ue(i)});if(t.problems.push(...r.problems),!r.ok){r.error!=="timeout"&&t.problems.push(L(e.entry,r.error??"",T(r.stack,t.root)));return}const l=r.value;for(const a of l.problems)t.problems.push(f("AK-M011",`${P}: ${a.message}`,{piece:i,...a.slide===void 0?{}:{part:a.slide},where:h(a.path===void 0?void 0:p(a.path))}));for(const a of he(l.resolved,{mediaKind:k=>t.media[k]?.kind}))t.problems.push(f("AK-M011",a.message,{piece:i,...a.slide===void 0?{}:{part:a.slide},where:{file:m}}));const y=J(void 0,{locales:t.messages.locales}),b=await W({root:t.root,piece:i,file:e.entry,dims:y,matrix:void 0,files:[]}),S=deckFormat(l.size);return{id:i,idFrom:"path",kind:"slides",dir:e.dir,file:e.entry,place:e.dir,...l.title===void 0?{}:{title:l.title},format:S,formatEntry:S,dims:y,combos:b.combos,options:{},meta:{},deck:{...u?{file:u}:{},size:l.size,layouts:l.layouts,components:l.components,generators:l.generators}}}
@@ -29,7 +29,7 @@ export declare const SDK_ENTRIES: ReadonlySet<string>;
29
29
  */
30
30
  export declare const LENT: ReadonlySet<string>;
31
31
  export interface Discovered {
32
- /** The file default-exports video(…) or slides(…) (directly or through a binding). */
32
+ /** The file default-exports video(…) or presentation(…) (directly or through a binding). */
33
33
  piece: boolean;
34
34
  /** The file imports defineComponent from @allyhub/sdk. */
35
35
  components: boolean;
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{builtinModules as A}from"node:module";import{parseSync as g,visitorKeys as E}from"oxc-parser";import{problem as f,repoPath as K}from"@allyhub-next/video-core";export function parse(t,n){const e=g(t,n,{sourceType:"module"});return{program:e.program,errors:e.errors.map(o=>({message:o.message,...o.labels[0]?{start:o.labels[0].start}:{}})),source:n}}export function lineAt(t,n){let e=1;for(let o=0;o<n&&o<t.length;o++)t.charCodeAt(o)===10&&e++;return e}const m=t=>typeof t=="object"&&t!==null&&typeof t.type=="string",I=new Set(["typeAnnotation","typeParameters","typeArguments","returnType","superTypeArguments","implements"]);export function walk(t,n){const e=[],o=r=>{if(r.type.startsWith("TS")){const i=r.expression;m(i)&&(e.push(r),o(i),e.pop());return}if(!((r.type==="ImportDeclaration"||r.type==="ExportNamedDeclaration")&&r.importKind==="type")){n(r,e),e.push(r);for(const i of E[r.type]??Object.keys(r)){if(I.has(i))continue;const p=r[i];if(Array.isArray(p))for(const a of p)m(a)&&o(a);else m(p)&&o(p)}e.pop()}};o(t)}export const SDK="@allyhub/sdk",SDK_ENTRIES=new Set([SDK,`${SDK}/dom`,`${SDK}/media`,`${SDK}/scenery`]),LENT=new Set(["three","@allyhub-next/model"]);function S(t,n){const e=new Set;for(const o of t.body)if(!(o.type!=="ImportDeclaration"||o.source.value!==SDK))for(const i of o.specifiers??[]){if(i.type!=="ImportSpecifier")continue;const p=i.imported;(p.name??p.value)===n&&e.add(i.local.name)}return e}function d(t){let n=t;for(;["TSAsExpression","TSSatisfiesExpression","ParenthesizedExpression","TSNonNullExpression"].includes(n.type)&&m(n.expression);)n=n.expression;return n}const h=(t,n)=>{if(!t)return!1;const e=d(t);if(e.type!=="CallExpression")return!1;const o=e.callee;return o.type==="Identifier"&&n.has(o.name)},w=["video","slides"];export function discover(t,n){const e=[],{program:o,source:r}=n,i=new Set(w.flatMap(l=>[...S(o,l)])),p=S(o,"defineComponent").size>0,a=o.body,u=a.find(l=>l.type==="ExportDefaultDeclaration"),s=l=>({file:t,line:lineAt(r,l.start)});if(!u)return i.size>0&&/\bexport\s+\{[^}]*\bdefault\b/.test(r)&&e.push(f("AK-M001",`${t} imports ${[...i].join(" and ")}, but its default export is a re-export. An item's entry file writes export default video({ … }) (or slides({ … })) itself: AllyHub does not look in other files.`,{where:{file:t}})),{piece:!1,components:p,problems:e};const c=u.declaration;if(h(c,i))return{piece:!0,components:p,problems:e};const y=d(c);if(y.type==="Identifier"){const l=y.name;for(const x of a)if(x.type==="VariableDeclaration")for(const $ of x.declarations){const b=$.id;if(b.type==="Identifier"&&b.name===l&&h($.init,i))return{piece:!0,components:p,problems:e}}}return i.size>0?e.push(f("AK-M001",`${t} imports ${[...i].join(" and ")}, but its default export is not a video(…) or slides(…) call. Write export default video({ … }), or const film = video({ … }); export default film. AllyHub does not follow factory functions or conditional expressions.`,{where:s(u)})):h(c,new Set(w))&&e.push(f("AK-M001",`The ${String(d(c).callee.name)} that ${t} calls is not imported from ${SDK}. Write import { video } from "${SDK}" (slides for a deck).`,{where:s(u)})),{piece:!1,components:p,problems:e}}const T=new Set([...A,...A.map(t=>`node:${t}`)]);export function packageName(t){const n=t.split("/");return t.startsWith("@")?n.slice(0,2).join("/"):n[0]??t}export function checkImports(t,n,e,o=new Set){const r=[],{program:i,source:p}=n;for(const a of i.body){if(!/^(Import|ExportNamed|ExportAll)Declaration$/.test(a.type)||a.importKind==="type"||a.exportKind==="type")continue;const s=a.source?.value;if(typeof s!="string")continue;const c={file:t,line:lineAt(p,a.start)};if(/^(https?:)?\/\//i.test(s)){r.push(f("AK-B005",`${t} imports the remote address ${s}. The build has no network: install it as an npm package, or put it in the project.`,{where:c}));continue}if(s.startsWith(".")||s.startsWith("/")){K(t,s)===void 0&&r.push(f("AK-B005",`${t} imports ${s}, a file outside the project. Put it in the project.`,{where:c}));continue}if(packageName(s)===SDK){SDK_ENTRIES.has(s)||r.push(f("AK-B006",s===`${SDK}/components`?`${t} imports ${s}: the components are not part of the SDK. A project has its own copies: allyhub add lists the starter components and copies one in (allyhub add component/screen-demo).`:`${t} imports ${s}, which ${SDK} does not have. Its entry points: ${[...SDK_ENTRIES].join(", ")}.`,{where:c}));continue}T.has(s)||LENT.has(packageName(s))||o.has(packageName(s))||e.has(packageName(s))||r.push(f("AK-B005",`${t} imports ${s}, but package.json does not declare ${packageName(s)}. Add it with npm install ${packageName(s)}.`,{where:c}))}return r}
2
+ import{builtinModules as A}from"node:module";import{parseSync as g,visitorKeys as E}from"oxc-parser";import{problem as f,repoPath as K}from"@allyhub-next/video-core";export function parse(t,s){const e=g(t,s,{sourceType:"module"});return{program:e.program,errors:e.errors.map(o=>({message:o.message,...o.labels[0]?{start:o.labels[0].start}:{}})),source:s}}export function lineAt(t,s){let e=1;for(let o=0;o<s&&o<t.length;o++)t.charCodeAt(o)===10&&e++;return e}const d=t=>typeof t=="object"&&t!==null&&typeof t.type=="string",I=new Set(["typeAnnotation","typeParameters","typeArguments","returnType","superTypeArguments","implements"]);export function walk(t,s){const e=[],o=n=>{if(n.type.startsWith("TS")){const i=n.expression;d(i)&&(e.push(n),o(i),e.pop());return}if(!((n.type==="ImportDeclaration"||n.type==="ExportNamedDeclaration")&&n.importKind==="type")){s(n,e),e.push(n);for(const i of E[n.type]??Object.keys(n)){if(I.has(i))continue;const p=n[i];if(Array.isArray(p))for(const a of p)d(a)&&o(a);else d(p)&&o(p)}e.pop()}};o(t)}export const SDK="@allyhub/sdk",SDK_ENTRIES=new Set([SDK,`${SDK}/dom`,`${SDK}/media`,`${SDK}/scenery`,`${SDK}/slides`]),LENT=new Set(["three","@allyhub-next/model"]);function S(t,s,e=SDK){const o=new Set;for(const n of t.body)if(!(n.type!=="ImportDeclaration"||n.source.value!==e))for(const p of n.specifiers??[]){if(p.type!=="ImportSpecifier")continue;const a=p.imported;(a.name??a.value)===s&&o.add(p.local.name)}return o}function h(t){let s=t;for(;["TSAsExpression","TSSatisfiesExpression","ParenthesizedExpression","TSNonNullExpression"].includes(s.type)&&d(s.expression);)s=s.expression;return s}const y=(t,s)=>{if(!t)return!1;const e=h(t);if(e.type!=="CallExpression")return!1;const o=e.callee;return o.type==="Identifier"&&s.has(o.name)},w=[["video",SDK],["presentation",`${SDK}/slides`]];export function discover(t,s){const e=[],{program:o,source:n}=s,i=new Set(w.flatMap(([l,m])=>[...S(o,l,m)])),p=S(o,"defineComponent").size>0,a=o.body,u=a.find(l=>l.type==="ExportDefaultDeclaration"),r=l=>({file:t,line:lineAt(n,l.start)});if(!u)return i.size>0&&/\bexport\s+\{[^}]*\bdefault\b/.test(n)&&e.push(f("AK-M001",`${t} imports ${[...i].join(" and ")}, but its default export is a re-export. An item's entry file writes export default video({ … }) (or presentation(…)) itself: AllyHub does not look in other files.`,{where:{file:t}})),{piece:!1,components:p,problems:e};const c=u.declaration;if(y(c,i))return{piece:!0,components:p,problems:e};const x=h(c);if(x.type==="Identifier"){const l=x.name;for(const m of a)if(m.type==="VariableDeclaration")for(const $ of m.declarations){const b=$.id;if(b.type==="Identifier"&&b.name===l&&y($.init,i))return{piece:!0,components:p,problems:e}}}return i.size>0?e.push(f("AK-M001",`${t} imports ${[...i].join(" and ")}, but its default export is not a video(…) or presentation(…) call. Write export default video({ … }) (presentation(…) for a deck), or const film = video({ … }); export default film. AllyHub does not follow factory functions or conditional expressions.`,{where:r(u)})):y(c,new Set(w.map(([l])=>l)))&&e.push(f("AK-M001",`The ${String(h(c).callee.name)} that ${t} calls is not imported from ${SDK}. Write import { video } from "${SDK}" (import { presentation } from "${SDK}/slides" for a deck).`,{where:r(u)})),{piece:!1,components:p,problems:e}}const T=new Set([...A,...A.map(t=>`node:${t}`)]);export function packageName(t){const s=t.split("/");return t.startsWith("@")?s.slice(0,2).join("/"):s[0]??t}export function checkImports(t,s,e,o=new Set){const n=[],{program:i,source:p}=s;for(const a of i.body){if(!/^(Import|ExportNamed|ExportAll)Declaration$/.test(a.type)||a.importKind==="type"||a.exportKind==="type")continue;const r=a.source?.value;if(typeof r!="string")continue;const c={file:t,line:lineAt(p,a.start)};if(/^(https?:)?\/\//i.test(r)){n.push(f("AK-B005",`${t} imports the remote address ${r}. The build has no network: install it as an npm package, or put it in the project.`,{where:c}));continue}if(r.startsWith(".")||r.startsWith("/")){K(t,r)===void 0&&n.push(f("AK-B005",`${t} imports ${r}, a file outside the project. Put it in the project.`,{where:c}));continue}if(packageName(r)===SDK){SDK_ENTRIES.has(r)||n.push(f("AK-B006",r===`${SDK}/components`?`${t} imports ${r}: the components are not part of the SDK. A project has its own copies: allyhub add lists the starter components and copies one in (allyhub add component/screen-demo).`:`${t} imports ${r}, which ${SDK} does not have. Its entry points: ${[...SDK_ENTRIES].join(", ")}.`,{where:c}));continue}T.has(r)||LENT.has(packageName(r))||o.has(packageName(r))||e.has(packageName(r))||n.push(f("AK-B005",`${t} imports ${r}, but package.json does not declare ${packageName(r)}. Add it with npm install ${packageName(r)}.`,{where:c}))}return n}
@@ -1,6 +1,6 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{mkdir as y,readFile as w,rename as b,writeFile as j}from"node:fs/promises";import{dirname as S,join as k}from"node:path";import{CACHE_DIR as M,TEXT_DIR as T}from"@allyhub-next/formats";import{messageInputs as v}from"@allyhub-next/video-core";import{SDK as d}from"./scan.js";export const MESSAGE_TYPES=`${M}/types/messages.d.ts`;const f=n=>JSON.stringify(n);function x(n){const i={leaf:!1,children:new Map};for(const r of n){let t=i;for(const e of r.split(".")){let s=t.children.get(e);s||(s={leaf:!1,children:new Map},t.children.set(e,s)),t=s}t.leaf=!0}return i}function m(n){const i=[...n.children.keys()];if(i.length===0||!i.every(t=>/^\d+$/.test(t)))return;const r=[];for(let t=0;;t++){const e=n.children.get(String(t));if(!e)break;r.push(e)}return r}function E(n,i){if(n.children.size===0)return"string";const r=m(n);return r?`${p(r,i)}[]`:g([...n.children.entries()].map(([t,e])=>[t,[e],!1]),i)}function g(n,i){const r=`${i} `;return`{
2
+ import{randomUUID as y}from"node:crypto";import{mkdir as w,readFile as b,rename as j,writeFile as S}from"node:fs/promises";import{dirname as k,join as M}from"node:path";import{CACHE_DIR as T,TEXT_DIR as v}from"@allyhub-next/formats";import{messageInputs as x}from"@allyhub-next/video-core";import{SDK as d}from"./scan.js";export const MESSAGE_TYPES=`${T}/types/messages.d.ts`;const f=n=>JSON.stringify(n);function D(n){const i={leaf:!1,children:new Map};for(const r of n){let t=i;for(const e of r.split(".")){let s=t.children.get(e);s||(s={leaf:!1,children:new Map},t.children.set(e,s)),t=s}t.leaf=!0}return i}function m(n){const i=[...n.children.keys()];if(i.length===0||!i.every(t=>/^\d+$/.test(t)))return;const r=[];for(let t=0;;t++){const e=n.children.get(String(t));if(!e)break;r.push(e)}return r}function E(n,i){if(n.children.size===0)return"string";const r=m(n);return r?`${p(r,i)}[]`:g([...n.children.entries()].map(([t,e])=>[t,[e],!1]),i)}function g(n,i){const r=`${i} `;return`{
3
3
  ${[...n].sort((e,s)=>e[0]<s[0]?-1:e[0]>s[0]?1:0).map(([e,s,o])=>`${r}${f(e)}${o?"?":""}: ${p(s,r)};`).join(`
4
4
  `)}
5
- ${i}}`}function p(n,i){if(n.length===0)return"never";const r=n.filter(e=>e.children.size>0&&!m(e));if(r.length===n.length&&r.length>0){const e=new Set(r.flatMap(s=>[...s.children.keys()]));return g([...e].map(s=>{const o=r.map(c=>c.children.get(s)).filter(c=>c!==void 0);return[s,o,o.length<r.length]}),i)}const t=[...new Set(n.map(e=>E(e,i)))];return t.length===1?t[0]??"string":t.join(" | ")}export function messageTypes(n,i){const r=Object.keys(n).sort(),t=r.map(o=>{const c=[...v(n[o]).entries()].sort((l,u)=>l[0]<u[0]?-1:1),a=c.length===0?"{}":`{ ${c.map(([l,u])=>`${f(l)}: ${u==="number"?"number":"string | number"}`).join("; ")} }`;return` ${f(o)}: ${a};`}),e=[],s=(o,c)=>{const a=c?m(o):void 0;a&&a.length>0&&e.push(` ${f(c)}: ${p(a," ")};`);for(const[l,u]of[...o.children.entries()].sort((h,$)=>h[0]<$[0]?-1:1))s(u,c?`${c}.${l}`:l)};return s(x(r),""),[`// Generated by allyhub from ${i??`${T}/ (none yet)`}, the default language.`,"// Do not edit: allyhub check, build and dev write it again.",'// Include it in tsconfig.json: "include": ["**/*.ts", ".allyhub/cache/types"].',`import ${f(d)};`,"",`declare module ${f(d)} {`," interface Messages {",...t," }"," interface MessageLists {",...e," }","}",""].join(`
6
- `)}export async function writeMessageTypes(n,i,r){const t=k(n,MESSAGE_TYPES),e=messageTypes(i,r);if(await w(t,"utf8").catch(()=>{})===e)return;await y(S(t),{recursive:!0});const o=`${t}.${String(process.pid)}.tmp`;await j(o,e),await b(o,t)}
5
+ ${i}}`}function p(n,i){if(n.length===0)return"never";const r=n.filter(e=>e.children.size>0&&!m(e));if(r.length===n.length&&r.length>0){const e=new Set(r.flatMap(s=>[...s.children.keys()]));return g([...e].map(s=>{const o=r.map(c=>c.children.get(s)).filter(c=>c!==void 0);return[s,o,o.length<r.length]}),i)}const t=[...new Set(n.map(e=>E(e,i)))];return t.length===1?t[0]??"string":t.join(" | ")}export function messageTypes(n,i){const r=Object.keys(n).sort(),t=r.map(o=>{const c=[...x(n[o]).entries()].sort((l,u)=>l[0]<u[0]?-1:1),a=c.length===0?"{}":`{ ${c.map(([l,u])=>`${f(l)}: ${u==="number"?"number":"string | number"}`).join("; ")} }`;return` ${f(o)}: ${a};`}),e=[],s=(o,c)=>{const a=c?m(o):void 0;a&&a.length>0&&e.push(` ${f(c)}: ${p(a," ")};`);for(const[l,u]of[...o.children.entries()].sort((h,$)=>h[0]<$[0]?-1:1))s(u,c?`${c}.${l}`:l)};return s(D(r),""),[`// Generated by allyhub from ${i??`${v}/ (none yet)`}, the default language.`,"// Do not edit: allyhub check, build and dev write it again.",'// Include it in tsconfig.json: "include": ["**/*.ts", ".allyhub/cache/types"].',`import ${f(d)};`,"",`declare module ${f(d)} {`," interface Messages {",...t," }"," interface MessageLists {",...e," }","}",""].join(`
6
+ `)}export async function writeMessageTypes(n,i,r){const t=M(n,MESSAGE_TYPES),e=messageTypes(i,r);if(await b(t,"utf8").catch(()=>{})===e)return;await w(k(t),{recursive:!0});const o=`${t}.${y()}.tmp`;await S(o,e),await j(o,t)}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/build",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,4 +1,4 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{createHash as te}from"node:crypto";import{join as se}from"node:path";import{uniformInt as ne}from"pure-rand/distribution/uniformInt";import{xoroshiro128plus as ge}from"pure-rand/generator/xoroshiro128plus";import{CACHE_DIR as we}from"@allyhub-next/formats";import{buildModule as xe}from"@allyhub-next/model/build";import{ffmpegOf as be,ffmpegRuns as ye,postPlaces as $e,postProblems as ke,readPng as oe}from"@allyhub-next/render";import{comboIdOf as U,comboKey as B,comboMatches as Se,countLevels as Me,coverCombos as Fe,cutThroughout as ie,pieceNamed as ae,problem as N,CONSOLE_LIMIT as ve}from"@allyhub-next/video-core";import{OutputCache as Ce,cacheKey as Le,checkerId as De}from"./cache.js";import{consoleOf as Ee,baseDigest as Ae,outputDigest as re,dedupe as ce,StuckError as me,CheckSession as Pe,runtimeDigest as _e,extraCombos as Ie}from"@allyhub-next/project";import{matrixFacts as Ke,measuredFacts as Oe,screenFidelity as Te,flatFrames as Re,cutSeams as je,flashFrames as He,stillPicture as Be}from"@allyhub-next/measure";import{generatedFact as Ne,generatedPagedFact as ze,mismatchFacts as Ue}from"./generated.js";import{StretchLoudness as fe,estimatePlan as Ge,loadedPlan as Ye,planProblems as qe}from"./plans.js";import{sceneryLayerFacts as Je,withBakes as Qe}from"./scenery.js";export function checkStats(s,t,n,e=0){const i=t.length;return{loaded:t,reused:n,outputs:{total:s,checked:i,reused:Math.max(0,s-i-e),covered:e}}}const Ve=new Set(["text-time","words-on-screen","text-covered","flat-frames","still-picture"]);export const plural=(s,t)=>`${String(s)} ${t}${s===1?"":"s"}`;const le=s=>ge(te("sha256").update(s).digest().readInt32BE(0));export function samplesFor(s,t,n,e){const i=new Set(s.slice(0,e)),r=le(n),c=Math.floor(t*30);for(let m=0;i.size<Math.min(e,c)&&m<e*20;m++)i.add(ne(r,0,c-1)/30);return[...i]}export function shuffled(s,t){const n=[...s],e=le(t);for(let i=n.length-1;i>0;i--){const r=ne(e,0,i),c=n[i],m=n[r];c===void 0||m===void 0||(n[i]=m,n[r]=c)}return n}export const RASTER_NOISE=3,RASTER_SPECKS=8;export function frameDifference(s,t){const n=oe(s),e=oe(t);if(n.width!==e.width||n.height!==e.height)return{max:255,pixels:Math.max(n.width*n.height,1)};let i=0,r=0;for(let c=0;c<n.data.length;c+=4){let m=0;for(let f=0;f<4;f++)m=Math.max(m,Math.abs((n.data[c+f]??0)-(e.data[c+f]??0)));m>RASTER_NOISE&&r++,m>i&&(i=m)}return{max:i,pixels:r}}export const CUT_RECHECK={most:48,every:2};export async function recheckCuts(s,t,n,e){const i=ie(t);if(i.length===0)return t;const r=CUT_RECHECK.every/n,c=new Set;for(const f of i){const a=e.find(h=>h.key===f.part);if(!a)continue;const p=t.moments.filter(h=>h.part===f.part).map(h=>h.t).sort((h,C)=>h-C),x=f.moments[0]??f.t,b=f.moments.at(-1)??f.t,v=Math.max(a.start,p.filter(h=>h<x).at(-1)??a.start),I=Math.min(a.end-1/n,p.find(h=>h>b)??a.end),E=Math.min(CUT_RECHECK.most,Math.floor((I-v)/r)+1),R=E>1?(I-v)/(E-1):0;for(let h=0;h<E;h++){const C=Math.round((v+R*h)*n)/n;p.includes(C)||c.add(C)}}if(c.size===0)return t;const m=await s.measure([...c].sort((f,a)=>f-a));return{...t,moments:[...t.moments,...m.moments].sort((f,a)=>f.t-a.t)}}export function offFrameProblems(s,t){const n=e=>`${e.toFixed(2)} s`;return ie(s).map(e=>{const i=e.moments[0]??0,r=e.moments.at(-1)??i,c=e.moments.length===1?`at ${n(i)}, the one moment measured that shows it`:`at all ${String(e.moments.length)} moments measured that show it (${i.toFixed(2)}–${n(r)})`,m=e.worst.edges.map(f=>`${String(f.px)} pixels past the ${f.side} edge`).join(" and ");return N("AK-L002",`Text goes off the frame: the frame cuts "${e.text.text.length>40?`${e.text.text.slice(0,40)}…`:e.text.text}" ${c}; its letters reach ${m} at ${t.format} (${String(Math.round(e.worst.share*100))}% of them outside). Move it inside the frame or make it smaller (fitText in a component); text that is part of a picture the frame crops on purpose (a mocked interface) goes inside an element with data-ak-picture. allyhub inspect --kind text-off-frame has each moment.`,{piece:t.piece,output:t.output,combo:t.combo,format:t.format,part:e.part,t:e.t,where:{bbox:e.worst.glyphs}})})}const de=s=>te("sha256").update(s).digest("hex");export async function determinism(s,t,n){const e=s.timeline,i=samplesFor(e.parts.map(a=>a.still),e.duration,t,n),r=new Map;for(const a of[...i].sort((p,x)=>p-x))r.set(a,await s.shot(a));const c=[];let m=0;for(const a of shuffled(i,`${t}:shuffle`)){const p=r.get(a),x=await s.shot(a);if(!p||de(x)===de(p))continue;const b=frameDifference(p,x);b.pixels>RASTER_SPECKS&&(c.push(a),m=Math.max(m,b.max))}if(c.length===0)return[];c.sort((a,p)=>a-p);const f=[...new Set(c.flatMap(a=>e.parts.filter(p=>a>=p.start&&a<p.end).map(p=>p.key)))];return[N("AK-D002",`${plural(c.length,"moment")} drew differently in order and out of order (${c.map(a=>`${a.toFixed(2)}s`).join(", ")}; pixels differ by up to ${String(m)} levels). render must depend only on t, not on state left by an earlier frame.`,{piece:s.target.piece,output:s.target.output,combo:s.target.combo,format:s.target.format,t:c[0]??0,...f.length===1&&f[0]?{part:f[0]}:{}})]}export function summarize(s){const t=Me(s);return{status:t.errors>0?"failed":t.warnings>0?"warnings":"passed",...t}}function We(s,t){const n=r=>[r.piece??"",r.output??"",r.combo?B(r.combo):"",r.format??"",r.part??"",r.where?.file??"",String(r.where?.line??0).padStart(6,"0"),r.code].join("\0"),e=n(s),i=n(t);return e<i?-1:e>i?1:0}class Xe{spent=new Map;on=process.env.ALLYHUB_CHECK_TIMINGS==="1";async time(t,n){if(!this.on)return n();const e=performance.now();try{return await n()}finally{this.spent.set(t,(this.spent.get(t)??0)+(performance.now()-e)/1e3)}}report(){if(!this.on)return;const t=[...this.spent].sort((n,e)=>e[1]-n[1]);process.stderr.write(`Check timings (s): ${t.map(([n,e])=>`${n} ${e.toFixed(2)}`).join(", ")}
3
- `)}}function Ze(s){const t=s.options,n=t.post,e=typeof n=="object"&&n!==null?n.filter:void 0;return{transparent:t.transparent===!0,deliverable:t.deliverable!==!1,...typeof t.maxDuration=="number"?{maxDuration:t.maxDuration}:{},...typeof e=="string"?{post:e}:{}}}async function et(s){let t;try{t=await be(s===void 0?{}:{ffmpeg:s})}catch(n){return{missing:`the pinned ffmpeg could not be had: ${(n instanceof Error?n.message:String(n)).split(`
4
- `)[0]??""}`}}return await ye(t)?{ffmpeg:t}:{missing:`${t} does not run`}}export async function runCheck(s){const t=new Xe,n=s.session??await t.time("prepare (discover, metadata, bundle)",()=>Pe.open({root:s.dir,...s.buildDir===void 0?{}:{buildDir:s.buildDir},...s.gpu===void 0?{}:{gpu:s.gpu},...s.consoleLimit===void 0?{}:{consoleLimit:s.consoleLimit}}));try{const e=n.prepared,i=s.samples??12,r=n.consoleLimit,c=await _e(),m=await Ce.open(e.root,await De({runtimeSha:c,samples:i,gpu:n.gpu,...r===ve?{}:{consoleLimit:r}}));let f;const a=()=>f??=et(s.ffmpeg),p=[],x=[...e.problems],b=[],v=[],I=[],E=[];let R=0,h=0;const C=[];let L;const ue=e.pieces.filter(o=>s.piece===void 0||ae({id:o.id,path:o.place},s.piece));for(const o of ue){if(!e.bundle?.chunks.entries[o.id.replaceAll("/","__")])continue;const S=Ze(o),A=o.kind,K=o.format,Y=await Ae(e,o,c);b.push(...Ke(o));const q=new Set,j=[...o.combos.filter(u=>!s.combos?.length||s.combos.some(d=>Se(u,d,U(o.matrix,u)))),...Ie(o,s.combos)],pe=new Set(o.matrix?Fe(o.matrix.space,o.dims,j):j.keys()),P=[],J=u=>{I.push(u);for(const d of u.reads?.media??[])q.add(d.path);u.timeline&&P.push({...u,timeline:u.timeline})};let z=!1;const he=(u,d,_)=>{if(s.fresh===!0)return;const l=m.get(u),k=l?.result.reads,F=l?.result.timeline;return!l||!k||!F||_&&!l.sampled||l.factless===!0&&s.facts!==!1?void 0:re(e,Y,o,d,k,F.parts.map(g=>g.key))===l.digest?l:void 0};for(const[u,d]of j.entries()){const _=U(o.matrix,d),l={piece:o.id,output:A,combo:d,format:K},k=B(d);if(v.push({...l,..._?{id:_}:{},key:k}),!pe.has(u)){h++;continue}const F=o.kind==="video"&&!z,D=Le(o.id,A,k,K),g=he(D,d,F);if(g){R++,g.sampled&&(z=!0),x.push(...g.problems),b.push(...g.facts),p.push({version:l,log:g.console}),J({...g.result,digest:g.digest}),m.set(D,g);continue}E.push(`${o.id}/${A}/${k}/${K}`);const w=await t.time("load (mount, stills)",()=>n.open(o,l));try{const $=w.summary,O=[],M=[...$?.facts??[]];let Q=!1;try{if($){const y=$.timeline;try{const T=await t.time("layout measure",()=>w.measure());O.push(...offFrameProblems(await t.time("recheck cut text",()=>recheckCuts(w,T,y.fps,y.parts)),l));const ee=await a();M.push(...await t.time("layout facts",()=>Oe(T,y,l,{root:e.root,media:e.media,ffmpeg:"ffmpeg"in ee?ee.ffmpeg:"ffmpeg"},y.profile?.label)))}catch(T){if(T instanceof me)throw T}s.facts!==!1&&M.push(...await t.time("scenery facts",()=>Je(w)))}$&&F&&(z=!0,Q=!0,O.push(...await t.time("determinism",()=>determinism(w,`${o.id}:${A}:${K}`,i))),s.facts!==!1&&!S.transparent&&M.push(...await t.time("flat frames",()=>Re(w))),s.facts!==!1&&M.push(...await t.time("still picture",()=>Be(w))),s.facts!==!1&&(M.push(...await t.time("cut seams",()=>je(w))),S.transparent||M.push(...await t.time("flash",()=>He(w))))),$&&s.facts!==!1&&M.push(...(await t.time("scenery screen fidelity",()=>Te(w))).facts)}catch(y){if(!(y instanceof me))throw y;y.kept||O.push(N("AK-P003",y.message,{piece:l.piece,output:l.output,combo:l.combo,format:l.format}))}O.push(...await w.problems());const V=ce(O);x.push(...V);const W=S.deliverable?M:M.filter(y=>!Ve.has(y.kind));b.push(...W);const X=await w.console();p.push({version:l,log:X});const H=$?re(e,Y,o,d,$.reads,$.timeline.parts.map(y=>y.key)):void 0,Z={...l,...$?{timeline:$.timeline,reads:$.reads,text:$.text}:{}};J({...Z,...H?{digest:H}:{}}),H&&m.set(D,{digest:H,result:Z,problems:V,facts:W,sampled:Q,...s.facts===!1?{factless:!0}:{},console:X})}finally{await w.close()}}if(o.kind==="video"){const u=$e(S.post,P.map(d=>d.timeline));if(u.length>0){const d=await a();"ffmpeg"in d&&x.push(...await t.time("post chains",()=>ke(u,{piece:o.id,output:A},d.ffmpeg)))}}if(o.kind!=="video")for(const u of P){const d=ze(u,e.media);d&&b.push(d)}else for(const u of j){const d=U(o.matrix,u),_=B(u),l=P.find(g=>B(g.combo)===_),k=l?Ye(l,d):Ge(o,u,d,A,K,P);if(!k)continue;if(C.push(k),o.matrix&&L===void 0){const g=await a();if("ffmpeg"in g){const w=new fe(e.root,g.ffmpeg);await w.open(),L=w}else L={missing:"ffmpeg",why:`${g.missing} (set ALLYHUB_FFMPEG to an ffmpeg, or let the runtime manager fetch its pinned one)`}}const F=await t.time("plans (loudness, music)",()=>qe(k,{...S.maxDuration===void 0?{}:{maxDuration:S.maxDuration},fps:l?.timeline.fps??P[0]?.timeline.fps??30,media:e.media,local:g=>n.mediaPath(g),...o.matrix&&L?{loudness:L}:{}}));x.push(...F.problems),b.push(...F.facts);const D=Ne(k,e.media);D&&b.push(D)}b.push(...Ue({piece:o.id},q,e.media))}for(const o of e.items)if(o.kind==="model"&&!(s.piece!==void 0&&!ae({id:o.dir,path:o.dir},s.piece)))try{await t.time("models",()=>xe(se(e.root,o.entry),{root:e.root,cache:se(e.root,we,"model"),log:()=>{}}))}catch(S){x.push(N("AK-B010",`${o.entry} does not build: ${S instanceof Error?S.message:String(S)}`,{piece:o.dir,where:{file:o.entry}}))}L instanceof fe&&await L.save(),await m.save(new Set(e.pieces.map(o=>o.id)));const G=ce(x).sort(We);return t.report(),{targets:v,check:summarize(G),problems:G,facts:await Qe(b,e.root),results:I,plans:C,stats:checkStats(v.length,E,R,h),console:Ee(r,p)}}finally{s.session||await n.close()}}
2
+ import{deckFacts as ge}from"@allyhub-next/slides-core";import{createHash as te}from"node:crypto";import{join as se}from"node:path";import{uniformInt as oe}from"pure-rand/distribution/uniformInt";import{xoroshiro128plus as we}from"pure-rand/generator/xoroshiro128plus";import{CACHE_DIR as xe}from"@allyhub-next/formats";import{buildModule as be}from"@allyhub-next/model/build";import{ffmpegOf as ye,ffmpegRuns as $e,postPlaces as ke,postProblems as Se,readPng as ne}from"@allyhub-next/render";import{comboIdOf as U,comboKey as B,comboMatches as Me,countLevels as ve,coverCombos as Fe,cutThroughout as ie,pieceNamed as ae,problem as z,CONSOLE_LIMIT as Ce}from"@allyhub-next/video-core";import{OutputCache as Le,cacheKey as De,checkerId as Ee}from"./cache.js";import{consoleOf as Ae,baseDigest as Pe,outputDigest as re,dedupe as ce,StuckError as me,CheckSession as _e,runtimeDigest as Ie,extraCombos as Te}from"@allyhub-next/project";import{matrixFacts as Ke,measuredFacts as Oe,screenFidelity as Re,flatFrames as je,cutSeams as He,flashFrames as Be,stillPicture as ze}from"@allyhub-next/measure";import{generatedFact as Ne,generatedPagedFact as Ue,mismatchFacts as Ge}from"./generated.js";import{StretchLoudness as fe,estimatePlan as Ye,loadedPlan as qe,planProblems as Je}from"./plans.js";import{sceneryLayerFacts as Qe,withBakes as Ve}from"./scenery.js";export function checkStats(s,t,o,e=0){const i=t.length;return{loaded:t,reused:o,outputs:{total:s,checked:i,reused:Math.max(0,s-i-e),covered:e}}}const We=new Set(["text-time","words-on-screen","text-covered","flat-frames","still-picture"]);export const plural=(s,t)=>`${String(s)} ${t}${s===1?"":"s"}`;const de=s=>we(te("sha256").update(s).digest().readInt32BE(0));export function samplesFor(s,t,o,e){const i=new Set(s.slice(0,e)),r=de(o),c=Math.floor(t*30);for(let f=0;i.size<Math.min(e,c)&&f<e*20;f++)i.add(oe(r,0,c-1)/30);return[...i]}export function shuffled(s,t){const o=[...s],e=de(t);for(let i=o.length-1;i>0;i--){const r=oe(e,0,i),c=o[i],f=o[r];c===void 0||f===void 0||(o[i]=f,o[r]=c)}return o}export const RASTER_NOISE=3,RASTER_SPECKS=8;export function frameDifference(s,t){const o=ne(s),e=ne(t);if(o.width!==e.width||o.height!==e.height)return{max:255,pixels:Math.max(o.width*o.height,1)};let i=0,r=0;for(let c=0;c<o.data.length;c+=4){let f=0;for(let d=0;d<4;d++)f=Math.max(f,Math.abs((o.data[c+d]??0)-(e.data[c+d]??0)));f>RASTER_NOISE&&r++,f>i&&(i=f)}return{max:i,pixels:r}}export const CUT_RECHECK={most:48,every:2};export async function recheckCuts(s,t,o,e){const i=ie(t);if(i.length===0)return t;const r=CUT_RECHECK.every/o,c=new Set;for(const d of i){const a=e.find(h=>h.key===d.part);if(!a)continue;const l=t.moments.filter(h=>h.part===d.part).map(h=>h.t).sort((h,C)=>h-C),x=d.moments[0]??d.t,b=d.moments.at(-1)??d.t,F=Math.max(a.start,l.filter(h=>h<x).at(-1)??a.start),T=Math.min(a.end-1/o,l.find(h=>h>b)??a.end),A=Math.min(CUT_RECHECK.most,Math.floor((T-F)/r)+1),R=A>1?(T-F)/(A-1):0;for(let h=0;h<A;h++){const C=Math.round((F+R*h)*o)/o;l.includes(C)||c.add(C)}}if(c.size===0)return t;const f=await s.measure([...c].sort((d,a)=>d-a));return{...t,moments:[...t.moments,...f.moments].sort((d,a)=>d.t-a.t)}}export function offFrameProblems(s,t){const o=e=>`${e.toFixed(2)} s`;return ie(s).map(e=>{const i=e.moments[0]??0,r=e.moments.at(-1)??i,c=e.moments.length===1?`at ${o(i)}, the one moment measured that shows it`:`at all ${String(e.moments.length)} moments measured that show it (${i.toFixed(2)}–${o(r)})`,f=e.worst.edges.map(l=>`${String(l.px)} pixels past the ${l.side} edge`).join(" and "),d=`"${e.text.text.length>40?`${e.text.text.slice(0,40)}…`:e.text.text}"`,a=s.deck?`Text goes off the slide: the slide's edge cuts ${d} of ${e.text.layer} on slide ${e.part}; its letters reach ${f} at ${t.format} (${String(Math.round(e.worst.share*100))}% of them outside). Move or size its shape inside the slide, or give it less text. allyhub inspect --kind text-off-frame has it.`:void 0;return z("AK-L002",a??`Text goes off the frame: the frame cuts "${e.text.text.length>40?`${e.text.text.slice(0,40)}…`:e.text.text}" ${c}; its letters reach ${f} at ${t.format} (${String(Math.round(e.worst.share*100))}% of them outside). Move it inside the frame or make it smaller (fitText in a component); text that is part of a picture the frame crops on purpose (a mocked interface) goes inside an element with data-ak-picture. allyhub inspect --kind text-off-frame has each moment.`,{piece:t.piece,output:t.output,combo:t.combo,format:t.format,part:e.part,t:e.t,where:{bbox:e.worst.glyphs}})})}const le=s=>te("sha256").update(s).digest("hex");export async function determinism(s,t,o){const e=s.timeline,i=samplesFor(e.parts.map(a=>a.still),e.duration,t,o),r=new Map;for(const a of[...i].sort((l,x)=>l-x))r.set(a,await s.shot(a));const c=[];let f=0;for(const a of shuffled(i,`${t}:shuffle`)){const l=r.get(a),x=await s.shot(a);if(!l||le(x)===le(l))continue;const b=frameDifference(l,x);b.pixels>RASTER_SPECKS&&(c.push(a),f=Math.max(f,b.max))}if(c.length===0)return[];c.sort((a,l)=>a-l);const d=[...new Set(c.flatMap(a=>e.parts.filter(l=>a>=l.start&&a<l.end).map(l=>l.key)))];return[z("AK-D002",`${plural(c.length,"moment")} drew differently in order and out of order (${c.map(a=>`${a.toFixed(2)}s`).join(", ")}; pixels differ by up to ${String(f)} levels). render must depend only on t, not on state left by an earlier frame.`,{piece:s.target.piece,output:s.target.output,combo:s.target.combo,format:s.target.format,t:c[0]??0,...d.length===1&&d[0]?{part:d[0]}:{}})]}export function summarize(s){const t=ve(s);return{status:t.errors>0?"failed":t.warnings>0?"warnings":"passed",...t}}function Xe(s,t){const o=r=>[r.piece??"",r.output??"",r.combo?B(r.combo):"",r.format??"",r.part??"",r.where?.file??"",String(r.where?.line??0).padStart(6,"0"),r.code].join("\0"),e=o(s),i=o(t);return e<i?-1:e>i?1:0}class Ze{spent=new Map;on=process.env.ALLYHUB_CHECK_TIMINGS==="1";async time(t,o){if(!this.on)return o();const e=performance.now();try{return await o()}finally{this.spent.set(t,(this.spent.get(t)??0)+(performance.now()-e)/1e3)}}report(){if(!this.on)return;const t=[...this.spent].sort((o,e)=>e[1]-o[1]);process.stderr.write(`Check timings (s): ${t.map(([o,e])=>`${o} ${e.toFixed(2)}`).join(", ")}
3
+ `)}}function et(s){const t=s.options,o=t.post,e=typeof o=="object"&&o!==null?o.filter:void 0;return{transparent:t.transparent===!0,deliverable:t.deliverable!==!1,...typeof t.maxDuration=="number"?{maxDuration:t.maxDuration}:{},...typeof e=="string"?{post:e}:{}}}async function tt(s){let t;try{t=await ye(s===void 0?{}:{ffmpeg:s})}catch(o){return{missing:`the pinned ffmpeg could not be had: ${(o instanceof Error?o.message:String(o)).split(`
4
+ `)[0]??""}`}}return await $e(t)?{ffmpeg:t}:{missing:`${t} does not run`}}export async function runCheck(s){const t=new Ze,o=s.session??await t.time("prepare (discover, metadata, bundle)",()=>_e.open({root:s.dir,...s.buildDir===void 0?{}:{buildDir:s.buildDir},...s.gpu===void 0?{}:{gpu:s.gpu},...s.consoleLimit===void 0?{}:{consoleLimit:s.consoleLimit}}));try{const e=o.prepared,i=s.samples??12,r=o.consoleLimit,c=await Ie(),f=await Le.open(e.root,await Ee({runtimeSha:c,samples:i,gpu:o.gpu,...r===Ce?{}:{consoleLimit:r}}));let d;const a=()=>d??=tt(s.ffmpeg),l=[],x=[...e.problems],b=[],F=[],T=[],A=[];let R=0,h=0;const C=[];let L;const ue=e.pieces.filter(n=>s.piece===void 0||ae({id:n.id,path:n.place},s.piece));for(const n of ue){if(!e.bundle?.chunks.entries[n.id.replaceAll("/","__")])continue;const M=et(n),P=n.kind,K=n.format,Y=await Pe(e,n,c);b.push(...Ke(n));const q=new Set,j=[...n.combos.filter(p=>!s.combos?.length||s.combos.some(u=>Me(p,u,U(n.matrix,p)))),...Te(n,s.combos)],pe=new Set(n.matrix?Fe(n.matrix.space,n.dims,j):j.keys()),_=[],J=p=>{T.push(p);for(const u of p.reads?.media??[])q.add(u.path);p.timeline&&_.push({...p,timeline:p.timeline})};let N=!1;const he=(p,u,I)=>{if(s.fresh===!0)return;const m=f.get(p),y=m?.result.reads,D=m?.result.timeline;return!m||!y||!D||I&&!m.sampled||m.factless===!0&&s.facts!==!1?void 0:re(e,Y,n,u,y)===m.digest?m:void 0};for(const[p,u]of j.entries()){const I=U(n.matrix,u),m={piece:n.id,output:P,combo:u,format:K},y=B(u);if(F.push({...m,...I?{id:I}:{},key:y}),!pe.has(p)){h++;continue}const D=n.kind==="video"&&!N,E=De(n.id,P,y,K),g=he(E,u,D);if(g){R++,g.sampled&&(N=!0),x.push(...g.problems),b.push(...g.facts),l.push({version:m,log:g.console}),J({...g.result,digest:g.digest}),f.set(E,g);continue}A.push(`${n.id}/${P}/${y}/${K}`);const w=await t.time("load (mount, stills)",()=>o.open(n,m));try{const $=w.summary,O=[],v=[...$?.facts??[]];let Q=!1;try{if($){const k=$.timeline;try{const S=await t.time("layout measure",()=>w.measure());O.push(...offFrameProblems(S.deck?S:await t.time("recheck cut text",()=>recheckCuts(w,S,k.fps,k.parts)),m));const ee=await a();v.push(...await t.time("layout facts",()=>Oe(S,k,m,{root:e.root,media:e.media,ffmpeg:"ffmpeg"in ee?ee.ffmpeg:"ffmpeg"},k.profile?.label))),S.deck&&v.push(...ge(S.deck,{width:S.width,height:S.height},{piece:m.piece,output:m.output,combo:m.combo,format:m.format}))}catch(S){if(S instanceof me)throw S}s.facts!==!1&&v.push(...await t.time("scenery facts",()=>Qe(w)))}$&&D&&(N=!0,Q=!0,O.push(...await t.time("determinism",()=>determinism(w,`${n.id}:${P}:${K}`,i))),s.facts!==!1&&!M.transparent&&v.push(...await t.time("flat frames",()=>je(w))),s.facts!==!1&&v.push(...await t.time("still picture",()=>ze(w))),s.facts!==!1&&(v.push(...await t.time("cut seams",()=>He(w))),M.transparent||v.push(...await t.time("flash",()=>Be(w))))),$&&s.facts!==!1&&v.push(...(await t.time("scenery screen fidelity",()=>Re(w))).facts)}catch(k){if(!(k instanceof me))throw k;k.kept||O.push(z("AK-P003",k.message,{piece:m.piece,output:m.output,combo:m.combo,format:m.format}))}O.push(...await w.problems());const V=ce(O);x.push(...V);const W=M.deliverable?v:v.filter(k=>!We.has(k.kind));b.push(...W);const X=await w.console();l.push({version:m,log:X});const H=$?re(e,Y,n,u,$.reads):void 0,Z={...m,...$?{timeline:$.timeline,reads:$.reads,text:$.text}:{}};J({...Z,...H?{digest:H}:{}}),H&&f.set(E,{digest:H,result:Z,problems:V,facts:W,sampled:Q,...s.facts===!1?{factless:!0}:{},console:X})}finally{await w.close()}}if(n.kind==="video"){const p=ke(M.post,_.map(u=>u.timeline));if(p.length>0){const u=await a();"ffmpeg"in u&&x.push(...await t.time("post chains",()=>Se(p,{piece:n.id,output:P},u.ffmpeg)))}}if(n.kind!=="video")for(const p of _){const u=Ue(p,e.media);u&&b.push(u)}else for(const p of j){const u=U(n.matrix,p),I=B(p),m=_.find(g=>B(g.combo)===I),y=m?qe(m,u):Ye(n,p,u,P,K,_);if(!y)continue;if(C.push(y),n.matrix&&L===void 0){const g=await a();if("ffmpeg"in g){const w=new fe(e.root,g.ffmpeg);await w.open(),L=w}else L={missing:"ffmpeg",why:`${g.missing} (set ALLYHUB_FFMPEG to an ffmpeg, or let the runtime manager fetch its pinned one)`}}const D=await t.time("plans (loudness, music)",()=>Je(y,{...M.maxDuration===void 0?{}:{maxDuration:M.maxDuration},fps:m?.timeline.fps??_[0]?.timeline.fps??30,media:e.media,local:g=>o.mediaPath(g),...n.matrix&&L?{loudness:L}:{}}));x.push(...D.problems),b.push(...D.facts);const E=Ne(y,e.media);E&&b.push(E)}b.push(...Ge({piece:n.id},q,e.media))}for(const n of e.items)if(n.kind==="model"&&!(s.piece!==void 0&&!ae({id:n.dir,path:n.dir},s.piece)))try{await t.time("models",()=>be(se(e.root,n.entry),{root:e.root,cache:se(e.root,xe,"model"),log:()=>{}}))}catch(M){x.push(z("AK-B010",`${n.entry} does not build: ${M instanceof Error?M.message:String(M)}`,{piece:n.dir,where:{file:n.entry}}))}L instanceof fe&&await L.save(),await f.save(new Set(e.pieces.map(n=>n.id)));const G=ce(x).sort(Xe);return t.report(),{targets:F,check:summarize(G),problems:G,facts:await Ve(b,e.root),results:T,plans:C,stats:checkStats(F.length,A,R,h),console:Ae(r,l)}}finally{s.session||await o.close()}}
@@ -11,7 +11,7 @@ export declare function secondsOf(uses: readonly GeneratedUse[]): number;
11
11
  * it uses none.
12
12
  */
13
13
  export declare function generatedFact(plan: ComboPlan, media: Media): Fact | undefined;
14
- /** The generated media a paged output's pages read, by page. Undefined when there is none. */
14
+ /** The generated media a deck's slides read, by slide. Undefined when there is none. */
15
15
  export declare function generatedPagedFact(r: OutputResult, media: Media): Fact | undefined;
16
16
  /**
17
17
  * The records among these files that do not hold for the file beside
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/check",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- export{cloudConfig,hostsText}from"./config.js";export{CloudError,notSignedIn,SIGN_IN}from"./errors.js";export{Cloud,scrub}from"./client.js";export{SignedOut,accessOf,accountOf,authServer,chooseOrganization,forgetCredentials,readCredentials,signInWithCode,signInWithDevice,signOut,writeCredentials}from"./credentials.js";export{SIGN_IN_WAIT_MS,openBrowser,signIn,signInByEmail,signInDevice,signInInBackground,signedInAs}from"./signin.js";export{LoopbackError,startLoopback}from"./loopback.js";export{pkcePair,randomState}from"./pkce.js";export{accessToken,billingSummary,browserLink,organizations}from"./token.js";export{CATALOG_CACHE_SECONDS,findTool,loadCatalog}from"./catalog.js";export{POLL_SECONDS,READ_SECONDS,RETRY_SECONDS,WAIT_SECONDS,callTool,resumeJob}from"./call.js";export{REUSE_LEFT_MS,UPLOAD_CONCURRENCY,UPLOAD_TYPES,uploadFiles,urlExpiry,withKnownUploads}from"./uploads.js";export{BASE64_FROM,LARGE_FROM,canonical,genRecord,inputHash,isSecretName,namedFile,readGen,recordInput,recordOutput,toolWords,withoutSignature,writeGen,writeWords}from"./records.js";export{makeSay,sayInput}from"./voice.js";
2
+ export{cloudConfig,hostsText}from"./config.js";export{CloudError,notSignedIn,SIGN_IN}from"./errors.js";export{Cloud,scrub}from"./client.js";export{SignedOut,accessOf,accountOf,authServer,chooseOrganization,forgetCredentials,readCredentials,signInWithCode,signInWithDevice,signOut,writeCredentials}from"./credentials.js";export{SIGN_IN_WAIT_MS,openBrowser,signIn,signInByEmail,signInDevice,signInInBackground,signedInAs}from"./signin.js";export{LoopbackError,startLoopback}from"./loopback.js";export{pkcePair,randomState}from"./pkce.js";export{billingSummary,browserLink,organizations}from"./token.js";export{CATALOG_CACHE_SECONDS,findTool,loadCatalog}from"./catalog.js";export{POLL_SECONDS,READ_SECONDS,RETRY_SECONDS,WAIT_SECONDS,callTool,resumeJob}from"./call.js";export{REUSE_LEFT_MS,UPLOAD_CONCURRENCY,UPLOAD_TYPES,uploadFiles,urlExpiry,withKnownUploads}from"./uploads.js";export{BASE64_FROM,LARGE_FROM,canonical,genRecord,inputHash,isSecretName,namedFile,readGen,recordInput,recordOutput,toolWords,withoutSignature,writeGen,writeWords}from"./records.js";export{makeSay,sayInput}from"./voice.js";
@@ -1,4 +1,4 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{spawn as k}from"node:child_process";import{mkdtemp as j,open as E,readFile as u,rename as O,rm as g,writeFile as T}from"node:fs/promises";import{tmpdir as b}from"node:os";import{join as c}from"node:path";import{fileURLToPath as N}from"node:url";import{CLIENT_ID as P,EXIT as m,SCOPES as R}from"@allyhub-next/protocol";import{accessOf as v,authServer as L,SignedOut as $,signInWithCode as D,signInWithDevice as W}from"./credentials.js";import{CloudError as w,unreachable as f}from"./errors.js";import{LoopbackError as J,startLoopback as h}from"./loopback.js";import{pkcePair as A,randomState as B}from"./pkce.js";const C="idp_hint";export const SIGN_IN_WAIT_MS=5*6e4;const F=3e4;function p(){return{state:B(),...A()}}async function y(t,i,o,n={}){const e=await L(t),r=new URLSearchParams({response_type:"code",client_id:P,redirect_uri:o,scope:R,state:i.state,code_challenge:i.challenge,code_challenge_method:"S256",resource:t.url});return n.with!==void 0&&r.set(C,n.with),n.email!==void 0&&r.set("login_hint",n.email),`${e.authorization_endpoint}?${r.toString()}`}export function openBrowser(t,i){if(i.BROWSER==="none")return;const[o,n]=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd",["/c","start","",t]]:["xdg-open",[t]];try{const e=k(o,n,{stdio:"ignore",detached:!0});e.on("error",()=>{}),e.unref()}catch{}}export async function signedInAs(t){try{return(await v(t.config))?.credentials.account}catch(i){if(i instanceof $)return;throw f(t.url,i)}}const S=t=>new w(t instanceof J?t.code:"sign-in-failed",t instanceof Error?t.message:String(t),{exit:m.auth,hint:"Run allyhub auth login again."});async function I(t,i,o){let n;try{n=await o.result}catch(r){throw S(r)}let e;try{e=(await D(t,{code:n,codeVerifier:i.verifier,redirectUri:o.redirectUri})).account}catch(r){const a=S(r);throw await o.finish(a),a}return await o.finish(),e}const x=t=>`${t.url}/signed-in`;export async function signIn(t,i,o=SIGN_IN_WAIT_MS,n={}){const e=p(),r=await h({state:e.state,timeoutMs:o,landing:x(t.config)});try{i(await y(t.config,e,r.redirectUri,n))}catch(a){throw await r.close(),f(t.url,a)}return I(t.config,e,r)}export async function signInByEmail(t,i,o,n=SIGN_IN_WAIT_MS){const e=t.config,r=p(),a=await h({state:r.state,timeoutMs:n,landing:x(e)});try{const s=await y(e,r,a.redirectUri),d=await e.fetch(`${e.url}/api/auth/sign-in/magic-link`,{method:"POST",headers:{"content-type":"application/json",origin:e.url},body:JSON.stringify({email:i,callbackURL:s})});if(!d.ok)throw new w("sign-in-failed",`AllyHub did not send the link (${String(d.status)}): ${(await d.text()).slice(0,300)}`,{exit:m.auth,status:d.status});await d.body?.cancel()}catch(s){throw await a.close(),s instanceof w?s:f(t.url,s)}return o(),I(e,r,a)}export async function signInDevice(t,i,o){try{return(await W(t.config,i,o)).account}catch(n){throw S(n)}}const M=N(new URL("./signin-worker.js",import.meta.url));export async function signInInBackground(t,i,o=SIGN_IN_WAIT_MS){const n=p(),e=await j(c(b(),"allyhub-sign-in-"));await T(c(e,"flow.json"),JSON.stringify({flow:n,timeoutMs:o}),{mode:384});const r=await E(c(e,"worker.log"),"w"),a=k(process.execPath,[M,e],{detached:!0,stdio:["ignore","ignore",r.fd],env:{...i}});await r.close();const s={exited:!1};a.once("exit",()=>{s.exited=!0}),a.unref();const d=Date.now()+F;for(;Date.now()<d;)try{const l=JSON.parse(await u(c(e,"ready.json"),"utf8"));return await y(t.config,n,l.redirectUri)}catch(l){if(l instanceof Error&&!("code"in l))throw f(t.url,l);if(s.exited)break;await new Promise(U=>setTimeout(U,50))}const _=(await u(c(e,"worker.log"),"utf8").catch(()=>"")).trim().split(`
2
+ import{spawn as k}from"node:child_process";import{mkdtemp as j,open as E,readFile as u,rename as O,rm as m,writeFile as T}from"node:fs/promises";import{tmpdir as b}from"node:os";import{join as c}from"node:path";import{fileURLToPath as N}from"node:url";import{CLIENT_ID as R,EXIT as g,SCOPES as L}from"@allyhub-next/protocol";import{accessOf as P,authServer as v,SignedOut as $,signInWithCode as D,signInWithDevice as W}from"./credentials.js";import{nodeCommand as C}from"@allyhub-next/runtimes/node";import{CloudError as f,unreachable as w}from"./errors.js";import{LoopbackError as J,startLoopback as p}from"./loopback.js";import{pkcePair as A,randomState as B}from"./pkce.js";const F="idp_hint";export const SIGN_IN_WAIT_MS=5*6e4;const M=3e4;function h(){return{state:B(),...A()}}async function y(t,i,o,n={}){const e=await v(t),r=new URLSearchParams({response_type:"code",client_id:R,redirect_uri:o,scope:L,state:i.state,code_challenge:i.challenge,code_challenge_method:"S256",resource:t.url});return n.with!==void 0&&r.set(F,n.with),n.email!==void 0&&r.set("login_hint",n.email),`${e.authorization_endpoint}?${r.toString()}`}export function openBrowser(t,i){if(i.BROWSER==="none")return;const[o,n]=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd",["/c","start","",t]]:["xdg-open",[t]];try{const e=k(o,n,{stdio:"ignore",detached:!0});e.on("error",()=>{}),e.unref()}catch{}}export async function signedInAs(t){try{return(await P(t.config))?.credentials.account}catch(i){if(i instanceof $)return;throw w(t.url,i)}}const S=t=>new f(t instanceof J?t.code:"sign-in-failed",t instanceof Error?t.message:String(t),{exit:g.auth,hint:"Run allyhub auth login again."});async function I(t,i,o){let n;try{n=await o.result}catch(r){throw S(r)}let e;try{e=(await D(t,{code:n,codeVerifier:i.verifier,redirectUri:o.redirectUri})).account}catch(r){const a=S(r);throw await o.finish(a),a}return await o.finish(),e}const _=t=>`${t.url}/signed-in`;export async function signIn(t,i,o=SIGN_IN_WAIT_MS,n={}){const e=h(),r=await p({state:e.state,timeoutMs:o,landing:_(t.config)});try{i(await y(t.config,e,r.redirectUri,n))}catch(a){throw await r.close(),w(t.url,a)}return I(t.config,e,r)}export async function signInByEmail(t,i,o,n=SIGN_IN_WAIT_MS){const e=t.config,r=h(),a=await p({state:r.state,timeoutMs:n,landing:_(e)});try{const s=await y(e,r,a.redirectUri),d=await e.fetch(`${e.url}/api/auth/sign-in/magic-link`,{method:"POST",headers:{"content-type":"application/json",origin:e.url},body:JSON.stringify({email:i,callbackURL:s})});if(!d.ok)throw new f("sign-in-failed",`AllyHub did not send the link (${String(d.status)}): ${(await d.text()).slice(0,300)}`,{exit:g.auth,status:d.status});await d.body?.cancel()}catch(s){throw await a.close(),s instanceof f?s:w(t.url,s)}return o(),I(e,r,a)}export async function signInDevice(t,i,o){try{return(await W(t.config,i,o)).account}catch(n){throw S(n)}}const z=N(new URL("./signin-worker.js",import.meta.url));export async function signInInBackground(t,i,o=SIGN_IN_WAIT_MS){const n=h(),e=await j(c(b(),"allyhub-sign-in-"));await T(c(e,"flow.json"),JSON.stringify({flow:n,timeoutMs:o}),{mode:384});const r=await E(c(e,"worker.log"),"w"),a=k(C(i),[z,e],{detached:!0,stdio:["ignore","ignore",r.fd],env:{...i}});await r.close();const s={exited:!1};a.once("exit",()=>{s.exited=!0}),a.unref();const d=Date.now()+M;for(;Date.now()<d;)try{const l=JSON.parse(await u(c(e,"ready.json"),"utf8"));return await y(t.config,n,l.redirectUri)}catch(l){if(l instanceof Error&&!("code"in l))throw w(t.url,l);if(s.exited)break;await new Promise(U=>setTimeout(U,50))}const x=(await u(c(e,"worker.log"),"utf8").catch(()=>"")).trim().split(`
3
3
  `).slice(-5).join(`
4
- `);throw await g(e,{recursive:!0,force:!0}),new w("sign-in-failed",_?`The sign-in listener did not start: ${_}`:"The sign-in listener did not start.",{exit:m.platform})}export async function serveSignIn(t,i){const{flow:o,timeoutMs:n}=JSON.parse(await u(c(i,"flow.json"),"utf8"));await g(c(i,"flow.json"),{force:!0});const e=await h({state:o.state,timeoutMs:n,landing:x(t)});await T(c(i,"ready.json.tmp"),JSON.stringify({redirectUri:e.redirectUri})),await O(c(i,"ready.json.tmp"),c(i,"ready.json"));try{await I(t,o,e)}finally{await new Promise(r=>setTimeout(r,200)),await g(i,{recursive:!0,force:!0})}}
4
+ `);throw await m(e,{recursive:!0,force:!0}),new f("sign-in-failed",x?`The sign-in listener did not start: ${x}`:"The sign-in listener did not start.",{exit:g.platform})}export async function serveSignIn(t,i){const{flow:o,timeoutMs:n}=JSON.parse(await u(c(i,"flow.json"),"utf8"));await m(c(i,"flow.json"),{force:!0});const e=await p({state:o.state,timeoutMs:n,landing:_(t)});await T(c(i,"ready.json.tmp"),JSON.stringify({redirectUri:e.redirectUri})),await O(c(i,"ready.json.tmp"),c(i,"ready.json"));try{await I(t,o,e)}finally{await new Promise(r=>setTimeout(r,200)),await m(i,{recursive:!0,force:!0})}}
@@ -1,2 +1,2 @@
1
1
  /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
- import{BILLING_SUMMARY_PATH as r,BROWSER_LINK_PATH as a,BillingSummarySchema as t,BrowserLinkSchema as i,ORGANIZATIONS_PATH as c,OrganizationsSchema as s}from"@allyhub-next/protocol";import{accessOf as u}from"./credentials.js";import{notSignedIn as m}from"./errors.js";export async function accessToken(n){const e=n.config.apiKey;if(e)return{accessToken:e,source:"env"};const o=await u(n.config).catch(()=>{});if(!o)throw m();return{accessToken:o.token,expiresAt:o.expiresAt,account:o.credentials.account,source:"oauth"}}export async function billingSummary(n){return t.parse(await n.json(r))}export async function organizations(n){return s.parse(await n.json(c)).organizations}export async function browserLink(n,e){return i.parse(await n.json(a,{method:"POST",body:{to:e}})).url}
2
+ import{BILLING_SUMMARY_PATH as a,BROWSER_LINK_PATH as o,BillingSummarySchema as i,BrowserLinkSchema as t,ORGANIZATIONS_PATH as e,OrganizationsSchema as s}from"@allyhub-next/protocol";export async function billingSummary(n){return i.parse(await n.json(a))}export async function organizations(n){return s.parse(await n.json(e)).organizations}export async function browserLink(n,r){return t.parse(await n.json(o,{method:"POST",body:{to:r}})).url}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/cloud",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allyhub-next/components",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/index.ts",