@allyhub/sdk 0.1.0-alpha.8 → 0.2.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/LICENSE.md +241 -0
  2. package/NOTICE +85 -0
  3. package/client.d.ts +45 -1
  4. package/dist/anim.js +2 -75
  5. package/dist/define.d.ts +10 -4
  6. package/dist/define.js +2 -95
  7. package/dist/dom.d.ts +1 -1
  8. package/dist/dom.js +2 -457
  9. package/dist/fit.js +2 -60
  10. package/dist/free.d.ts +18 -0
  11. package/dist/free.js +2 -0
  12. package/dist/index.d.ts +28 -13
  13. package/dist/index.js +2 -11
  14. package/dist/input.d.ts +306 -0
  15. package/dist/input.js +2 -0
  16. package/dist/media.d.ts +3 -6
  17. package/dist/media.js +2 -27
  18. package/dist/messages.d.ts +3 -2
  19. package/dist/messages.js +2 -2
  20. package/dist/module.d.ts +24 -0
  21. package/dist/module.js +2 -0
  22. package/dist/noise.js +2 -233
  23. package/dist/parts.d.ts +98 -22
  24. package/dist/parts.js +2 -414
  25. package/dist/paths.d.ts +1 -1
  26. package/dist/paths.js +2 -720
  27. package/dist/phone.d.ts +26 -0
  28. package/dist/phone.js +2 -0
  29. package/dist/piece.d.ts +106 -35
  30. package/dist/piece.js +2 -38
  31. package/dist/props.d.ts +1 -1
  32. package/dist/props.js +2 -35
  33. package/dist/scenery.d.ts +2 -0
  34. package/dist/scenery.js +2 -0
  35. package/dist/text.js +2 -38
  36. package/dist/written.d.ts +12 -0
  37. package/dist/written.js +2 -0
  38. package/docs/README.md +18 -0
  39. package/docs/batches.md +148 -0
  40. package/docs/contract.md +51 -0
  41. package/docs/defaults.md +703 -0
  42. package/docs/docs.md +148 -0
  43. package/docs/footage.md +249 -0
  44. package/docs/layers.md +317 -0
  45. package/docs/modeling.md +143 -0
  46. package/docs/project.md +265 -0
  47. package/docs/scenery.md +308 -0
  48. package/docs/sheets.md +119 -0
  49. package/docs/slides.md +111 -0
  50. package/docs/sound.md +170 -0
  51. package/docs/speech.md +289 -0
  52. package/docs/video.md +265 -0
  53. package/node_modules/@allyhub-next/audio/LICENSE +241 -0
  54. package/node_modules/@allyhub-next/audio/dist/at-cut.d.ts +52 -0
  55. package/node_modules/@allyhub-next/audio/dist/at-cut.js +2 -0
  56. package/node_modules/@allyhub-next/audio/dist/decode.d.ts +33 -0
  57. package/node_modules/@allyhub-next/audio/dist/decode.js +2 -0
  58. package/node_modules/@allyhub-next/audio/dist/envelope.d.ts +37 -0
  59. package/node_modules/@allyhub-next/audio/dist/envelope.js +2 -0
  60. package/node_modules/@allyhub-next/audio/dist/index.d.ts +17 -0
  61. package/node_modules/@allyhub-next/audio/dist/index.js +2 -0
  62. package/node_modules/@allyhub-next/audio/dist/levels.d.ts +97 -0
  63. package/node_modules/@allyhub-next/audio/dist/levels.js +2 -0
  64. package/node_modules/@allyhub-next/audio/dist/master.d.ts +29 -0
  65. package/node_modules/@allyhub-next/audio/dist/master.js +2 -0
  66. package/node_modules/@allyhub-next/audio/dist/music.d.ts +11 -0
  67. package/node_modules/@allyhub-next/audio/dist/music.js +2 -0
  68. package/node_modules/@allyhub-next/audio/dist/node/decode.d.ts +39 -0
  69. package/node_modules/@allyhub-next/audio/dist/node/decode.js +2 -0
  70. package/node_modules/@allyhub-next/audio/dist/node/ebur128.d.ts +25 -0
  71. package/node_modules/@allyhub-next/audio/dist/node/ebur128.js +2 -0
  72. package/node_modules/@allyhub-next/audio/dist/node/ffmpeg.d.ts +31 -0
  73. package/node_modules/@allyhub-next/audio/dist/node/ffmpeg.js +2 -0
  74. package/node_modules/@allyhub-next/audio/dist/node/index.d.ts +8 -0
  75. package/node_modules/@allyhub-next/audio/dist/node/index.js +2 -0
  76. package/node_modules/@allyhub-next/audio/dist/node/loudness.d.ts +18 -0
  77. package/node_modules/@allyhub-next/audio/dist/node/loudness.js +2 -0
  78. package/node_modules/@allyhub-next/audio/dist/node/master.d.ts +42 -0
  79. package/node_modules/@allyhub-next/audio/dist/node/master.js +2 -0
  80. package/node_modules/@allyhub-next/audio/dist/node/measure.d.ts +60 -0
  81. package/node_modules/@allyhub-next/audio/dist/node/measure.js +2 -0
  82. package/node_modules/@allyhub-next/audio/dist/node/mix.d.ts +31 -0
  83. package/node_modules/@allyhub-next/audio/dist/node/mix.js +2 -0
  84. package/node_modules/@allyhub-next/audio/dist/plan.d.ts +143 -0
  85. package/node_modules/@allyhub-next/audio/dist/plan.js +2 -0
  86. package/node_modules/@allyhub-next/audio/dist/recorded.d.ts +26 -0
  87. package/node_modules/@allyhub-next/audio/dist/recorded.js +2 -0
  88. package/node_modules/@allyhub-next/audio/dist/recording/bandwidth.d.ts +47 -0
  89. package/node_modules/@allyhub-next/audio/dist/recording/bandwidth.js +2 -0
  90. package/node_modules/@allyhub-next/audio/dist/recording/chain.d.ts +89 -0
  91. package/node_modules/@allyhub-next/audio/dist/recording/chain.js +2 -0
  92. package/node_modules/@allyhub-next/audio/dist/recording/dynamics.d.ts +64 -0
  93. package/node_modules/@allyhub-next/audio/dist/recording/dynamics.js +2 -0
  94. package/node_modules/@allyhub-next/audio/dist/recording/fft.d.ts +26 -0
  95. package/node_modules/@allyhub-next/audio/dist/recording/fft.js +2 -0
  96. package/node_modules/@allyhub-next/audio/dist/recording/filters.d.ts +42 -0
  97. package/node_modules/@allyhub-next/audio/dist/recording/filters.js +2 -0
  98. package/node_modules/@allyhub-next/audio/dist/recording/fit.d.ts +56 -0
  99. package/node_modules/@allyhub-next/audio/dist/recording/fit.js +2 -0
  100. package/node_modules/@allyhub-next/audio/dist/recording/index.d.ts +10 -0
  101. package/node_modules/@allyhub-next/audio/dist/recording/index.js +2 -0
  102. package/node_modules/@allyhub-next/audio/dist/recording/loudness.d.ts +12 -0
  103. package/node_modules/@allyhub-next/audio/dist/recording/loudness.js +2 -0
  104. package/node_modules/@allyhub-next/audio/dist/recording/measure.d.ts +67 -0
  105. package/node_modules/@allyhub-next/audio/dist/recording/measure.js +2 -0
  106. package/node_modules/@allyhub-next/audio/dist/recording/mic.d.ts +32 -0
  107. package/node_modules/@allyhub-next/audio/dist/recording/mic.js +2 -0
  108. package/node_modules/@allyhub-next/audio/dist/recording/noise.d.ts +27 -0
  109. package/node_modules/@allyhub-next/audio/dist/recording/noise.js +2 -0
  110. package/node_modules/@allyhub-next/audio/dist/recording/presets.d.ts +64 -0
  111. package/node_modules/@allyhub-next/audio/dist/recording/presets.js +2 -0
  112. package/node_modules/@allyhub-next/audio/dist/recording/room.d.ts +78 -0
  113. package/node_modules/@allyhub-next/audio/dist/recording/room.js +2 -0
  114. package/node_modules/@allyhub-next/audio/dist/recording/setup.d.ts +111 -0
  115. package/node_modules/@allyhub-next/audio/dist/recording/setup.js +2 -0
  116. package/node_modules/@allyhub-next/audio/dist/recording/vec.d.ts +3 -0
  117. package/node_modules/@allyhub-next/audio/dist/recording/vec.js +2 -0
  118. package/node_modules/@allyhub-next/audio/dist/render.d.ts +26 -0
  119. package/node_modules/@allyhub-next/audio/dist/render.js +2 -0
  120. package/node_modules/@allyhub-next/audio/dist/sfx.d.ts +10 -0
  121. package/node_modules/@allyhub-next/audio/dist/sfx.js +2 -0
  122. package/node_modules/@allyhub-next/audio/dist/shape.d.ts +118 -0
  123. package/node_modules/@allyhub-next/audio/dist/shape.js +2 -0
  124. package/node_modules/@allyhub-next/audio/dist/voice.d.ts +45 -0
  125. package/node_modules/@allyhub-next/audio/dist/voice.js +2 -0
  126. package/node_modules/@allyhub-next/audio/package.json +17 -0
  127. package/node_modules/@allyhub-next/formats/LICENSE +241 -0
  128. package/node_modules/@allyhub-next/formats/dist/data/comments.d.ts +94 -0
  129. package/node_modules/@allyhub-next/formats/dist/data/comments.js +2 -0
  130. package/node_modules/@allyhub-next/formats/dist/data/config.d.ts +10 -0
  131. package/node_modules/@allyhub-next/formats/dist/data/config.js +2 -0
  132. package/node_modules/@allyhub-next/formats/dist/data/edits.d.ts +28 -0
  133. package/node_modules/@allyhub-next/formats/dist/data/edits.js +2 -0
  134. package/node_modules/@allyhub-next/formats/dist/data/elements.d.ts +6 -0
  135. package/node_modules/@allyhub-next/formats/dist/data/elements.js +2 -0
  136. package/node_modules/@allyhub-next/formats/dist/data/faces.d.ts +38 -0
  137. package/node_modules/@allyhub-next/formats/dist/data/faces.js +2 -0
  138. package/node_modules/@allyhub-next/formats/dist/data/file.d.ts +11 -0
  139. package/node_modules/@allyhub-next/formats/dist/data/file.js +2 -0
  140. package/node_modules/@allyhub-next/formats/dist/data/gen.d.ts +31 -0
  141. package/node_modules/@allyhub-next/formats/dist/data/gen.js +2 -0
  142. package/node_modules/@allyhub-next/formats/dist/data/messages.d.ts +34 -0
  143. package/node_modules/@allyhub-next/formats/dist/data/messages.js +2 -0
  144. package/node_modules/@allyhub-next/formats/dist/data/reference.d.ts +676 -0
  145. package/node_modules/@allyhub-next/formats/dist/data/reference.js +2 -0
  146. package/node_modules/@allyhub-next/formats/dist/data/script.d.ts +37 -0
  147. package/node_modules/@allyhub-next/formats/dist/data/script.js +2 -0
  148. package/node_modules/@allyhub-next/formats/dist/data/sheet.d.ts +214 -0
  149. package/node_modules/@allyhub-next/formats/dist/data/sheet.js +2 -0
  150. package/node_modules/@allyhub-next/formats/dist/data/words.d.ts +25 -0
  151. package/node_modules/@allyhub-next/formats/dist/data/words.js +2 -0
  152. package/node_modules/@allyhub-next/formats/dist/index.d.ts +16 -0
  153. package/node_modules/@allyhub-next/formats/dist/index.js +2 -0
  154. package/node_modules/@allyhub-next/formats/dist/items.d.ts +94 -0
  155. package/node_modules/@allyhub-next/formats/dist/items.js +2 -0
  156. package/node_modules/@allyhub-next/formats/dist/layout.d.ts +50 -0
  157. package/node_modules/@allyhub-next/formats/dist/layout.js +5 -0
  158. package/node_modules/@allyhub-next/formats/dist/schemas.d.ts +301 -0
  159. package/node_modules/@allyhub-next/formats/dist/schemas.js +2 -0
  160. package/node_modules/@allyhub-next/formats/package.json +14 -0
  161. package/node_modules/@allyhub-next/protocol/LICENSE +241 -0
  162. package/node_modules/@allyhub-next/protocol/dist/app.d.ts +98 -0
  163. package/node_modules/@allyhub-next/protocol/dist/app.js +2 -0
  164. package/node_modules/@allyhub-next/protocol/dist/auth.d.ts +116 -0
  165. package/node_modules/@allyhub-next/protocol/dist/auth.js +2 -0
  166. package/node_modules/@allyhub-next/protocol/dist/cli.d.ts +59 -0
  167. package/node_modules/@allyhub-next/protocol/dist/cli.js +2 -0
  168. package/node_modules/@allyhub-next/protocol/dist/cloud.d.ts +274 -0
  169. package/node_modules/@allyhub-next/protocol/dist/cloud.js +2 -0
  170. package/node_modules/@allyhub-next/protocol/dist/editor.d.ts +405 -0
  171. package/node_modules/@allyhub-next/protocol/dist/editor.js +2 -0
  172. package/node_modules/@allyhub-next/protocol/dist/files.d.ts +101 -0
  173. package/node_modules/@allyhub-next/protocol/dist/files.js +2 -0
  174. package/node_modules/@allyhub-next/protocol/dist/index.d.ts +12 -0
  175. package/node_modules/@allyhub-next/protocol/dist/index.js +2 -0
  176. package/node_modules/@allyhub-next/protocol/dist/jsonrpc.d.ts +83 -0
  177. package/node_modules/@allyhub-next/protocol/dist/jsonrpc.js +2 -0
  178. package/node_modules/@allyhub-next/protocol/dist/registry.d.ts +53 -0
  179. package/node_modules/@allyhub-next/protocol/dist/registry.js +2 -0
  180. package/node_modules/@allyhub-next/protocol/dist/runtimes.d.ts +93 -0
  181. package/node_modules/@allyhub-next/protocol/dist/runtimes.js +2 -0
  182. package/node_modules/@allyhub-next/protocol/dist/teams.d.ts +67 -0
  183. package/node_modules/@allyhub-next/protocol/dist/teams.js +2 -0
  184. package/node_modules/@allyhub-next/protocol/dist/tools.d.ts +345 -0
  185. package/node_modules/@allyhub-next/protocol/dist/tools.js +2 -0
  186. package/node_modules/@allyhub-next/protocol/package.json +13 -0
  187. package/node_modules/@allyhub-next/runtimes/LICENSE +241 -0
  188. package/node_modules/@allyhub-next/runtimes/dist/bundled.d.ts +10 -0
  189. package/node_modules/@allyhub-next/runtimes/dist/bundled.js +2 -0
  190. package/node_modules/@allyhub-next/runtimes/dist/download.d.ts +15 -0
  191. package/node_modules/@allyhub-next/runtimes/dist/download.js +2 -0
  192. package/node_modules/@allyhub-next/runtimes/dist/errors.d.ts +16 -0
  193. package/node_modules/@allyhub-next/runtimes/dist/errors.js +2 -0
  194. package/node_modules/@allyhub-next/runtimes/dist/home.d.ts +2 -0
  195. package/node_modules/@allyhub-next/runtimes/dist/home.js +2 -0
  196. package/node_modules/@allyhub-next/runtimes/dist/index.d.ts +9 -0
  197. package/node_modules/@allyhub-next/runtimes/dist/index.js +2 -0
  198. package/node_modules/@allyhub-next/runtimes/dist/lock.d.ts +6 -0
  199. package/node_modules/@allyhub-next/runtimes/dist/lock.js +2 -0
  200. package/node_modules/@allyhub-next/runtimes/dist/manifest.d.ts +3 -0
  201. package/node_modules/@allyhub-next/runtimes/dist/manifest.js +2 -0
  202. package/node_modules/@allyhub-next/runtimes/dist/runtimes.d.ts +63 -0
  203. package/node_modules/@allyhub-next/runtimes/dist/runtimes.js +3 -0
  204. package/node_modules/@allyhub-next/runtimes/dist/unpack.d.ts +7 -0
  205. package/node_modules/@allyhub-next/runtimes/dist/unpack.js +2 -0
  206. package/node_modules/@allyhub-next/runtimes/manifest.json +395 -0
  207. package/node_modules/@allyhub-next/runtimes/package.json +14 -0
  208. package/node_modules/@allyhub-next/runtimes/schemas/runtimes.schema.json +153 -0
  209. package/node_modules/@allyhub-next/scenery/LICENSE +241 -0
  210. package/node_modules/@allyhub-next/scenery/NOTICE +42 -0
  211. package/node_modules/@allyhub-next/scenery/dist/aim.d.ts +55 -0
  212. package/node_modules/@allyhub-next/scenery/dist/aim.js +2 -0
  213. package/node_modules/@allyhub-next/scenery/dist/bake.d.ts +203 -0
  214. package/node_modules/@allyhub-next/scenery/dist/bake.js +2 -0
  215. package/node_modules/@allyhub-next/scenery/dist/camera.d.ts +150 -0
  216. package/node_modules/@allyhub-next/scenery/dist/camera.js +2 -0
  217. package/node_modules/@allyhub-next/scenery/dist/curve.d.ts +40 -0
  218. package/node_modules/@allyhub-next/scenery/dist/curve.js +2 -0
  219. package/node_modules/@allyhub-next/scenery/dist/define.d.ts +164 -0
  220. package/node_modules/@allyhub-next/scenery/dist/define.js +2 -0
  221. package/node_modules/@allyhub-next/scenery/dist/fit.d.ts +64 -0
  222. package/node_modules/@allyhub-next/scenery/dist/fit.js +2 -0
  223. package/node_modules/@allyhub-next/scenery/dist/glass.d.ts +34 -0
  224. package/node_modules/@allyhub-next/scenery/dist/glass.js +2 -0
  225. package/node_modules/@allyhub-next/scenery/dist/handheld.d.ts +184 -0
  226. package/node_modules/@allyhub-next/scenery/dist/handheld.js +2 -0
  227. package/node_modules/@allyhub-next/scenery/dist/hull.d.ts +23 -0
  228. package/node_modules/@allyhub-next/scenery/dist/hull.js +2 -0
  229. package/node_modules/@allyhub-next/scenery/dist/index.d.ts +22 -0
  230. package/node_modules/@allyhub-next/scenery/dist/index.js +2 -0
  231. package/node_modules/@allyhub-next/scenery/dist/lens.d.ts +48 -0
  232. package/node_modules/@allyhub-next/scenery/dist/lens.js +2 -0
  233. package/node_modules/@allyhub-next/scenery/dist/moire.d.ts +136 -0
  234. package/node_modules/@allyhub-next/scenery/dist/moire.js +93 -0
  235. package/node_modules/@allyhub-next/scenery/dist/motion.d.ts +48 -0
  236. package/node_modules/@allyhub-next/scenery/dist/motion.js +2 -0
  237. package/node_modules/@allyhub-next/scenery/dist/move.d.ts +260 -0
  238. package/node_modules/@allyhub-next/scenery/dist/move.js +2 -0
  239. package/node_modules/@allyhub-next/scenery/dist/noise.d.ts +41 -0
  240. package/node_modules/@allyhub-next/scenery/dist/noise.js +2 -0
  241. package/node_modules/@allyhub-next/scenery/dist/phone.d.ts +34 -0
  242. package/node_modules/@allyhub-next/scenery/dist/phone.js +2 -0
  243. package/node_modules/@allyhub-next/scenery/dist/report.d.ts +677 -0
  244. package/node_modules/@allyhub-next/scenery/dist/report.js +2 -0
  245. package/node_modules/@allyhub-next/scenery/dist/screen-focus.d.ts +55 -0
  246. package/node_modules/@allyhub-next/scenery/dist/screen-focus.js +2 -0
  247. package/node_modules/@allyhub-next/scenery/dist/screen.d.ts +71 -0
  248. package/node_modules/@allyhub-next/scenery/dist/screen.js +2 -0
  249. package/node_modules/@allyhub-next/scenery/dist/solve.d.ts +82 -0
  250. package/node_modules/@allyhub-next/scenery/dist/solve.js +2 -0
  251. package/node_modules/@allyhub-next/scenery/dist/timing.d.ts +26 -0
  252. package/node_modules/@allyhub-next/scenery/dist/timing.js +2 -0
  253. package/node_modules/@allyhub-next/scenery/dist/vec.d.ts +19 -0
  254. package/node_modules/@allyhub-next/scenery/dist/vec.js +2 -0
  255. package/node_modules/@allyhub-next/scenery/package.json +13 -0
  256. package/node_modules/@allyhub-next/video-core/LICENSE +241 -0
  257. package/node_modules/@allyhub-next/video-core/dist/anchors.d.ts +164 -0
  258. package/node_modules/@allyhub-next/video-core/dist/anchors.js +2 -0
  259. package/node_modules/@allyhub-next/video-core/dist/audio-types.d.ts +148 -0
  260. package/node_modules/@allyhub-next/video-core/dist/audio-types.js +2 -0
  261. package/node_modules/@allyhub-next/video-core/dist/backdrop.d.ts +87 -0
  262. package/node_modules/@allyhub-next/video-core/dist/backdrop.js +2 -0
  263. package/node_modules/@allyhub-next/video-core/dist/captions.d.ts +122 -0
  264. package/node_modules/@allyhub-next/video-core/dist/captions.js +11 -0
  265. package/node_modules/@allyhub-next/video-core/dist/console.d.ts +91 -0
  266. package/node_modules/@allyhub-next/video-core/dist/console.js +2 -0
  267. package/node_modules/@allyhub-next/video-core/dist/contrast.d.ts +98 -0
  268. package/node_modules/@allyhub-next/video-core/dist/contrast.js +2 -0
  269. package/node_modules/@allyhub-next/video-core/dist/cut-report.d.ts +77 -0
  270. package/node_modules/@allyhub-next/video-core/dist/cut-report.js +2 -0
  271. package/node_modules/@allyhub-next/video-core/dist/edit.d.ts +77 -0
  272. package/node_modules/@allyhub-next/video-core/dist/edit.js +13 -0
  273. package/node_modules/@allyhub-next/video-core/dist/edits.d.ts +163 -0
  274. package/node_modules/@allyhub-next/video-core/dist/edits.js +2 -0
  275. package/node_modules/@allyhub-next/video-core/dist/export.d.ts +96 -0
  276. package/node_modules/@allyhub-next/video-core/dist/export.js +2 -0
  277. package/node_modules/@allyhub-next/video-core/dist/fact.d.ts +965 -0
  278. package/node_modules/@allyhub-next/video-core/dist/fact.js +2 -0
  279. package/node_modules/@allyhub-next/video-core/dist/footage-motion.d.ts +168 -0
  280. package/node_modules/@allyhub-next/video-core/dist/footage-motion.js +2 -0
  281. package/node_modules/@allyhub-next/video-core/dist/formats.d.ts +240 -0
  282. package/node_modules/@allyhub-next/video-core/dist/formats.js +2 -0
  283. package/node_modules/@allyhub-next/video-core/dist/gen.d.ts +37 -0
  284. package/node_modules/@allyhub-next/video-core/dist/gen.js +2 -0
  285. package/node_modules/@allyhub-next/video-core/dist/index.d.ts +40 -0
  286. package/node_modules/@allyhub-next/video-core/dist/index.js +2 -0
  287. package/node_modules/@allyhub-next/video-core/dist/look.d.ts +66 -0
  288. package/node_modules/@allyhub-next/video-core/dist/look.js +2 -0
  289. package/node_modules/@allyhub-next/video-core/dist/marks.d.ts +34 -0
  290. package/node_modules/@allyhub-next/video-core/dist/marks.js +2 -0
  291. package/node_modules/@allyhub-next/video-core/dist/matrix.d.ts +289 -0
  292. package/node_modules/@allyhub-next/video-core/dist/matrix.js +2 -0
  293. package/node_modules/@allyhub-next/video-core/dist/measure.d.ts +465 -0
  294. package/node_modules/@allyhub-next/video-core/dist/measure.js +5 -0
  295. package/node_modules/@allyhub-next/video-core/dist/media.d.ts +226 -0
  296. package/node_modules/@allyhub-next/video-core/dist/media.js +2 -0
  297. package/node_modules/@allyhub-next/video-core/dist/messages.d.ts +88 -0
  298. package/node_modules/@allyhub-next/video-core/dist/messages.js +2 -0
  299. package/node_modules/@allyhub-next/video-core/dist/motion.d.ts +56 -0
  300. package/node_modules/@allyhub-next/video-core/dist/motion.js +2 -0
  301. package/node_modules/@allyhub-next/video-core/dist/music.d.ts +110 -0
  302. package/node_modules/@allyhub-next/video-core/dist/music.js +2 -0
  303. package/node_modules/@allyhub-next/video-core/dist/piece.d.ts +1146 -0
  304. package/node_modules/@allyhub-next/video-core/dist/piece.js +2 -0
  305. package/node_modules/@allyhub-next/video-core/dist/placement.d.ts +37 -0
  306. package/node_modules/@allyhub-next/video-core/dist/placement.js +2 -0
  307. package/node_modules/@allyhub-next/video-core/dist/problem.d.ts +262 -0
  308. package/node_modules/@allyhub-next/video-core/dist/problem.js +2 -0
  309. package/node_modules/@allyhub-next/video-core/dist/render-types.d.ts +49 -0
  310. package/node_modules/@allyhub-next/video-core/dist/render-types.js +2 -0
  311. package/node_modules/@allyhub-next/video-core/dist/schema.d.ts +352 -0
  312. package/node_modules/@allyhub-next/video-core/dist/schema.js +2 -0
  313. package/node_modules/@allyhub-next/video-core/dist/script-edit.d.ts +176 -0
  314. package/node_modules/@allyhub-next/video-core/dist/script-edit.js +2 -0
  315. package/node_modules/@allyhub-next/video-core/dist/script.d.ts +67 -0
  316. package/node_modules/@allyhub-next/video-core/dist/script.js +2 -0
  317. package/node_modules/@allyhub-next/video-core/dist/seams.d.ts +214 -0
  318. package/node_modules/@allyhub-next/video-core/dist/seams.js +2 -0
  319. package/node_modules/@allyhub-next/video-core/dist/slides.d.ts +37 -0
  320. package/node_modules/@allyhub-next/video-core/dist/slides.js +2 -0
  321. package/node_modules/@allyhub-next/video-core/dist/sound-under.d.ts +72 -0
  322. package/node_modules/@allyhub-next/video-core/dist/sound-under.js +2 -0
  323. package/node_modules/@allyhub-next/video-core/dist/speech.d.ts +83 -0
  324. package/node_modules/@allyhub-next/video-core/dist/speech.js +5 -0
  325. package/node_modules/@allyhub-next/video-core/dist/timeline.d.ts +616 -0
  326. package/node_modules/@allyhub-next/video-core/dist/timeline.js +2 -0
  327. package/node_modules/@allyhub-next/video-core/dist/timing.d.ts +88 -0
  328. package/node_modules/@allyhub-next/video-core/dist/timing.js +2 -0
  329. package/node_modules/@allyhub-next/video-core/dist/transcript.d.ts +288 -0
  330. package/node_modules/@allyhub-next/video-core/dist/transcript.js +2 -0
  331. package/node_modules/@allyhub-next/video-core/dist/transition.d.ts +289 -0
  332. package/node_modules/@allyhub-next/video-core/dist/transition.js +2 -0
  333. package/node_modules/@allyhub-next/video-core/dist/voice.d.ts +175 -0
  334. package/node_modules/@allyhub-next/video-core/dist/voice.js +2 -0
  335. package/node_modules/@allyhub-next/video-core/dist/words.d.ts +128 -0
  336. package/node_modules/@allyhub-next/video-core/dist/words.js +2 -0
  337. package/node_modules/@allyhub-next/video-core/package.json +14 -0
  338. package/package.json +52 -41
  339. package/README.md +0 -17
  340. package/dist/anim.d.ts.map +0 -1
  341. package/dist/anim.js.map +0 -1
  342. package/dist/define.d.ts.map +0 -1
  343. package/dist/define.js.map +0 -1
  344. package/dist/dom.d.ts.map +0 -1
  345. package/dist/dom.js.map +0 -1
  346. package/dist/fit.d.ts.map +0 -1
  347. package/dist/fit.js.map +0 -1
  348. package/dist/index.d.ts.map +0 -1
  349. package/dist/index.js.map +0 -1
  350. package/dist/media.d.ts.map +0 -1
  351. package/dist/media.js.map +0 -1
  352. package/dist/messages.d.ts.map +0 -1
  353. package/dist/messages.js.map +0 -1
  354. package/dist/noise.d.ts.map +0 -1
  355. package/dist/noise.js.map +0 -1
  356. package/dist/parts.d.ts.map +0 -1
  357. package/dist/parts.js.map +0 -1
  358. package/dist/paths.d.ts.map +0 -1
  359. package/dist/paths.js.map +0 -1
  360. package/dist/piece.d.ts.map +0 -1
  361. package/dist/piece.js.map +0 -1
  362. package/dist/props.d.ts.map +0 -1
  363. package/dist/props.js.map +0 -1
  364. package/dist/text.d.ts.map +0 -1
  365. package/dist/text.js.map +0 -1
@@ -0,0 +1,111 @@
1
+ import type { CompressorOptions, DeesserOptions } from "./dynamics.js";
2
+ import type { FilterSpec } from "./filters.js";
3
+ import type { Pattern } from "./mic.js";
4
+ import type { NoiseShape } from "./noise.js";
5
+ import type { Vec3 } from "./vec.js";
6
+ /** The setups a voice can be recorded with, by name. */
7
+ export declare const VOICE_SETUPS: readonly ["studio", "phone", "lav"];
8
+ export type VoiceSetup = (typeof VOICE_SETUPS)[number];
9
+ /** The rooms, by name. */
10
+ export declare const ROOMS: readonly ["bedroom", "living-room", "office", "kitchen", "treated", "car", "outdoor"];
11
+ export type RoomName = (typeof ROOMS)[number];
12
+ /** The finishing chains, by name. */
13
+ export declare const POSTS: readonly ["finish", "phone-app"];
14
+ export type PostName = (typeof POSTS)[number];
15
+ /** A surface's absorption by octave band (125 Hz to 8 kHz), or a material's name. */
16
+ export type Surface = string | readonly number[];
17
+ /** A room: a box, its surfaces, and where the talker stands in it. */
18
+ export interface RoomOptions {
19
+ /** A named room whose values fill what is not given. */
20
+ preset?: RoomName;
21
+ /** Width, height and depth, m. */
22
+ size?: Vec3;
23
+ /** The walls', the floor's and the ceiling's absorption. */
24
+ walls?: Surface;
25
+ floor?: Surface;
26
+ ceiling?: Surface;
27
+ /**
28
+ * The reverberation time at 500 Hz–1 kHz, s: the surfaces' absorption
29
+ * is scaled until the room has it (Eyring), keeping their shape over
30
+ * the bands.
31
+ */
32
+ rt60?: number;
33
+ /** The talker's mouth in the room, m from its corner (x across, y up, z along); they face +z. */
34
+ talker?: Vec3;
35
+ }
36
+ /** The room's own sound under the voice. */
37
+ export interface NoiseOptions extends Partial<NoiseShape> {
38
+ /** Its loudness under the voice's, LU. */
39
+ below?: number;
40
+ }
41
+ /** The finishing after the recording. */
42
+ export interface PostOptions {
43
+ /** A named chain whose values fill what is not given. */
44
+ preset?: PostName;
45
+ /** A high-pass, Hz; false: none. */
46
+ highpass?: number | false;
47
+ /** Equalizer bands, after the high-pass. */
48
+ eq?: readonly FilterSpec[];
49
+ /** A de-esser; its threshold is dB over the voice's loudness. */
50
+ deess?: Partial<DeesserOptions> | false;
51
+ /** A compressor; its threshold is dB over the voice's loudness. */
52
+ compress?: Partial<CompressorOptions> | false;
53
+ }
54
+ /** A phone's automatic gain: its target is dB over the voice's loudness. */
55
+ export interface AgcSettings {
56
+ target?: number;
57
+ most?: number;
58
+ attack?: number;
59
+ release?: number;
60
+ /** The speech's level it follows is over this many seconds. */
61
+ window?: number;
62
+ /** Under this (dB under the voice's loudness) the gain holds: a pause is not lifted. */
63
+ gate?: number;
64
+ }
65
+ /** `voice`: a setup's name, or one with changes; false: the voice as it is. */
66
+ export interface VoiceOptions {
67
+ /** The setup whose values fill what is not given; default studio. */
68
+ setup?: VoiceSetup;
69
+ /**
70
+ * What recorded the dry voice already: its microphone's pattern and its
71
+ * distance (a TTS voice: a studio's cardioid 0.2 m away). Proximity is
72
+ * what this setup adds over that one's.
73
+ */
74
+ source?: {
75
+ pattern?: Pattern;
76
+ distance?: number;
77
+ };
78
+ /** The microphone's pattern. */
79
+ pattern?: Pattern;
80
+ /** Mouth to microphone, m. */
81
+ distance?: number;
82
+ /** How far the microphone is round from where the talker faces, degrees. */
83
+ angle?: number;
84
+ /** How far below the mouth it is, degrees. */
85
+ below?: number;
86
+ /** The microphone's own response: [Hz, dB] points, linear in log frequency. */
87
+ response?: readonly (readonly [number, number])[];
88
+ /** The band it records, Hz: under the first and over the second it falls away. */
89
+ band?: readonly [number, number];
90
+ /** Two microphones this far apart, m (a phone's), each its own room; false: one. */
91
+ stereo?: number | false;
92
+ /** The room; false: none (as a studio's dry voice). */
93
+ room?: RoomName | RoomOptions | false;
94
+ /** The room's own sound; false: none. */
95
+ noise?: NoiseOptions | false;
96
+ /** The device's automatic gain; false: none. */
97
+ agc?: AgcSettings | false;
98
+ /** The finishing; false: none. */
99
+ post?: PostName | PostOptions | false;
100
+ /**
101
+ * More microphones that heard the same voice, mixed in at `gain` dB (a
102
+ * phone left recording beside a desk microphone). The finishing is the
103
+ * first's, on the sum.
104
+ */
105
+ also?: readonly (Omit<VoiceOptions, "also" | "post"> & {
106
+ gain?: number;
107
+ })[];
108
+ }
109
+ /** What a piece or a part says: a setup, its changes, or false. */
110
+ export type VoiceSetting = VoiceSetup | VoiceOptions | false;
111
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export const VOICE_SETUPS=["studio","phone","lav"],ROOMS=["bedroom","living-room","office","kitchen","treated","car","outdoor"],POSTS=["finish","phone-app"];
@@ -0,0 +1,3 @@
1
+ /** A point or a direction in a room, metres: x across, y up, z along. */
2
+ export type Vec3 = readonly [number, number, number];
3
+ //# sourceMappingURL=vec.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export{};
@@ -0,0 +1,26 @@
1
+ import { type SoundOf } from "./decode.js";
2
+ import type { MixPlan, SfxPlay, Stereo } from "./plan.js";
3
+ /**
4
+ * A sound effect's samples as it plays: its file's (or the built-in
5
+ * sound's), shaped and levelled. A shaped file sits at the mix's sfx
6
+ * level by its loudness as shaped; a shaped built-in sound keeps the
7
+ * level it had.
8
+ */
9
+ export declare function playSfx(x: SfxPlay, src: Stereo, rate: number): {
10
+ src: Stereo;
11
+ gainDb: number;
12
+ };
13
+ export interface RenderOptions {
14
+ /** The speech alone, as recorded, for measuring it. */
15
+ only?: "voice";
16
+ }
17
+ /**
18
+ * Renders a plan to a stereo mix at `rate`, before mastering: each
19
+ * recording group's speech summed and recorded through its setting, then
20
+ * turned by the parts' speech gains; speech played as it is and footage
21
+ * sound, each a stretch of its file at its place with 10 ms fades at each
22
+ * cut; the music as the film plays it; the sound effects. A file `sound`
23
+ * does not have is left out.
24
+ */
25
+ export declare function renderMix(plan: MixPlan, sound: SoundOf, rate: number, o?: RenderOptions): Stereo;
26
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ import{clipSource as x}from"./decode.js";import{equalPower as z,gainAt as A}from"./envelope.js";import{playMusic as B}from"./music.js";import{shapes as C,shapeSound as H,soundLevel as q}from"./shape.js";import{synthSfx as J}from"./sfx.js";import{playVoice as K,voiceGroups as N}from"./voice.js";function Q(o,r,n){if(r.length===0)return;const s=o[0].length;for(let i=0;i<s;i++){const t=10**(A(r,i/n)/20);t!==1&&(o[0][i]=(o[0][i]??0)*t,o[1][i]=(o[1][i]??0)*t)}}function E(o,r,n,s,i,t){const m=Math.round(n.dur*s),y=Math.round(n.at*s),v=10**(n.gainDb/20),p=Math.min(Math.round(.01*s),Math.floor(m/4)),e=l=>l===void 0||l<=0?0:Math.min(Math.round(l*s),Math.floor(m/2)),f=e(n.fadeIn),a=e(n.fadeOut),c=(l,g)=>g>0?z(l/g):p>0&&l<p?l/p:1,u=[...n.envelope??[]],b=o[0].length,h=r[0].length,d=i===void 0?n.speed??1:1,S=i===void 0?n.from*s:n.from/i*s;for(let l=0;l<m;l++){const g=y+l;if(g<0||g>=b)continue;const F=d===1?Math.round(S)+l:S+l*d,M=Math.floor(F);if(M<0||M>=h)continue;const I=F-M,O=Math.min(M+1,h-1),w=g/s,V=u.length>0||t.length>0?10**((A(u,w)+A(t,w))/20):1,j=v*V*c(l,f)*c(m-1-l,a);for(let D=0;D<2;D++){const G=r[D]??r[0],L=G[M]??0,k=G[O]??0,P=o[D]??o[0];P[g]=(P[g]??0)+(L+(k-L)*I)*j}}}export function playSfx(o,r,n){if(!o.shape||!(C(o.shape)||o.shape.filter!==void 0))return{src:r,gainDb:o.gainDb};const s=q(r,n)?.lufs,i=[Float32Array.from(r[0]),Float32Array.from(r[1])];H(i,o.shape,n,0);const t=q(i,n)?.lufs;return t===void 0?{src:i,gainDb:o.gainDb}:o.level?{src:i,gainDb:o.level.target-t+o.level.gainDb}:{src:i,gainDb:o.gainDb+(s===void 0?0:s-t)}}function R(o,r,n){const s=J(o,r,n);return[s,s]}export function renderMix(o,r,n,s={}){const i=Math.round(o.duration*n),t=[new Float32Array(i),new Float32Array(i)],m=o.speechGain??[],y=x(r),{groups:v,dry:p}=N(o);for(const e of v){const[f,a]=K(e,o.duration,n,y);Q([f,a],m,n);for(let c=0;c<i;c++)t[0][c]=(t[0][c]??0)+(f[c]??0),t[1][c]=(t[1][c]??0)+(a[c]??0)}for(const e of p){const f=y(e);f&&E(t,f.src,e,n,f.stretched,m)}if(s.only==="voice")return t;for(const e of o.footage){const f=r(e.file,{});f&&E(t,f.src,e,n,void 0,[])}if(o.music){const e=o.music,f=r(e.file,e.shape?.filter?{filter:e.shape.filter}:{});if(f){const[a,c]=B(e,f.src,o.duration,n);for(let u=0;u<i;u++)t[0][u]=(t[0][u]??0)+(a[u]??0),t[1][u]=(t[1][u]??0)+(c[u]??0)}}for(const e of o.sfx){let f;if(e.file!==void 0?f=r(e.file,e.shape?.filter?{filter:e.shape.filter}:{})?.src:f=R(e.sound,n,e.seed),!f)continue;const a=playSfx(e,f,n),c=10**(a.gainDb/20),u=Math.round(e.at*n),b=a.src[0].length;for(let h=0;h<b;h++){const d=u+h;d<0||d>=i||(t[0][d]=(t[0][d]??0)+(a.src[0][h]??0)*c,t[1][d]=(t[1][d]??0)+(a.src[1][h]??0)*c)}}return t}
@@ -0,0 +1,10 @@
1
+ /** Where the transient of each built-in sound is, so it lands on the cue. */
2
+ export declare const SFX_HIT: Record<string, number>;
3
+ /** FNV-1a: a stable 32-bit seed from text. */
4
+ export declare function hashSeed(text: string): number;
5
+ /**
6
+ * A built-in sound as mono samples at `rate`, peak about −14 dBFS (so the
7
+ * sum stays under the voice). Deterministic for a seed.
8
+ */
9
+ export declare function synthSfx(sound: string, rate: number, seed: number): Float32Array<ArrayBuffer>;
10
+ //# sourceMappingURL=sfx.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ export const SFX_HIT={whoosh:.18,tick:.004,pop:.01};export function hashSeed(o){let n=2166136261;for(let t=0;t<o.length;t++)n^=o.charCodeAt(t),n=Math.imul(n,16777619)>>>0;return n}function v(o){let n=o>>>0;return()=>{n=n+1831565813>>>0;let t=n;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}}export function synthSfx(o,n,t){const r=v(t),p=()=>r()*2-1,u=.2;if(o==="tick"){const e=Math.round(n*.06),h=new Float32Array(e);for(let s=0;s<e;s++){const c=s/n,a=Math.exp(-c*90);h[s]=(Math.sin(2*Math.PI*3200*c)*.8+p()*.2)*a}return f(h,u*.7)}if(o==="pop"){const e=Math.round(n*.12),h=new Float32Array(e);let s=0;for(let c=0;c<e;c++){const a=c/n,M=300+600*Math.exp(-a*40);s+=2*Math.PI*M/n;const g=Math.min(1,a/.002)*Math.exp(-a*35);h[c]=Math.sin(s)*g}return f(h,u)}const d=.55,x=Math.round(n*d),m=new Float32Array(x),i=SFX_HIT.whoosh??.18;let w=0,l=0;for(let e=0;e<x;e++){const h=e/n,s=400+2600*Math.exp(-(((h-i)/.12)**2)),c=2*Math.sin(Math.PI*s/n),a=p()-w-.7*l;l+=c*a,w+=c*l;const M=h<i?(h/i)**2:Math.exp(-((h-i)/(d-i))*4);m[e]=l*M}return f(m,u)}function f(o,n){let t=0;for(const r of o)t=Math.max(t,Math.abs(r));if(t>0)for(let r=0;r<o.length;r++)o[r]=(o[r]??0)/t*n;return o}
@@ -0,0 +1,118 @@
1
+ import { type FilterSpec } from "./recording/filters.js";
2
+ /** The kinds of band an equalizer has, as the cookbook names them. */
3
+ export declare const BAND_TYPES: readonly ["highpass", "lowpass", "bandpass", "peak", "lowshelf", "highshelf"];
4
+ export type BandType = (typeof BAND_TYPES)[number];
5
+ /**
6
+ * A band's values from a moment of the film on: `at` is the moment (the
7
+ * music's own reference: film seconds, an anchor, a part or a word in a
8
+ * part), and what it leaves out is the band's own value.
9
+ */
10
+ export interface BandKey<T = SoundMoment> {
11
+ at: T;
12
+ hz?: number;
13
+ db?: number;
14
+ q?: number;
15
+ }
16
+ /**
17
+ * One band of an equalizer: a pass (`highpass`, `lowpass`, `bandpass`,
18
+ * with its `q`, default a Butterworth's 0.707), a `peak` (`db` at `hz`,
19
+ * `q` default 1) or a shelf (`lowshelf`, `highshelf`: `db` under or over
20
+ * `hz`, `q` the shelf's slope, default 1). `keys` move its values over
21
+ * the film's clock (music only).
22
+ */
23
+ export interface EqBand<T = SoundMoment> {
24
+ type: BandType;
25
+ hz: number;
26
+ db?: number;
27
+ q?: number;
28
+ keys?: BandKey<T>[];
29
+ }
30
+ /**
31
+ * A compressor: from `threshold` dB over the stem's loudness (its
32
+ * integrated loudness as shaped so far: 0 is at it, -6 six dB under), the
33
+ * level over it is divided by `ratio`.
34
+ */
35
+ export interface SoundCompressor {
36
+ threshold: number;
37
+ /** Input dB over the threshold per output dB; default 2. */
38
+ ratio?: number;
39
+ /** The knee's width, dB; default 6. */
40
+ knee?: number;
41
+ /** Seconds to go down, and to come back up; defaults 0.01 and 0.15. */
42
+ attack?: number;
43
+ release?: number;
44
+ /** The detector's window, seconds (0: the peak); default 0.01. */
45
+ window?: number;
46
+ }
47
+ /** A compressor's defaults: a gentle glue on a whole stem. */
48
+ export declare const COMPRESS_DEFAULTS: {
49
+ readonly ratio: 2;
50
+ readonly knee: 6;
51
+ readonly attack: 0.01;
52
+ readonly release: 0.15;
53
+ readonly window: 0.01;
54
+ };
55
+ /** How a stem is shaped (`music: { filter, eq, compress }`, a sound's own). */
56
+ export interface SoundShape<T = SoundMoment> {
57
+ /**
58
+ * An ffmpeg audio filter chain run on the file as it is decoded, on the
59
+ * file's own clock ("acompressor=ratio=3,deesser"): one chain, nothing
60
+ * that reads files, makes sound of its own or changes the timing.
61
+ */
62
+ filter?: string;
63
+ /** Equalizer bands, in order. */
64
+ eq?: EqBand<T>[];
65
+ /** A compressor after the bands. */
66
+ compress?: SoundCompressor;
67
+ }
68
+ /**
69
+ * A moment of the film a video-level option names: film seconds, an
70
+ * anchor of any part ("@drop", "@drop+0.2", "@/drop") or a part's key
71
+ * (its start), or a word reference in a part (`{ part, at }`: `at` as a
72
+ * layer's at, from that part's start).
73
+ */
74
+ export type SoundMoment = number | string | {
75
+ part: string;
76
+ at: number | string;
77
+ };
78
+ /** A shape whose bands do not move (a sound effect's). */
79
+ export type FixedShape = Omit<SoundShape, "eq"> & {
80
+ eq?: Omit<EqBand, "keys">[];
81
+ };
82
+ /** A shape resolved for the mix: its keys at film seconds. */
83
+ export type ResolvedShape = SoundShape<number>;
84
+ /**
85
+ * Why a sound's filter chain cannot be used, or undefined when it can: one
86
+ * linear chain of audio filters, none that reads or names files, listens,
87
+ * loads plugins, makes sound of its own (a random source would differ from
88
+ * render to render) or changes the timing (the music's beat and the
89
+ * film's clock would part).
90
+ */
91
+ export declare function soundFilterProblem(chain: string): string | undefined;
92
+ /**
93
+ * What is wrong with a shape, or nothing. `keyed`: its bands may move
94
+ * over time (the music's; a sound effect's are fixed).
95
+ */
96
+ export declare function shapeProblem(shape: unknown, keyed?: boolean): string | undefined;
97
+ /** A band's values at film time t: its own, moved by its keys (frequency on a log scale). */
98
+ export declare function bandAt(band: EqBand<number>, t: number): FilterSpec;
99
+ /**
100
+ * Shapes a sound's channels in place with its bands and compressor (its
101
+ * `filter` was run when it was decoded). `start` is the film second of
102
+ * the first sample, for bands that move. Deterministic: the same samples
103
+ * every time, here and in the player.
104
+ */
105
+ export declare function shapeSound(channels: readonly Float32Array[], shape: ResolvedShape | undefined, rate: number, start?: number): void;
106
+ /**
107
+ * How loud a sound is, LUFS, and how it was measured: its integrated
108
+ * loudness (BS.1770, gated), or, where that cannot be measured (shorter
109
+ * than one 0.4 s block, or all under the gate), its K-weighted level over
110
+ * its whole length ("level"). Undefined for digital silence.
111
+ */
112
+ export declare function soundLevel(channels: readonly Float32Array[], rate: number): {
113
+ lufs: number;
114
+ by: "integrated" | "level";
115
+ } | undefined;
116
+ /** Whether a shape does anything in JavaScript (bands or a compressor). */
117
+ export declare const shapes: (s: SoundShape<unknown> | undefined) => boolean;
118
+ //# sourceMappingURL=shape.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ import{compress as z}from"./recording/dynamics.js";import{biquad as k,runBiquads as $}from"./recording/filters.js";import{integratedLoudness as v,steadyLoudness as S}from"./recording/loudness.js";export const BAND_TYPES=["highpass","lowpass","bandpass","peak","lowshelf","highshelf"],COMPRESS_DEFAULTS={ratio:2,knee:6,attack:.01,release:.15,window:.01};const j={movie:"reads files",amovie:"reads files",sendcmd:"reads files",asendcmd:"reads files",zmq:"listens on the network",azmq:"listens on the network",ladspa:"loads plugins",lv2:"loads plugins",lrc:"reads files",arnndn:"reads files (its model)",sofalizer:"reads files",afir:"takes a second input",amix:"takes several inputs",amerge:"takes several inputs",join:"takes several inputs",asplit:"makes several outputs",anoisesrc:"makes sound of its own",aevalsrc:"makes sound of its own",sine:"makes sound of its own",atempo:"changes the timing (a take's speed is take().speed())",asetrate:"changes the timing",asetpts:"changes the timing",atrim:"changes the timing (play stretches with music.play)",areverse:"changes the timing",aloop:"changes the timing (loop with music.loop)",apad:"changes the timing",adelay:"changes the timing",apulsator:"changes the timing",silenceremove:"changes the timing",loudnorm:"rides the level over time with a window of its own (level the stem with mix, compress with compress)"};export function soundFilterProblem(e){if(typeof e!="string"||e.trim()==="")return'A filter is an ffmpeg audio filter chain, such as "highpass=f=80,acompressor=ratio=3"';const i=e.replace(/'[^']*'/g,"''").replace(/\\./g,"");if(/[;[\]]/.test(i))return"A sound's filter is one chain of filters separated by commas: no ; and no [labels]";for(const t of i.split(",")){const o=/^\s*([A-Za-z0-9_]+)/.exec(t)?.[1];if(!o)return`"${t.trim()}" is not a filter`;const n=j[o.toLowerCase()];if(n)return`The filter ${o} cannot be used on a sound: it ${n}`}if(/(?:^|[:=@])\s*\w*file(?:name)?\s*=/i.test(i))return"A sound's filter cannot name files (…file= options)"}const A=e=>typeof e=="number"&&Number.isFinite(e)||typeof e=="string"&&e.trim()!==""||typeof e=="object"&&e!==null&&typeof e.part=="string"&&(typeof e.at=="number"||typeof e.at=="string"),p=(e,i,t)=>typeof e=="number"&&Number.isFinite(e)&&e>=i&&e<=t;function x(e,i){if(typeof e!="object"||e===null)return"a band is { type, hz, db?, q? }";const t=e,o=Object.keys(t).filter(r=>!["type","hz","db","q","keys"].includes(r));if(o.length>0)return`a band has no ${o.join(", ")}`;if(!BAND_TYPES.includes(t.type))return`a band's type is one of ${BAND_TYPES.join(", ")}, not ${JSON.stringify(t.type)}`;const n=(r,l)=>{if(r.hz!==void 0&&!p(r.hz,10,24e3))return`${l}hz is a frequency from 10 to 24000 Hz, not ${JSON.stringify(r.hz)}`;if(r.db!==void 0&&!p(r.db,-60,24))return`${l}db is dB from -60 to 24, not ${JSON.stringify(r.db)}`;if(r.q!==void 0&&!p(r.q,.05,40))return`${l}q is from 0.05 to 40, not ${JSON.stringify(r.q)}`};if(t.hz===void 0)return"a band has a frequency, hz";const a=n(t,"");if(a)return a;const s=t.type;if((s==="peak"||s==="lowshelf"||s==="highshelf")&&t.db===void 0)return`a ${s} band has its gain, db`;const f=t.keys;if(f!==void 0){if(!i)return"only the music's bands move over time (keys)";if(!Array.isArray(f)||f.length===0)return"keys is a list of { at, hz?, db?, q? }";for(const[r,l]of f.entries()){if(typeof l!="object"||l===null)return`keys[${String(r)}] is { at, hz?, db?, q? }`;const c=l,h=Object.keys(c).filter(u=>!["at","hz","db","q"].includes(u));if(h.length>0)return`keys[${String(r)}] has no ${h.join(", ")}`;if(!A(c.at))return`keys[${String(r)}].at is a moment: film seconds, an anchor ("@drop"), a part's key, or { part, at }`;const d=n(c,`keys[${String(r)}].`);if(d)return d}}}export function shapeProblem(e,i=!1){if(typeof e!="object"||e===null||Array.isArray(e))return"a shape is { filter?, eq?, compress? }";const t=e;if(t.filter!==void 0){const n=soundFilterProblem(t.filter);if(n)return n}if(t.eq!==void 0){if(!Array.isArray(t.eq))return"eq is a list of bands, { type, hz, db?, q? }";for(const[n,a]of t.eq.entries()){const s=x(a,i);if(s)return`eq[${String(n)}]: ${s}`}}const o=t.compress;if(o!==void 0){if(typeof o!="object"||o===null)return"compress is { threshold, ratio?, knee?, attack?, release?, window? }";const n=o,a=Object.keys(n).filter(s=>!["threshold","ratio","knee","attack","release","window"].includes(s));if(a.length>0)return`compress has no ${a.join(", ")}`;if(!p(n.threshold,-60,24))return"compress.threshold is dB over the stem's loudness, from -60 to 24";if(n.ratio!==void 0&&!p(n.ratio,1,100))return"compress.ratio is from 1 to 100";if(n.knee!==void 0&&!p(n.knee,0,40))return"compress.knee is dB from 0 to 40";for(const s of["attack","release","window"])if(n[s]!==void 0&&!p(n[s],0,10))return`compress.${s} is seconds from 0 to 10`}}export function bandAt(e,i){const t=e.keys??[];let o=e.hz,n=e.db??0,a=e.q;if(t.length>0){const s=[...t].sort((d,u)=>d.at-u.at),f=(d,u)=>d[u]??(u==="hz"?e.hz:u==="db"?e.db??0:e.q),r=s[0],l=s.at(-1);let c=r,h=r;if(r&&i<=r.at)c=r,h=r;else if(l&&i>=l.at)c=l,h=l;else for(let d=1;d<s.length;d++){const u=s[d];if(u&&i<u.at){c=s[d-1],h=u;break}}if(c&&h){const d=h.at===c.at?1:(i-c.at)/(h.at-c.at),u=f(c,"hz")??e.hz,y=f(h,"hz")??e.hz;o=u===y||d<=0?u:d>=1?y:Math.exp(Math.log(u)+(Math.log(y)-Math.log(u))*d);const b=f(c,"db")??0,q=f(h,"db")??0;n=b+(q-b)*d;const m=f(c,"q"),g=f(h,"q");a=m===void 0||g===void 0?m??g:m+(g-m)*d}}switch(e.type){case"peak":return{type:"peak",hz:o,db:n,...a===void 0?{}:{q:a}};case"lowshelf":case"highshelf":return{type:e.type,hz:o,db:n,...a===void 0?{}:{slope:a}};default:return{type:e.type,hz:o,...a===void 0?{}:{q:a}}}}const w=32;function O(e,i,t,o){if(!i.keys||i.keys.length===0){$(e,[k(bandAt(i,0),t)]);return}let n=0,a=0,s=k(bandAt(i,o),t);for(let f=0;f<e.length;f++){f%w===0&&(s=k(bandAt(i,o+(f+w/2)/t),t));const r=e[f]??0,l=s.b0*r+n;n=s.b1*r-s.a1*l+a,a=s.b2*r-s.a2*l,e[f]=l}}export function shapeSound(e,i,t,o=0){if(!i)return;for(const a of i.eq??[])for(const s of e)O(s,a,t,o);const n=i.compress;if(n){const a=soundLevel(e,t)?.lufs;if(a===void 0)return;const s={threshold:a+n.threshold,ratio:n.ratio??COMPRESS_DEFAULTS.ratio,knee:n.knee??COMPRESS_DEFAULTS.knee,attack:n.attack??COMPRESS_DEFAULTS.attack,release:n.release??COMPRESS_DEFAULTS.release,window:n.window??COMPRESS_DEFAULTS.window};z(e,s,t)}}export function soundLevel(e,i){const t=v(e,i);if(t!==void 0&&t>-70)return{lufs:t,by:"integrated"};const o=S(e,i);return o===void 0?void 0:{lufs:o,by:"level"}}export const shapes=e=>(e?.eq?.length??0)>0||e?.compress!==void 0;
@@ -0,0 +1,45 @@
1
+ import type { MixPlan, SpeechClip, Stereo } from "./plan.js";
2
+ import { type ResolvedVoice, type VoiceSpan } from "./recording/chain.js";
3
+ /** Speech recorded alike: its clips, where its parts play, and its seed. */
4
+ export interface VoiceGroup {
5
+ voice: ResolvedVoice;
6
+ clips: SpeechClip[];
7
+ spans: VoiceSpan[];
8
+ /** The parts recorded so, in film order. */
9
+ parts: string[];
10
+ seed: number;
11
+ }
12
+ /**
13
+ * The plan's speech by how it was recorded (the part's own setting, else
14
+ * the video's): one group per setting, and the clips played as they are
15
+ * (a setting of false, or a plan without one).
16
+ */
17
+ export declare function voiceGroups(plan: MixPlan): {
18
+ groups: VoiceGroup[];
19
+ dry: SpeechClip[];
20
+ };
21
+ /**
22
+ * A clip's source: its two channels, and the speed it was already made at
23
+ * (its second s at s / speed), when it was.
24
+ */
25
+ export interface ClipSource {
26
+ src: Stereo;
27
+ stretched?: number;
28
+ }
29
+ /**
30
+ * Adds a speech clip into a voice's two channels at `rate`, as the mix
31
+ * places it: its stretch of the file at its place and gain, faded 10 ms at
32
+ * each cut or over the plan's equal-power cross-fade. `stretched` is the
33
+ * speed the source was already made at (its second s at s / speed); else
34
+ * a clip with a speed is resampled from the source as recorded.
35
+ */
36
+ export declare function addSpeech(bus: Stereo, src: Stereo, c: SpeechClip, rate: number, stretched?: number): void;
37
+ /** Speech clips summed as the mix places them, before any recording. */
38
+ export declare function sumSpeech(clips: readonly SpeechClip[], duration: number, rate: number, sourceOf: (c: SpeechClip) => ClipSource | undefined): Stereo;
39
+ /**
40
+ * A voice group's sound: its clips summed (each from `sourceOf`, with the
41
+ * speed it was made at, or undefined to leave it out), then played
42
+ * through its setting. What the render's mix and the player both add.
43
+ */
44
+ export declare function playVoice(g: VoiceGroup, duration: number, rate: number, sourceOf: (c: SpeechClip) => ClipSource | undefined): Stereo;
45
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1,2 @@
1
+ /*! AllyHub. Copyright (c) 2026 AllyHub, Inc. All rights reserved. Use is subject to LICENSE.md. */
2
+ import{equalPower as q}from"./envelope.js";import{recordVoice as D}from"./recording/chain.js";import{hashSeed as G}from"./sfx.js";export function voiceGroups(e){const c=e.voice;if(!c)return{groups:[],dry:[...e.speech]};const n=o=>(o===void 0?void 0:c.parts?.[o])??c.video,r=new Map,f=[],u=o=>{const t=JSON.stringify(o);let i=r.get(t);return i||(i={voice:o,clips:[],spans:[],parts:[],seed:G(`${c.seed}:voice:${t}`)},r.set(t,i)),i};for(const o of e.speech){const t=n(o.part);t===!1?f.push(o):u(t).clips.push(o)}for(const o of c.spans){const t=n(o.part);if(t===!1)continue;const i=u(t);i.spans.push({start:o.start,end:o.end}),i.parts.push(o.part)}return{groups:[...r.values()],dry:f}}export function addSpeech(e,c,n,r,f){const u=Math.round(n.dur*r),o=Math.round(n.at*r),t=10**(n.gainDb/20),i=Math.min(Math.round(.01*r),Math.floor(u/4)),h=s=>s===void 0||s<=0?0:Math.min(Math.round(s*r),Math.floor(u/2)),O=h(n.fadeIn),S=h(n.fadeOut),l=(s,a)=>a>0?q(s/a):i>0&&s<i?s/i:1,b=e[0].length,m=c[0].length,M=f===void 0?n.speed??1:1,g=f===void 0?n.from*r:n.from/f*r;for(let s=0;s<u;s++){const a=o+s;if(a<0||a>=b)continue;const v=M===1?Math.round(g)+s:g+s*M,p=Math.floor(v);if(p<0||p>=m)continue;const A=v-p,F=Math.min(p+1,m-1),V=t*l(s,O)*l(u-1-s,S);for(let d=0;d<2;d++){const y=c[d]??c[0],w=y[p]??0,$=y[F]??0,x=e[d]??e[0];x[a]=(x[a]??0)+(w+($-w)*A)*V}}}export function sumSpeech(e,c,n,r){const f=Math.round(c*n),u=[new Float32Array(f),new Float32Array(f)];for(const o of e){const t=r(o);t&&addSpeech(u,t.src,o,n,t.stretched)}return u}export function playVoice(e,c,n,r){const f=sumSpeech(e.clips,c,n,r);return D(f,e.voice,n,e.seed,e.spans),f}
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@allyhub-next/audio",
3
+ "version": "0.2.0-next.1",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "default": "./dist/index.js"
9
+ },
10
+ "./node": {
11
+ "types": "./dist/node/index.d.ts",
12
+ "default": "./dist/node/index.js"
13
+ }
14
+ },
15
+ "private": true,
16
+ "license": "SEE LICENSE IN LICENSE.md"
17
+ }
@@ -0,0 +1,241 @@
1
+ AllyHub Software License
2
+
3
+ Copyright (c) 2026 AllyHub, Inc. ("AllyHub"). All rights reserved.
4
+
5
+ This software (the AllyHub command-line tool, its SDK, runtime and the
6
+ packages they depend on) is proprietary. It is not open source.
7
+
8
+ 1. Permitted use. You may install and run the software, unmodified, to make,
9
+ check, preview and render videos and decks, including for commercial
10
+ purposes. What you make with it is yours.
11
+
12
+ 2. Restrictions. Except as this license permits or applicable law requires,
13
+ you may not copy, modify, adapt, translate, sublicense, sell, rent, lease,
14
+ publish or otherwise distribute the software, create derivative works of
15
+ it, or reverse engineer, decompile or disassemble it.
16
+
17
+ 3. Cloud services. AllyHub's cloud tools (sign-in, research, images, voice,
18
+ video) are separate services governed by AllyHub's terms of service.
19
+
20
+ 4. Trademarks. This license grants no right to use the name "AllyHub" or its
21
+ logos.
22
+
23
+ 5. No warranty. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
24
+ KIND, EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
26
+ ALLYHUB BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ITS USE.
28
+
29
+ 6. Third-party code. Parts of the software are adapted from HyperFrames,
30
+ licensed under the Apache License, Version 2.0 (see NOTICE). Those parts
31
+ remain under that license, reproduced below, and nothing in this license
32
+ limits your rights under it.
33
+
34
+ 7. Starter components. The starter components in the "components" folder,
35
+ which "allyhub add" copies into your workspace, are licensed under the MIT
36
+ License (see components/LICENSE): once copied, you may change, use and
37
+ share them freely.
38
+
39
+ --------------------------------------------------------------------------------
40
+
41
+ Apache License
42
+ Version 2.0, January 2004
43
+ http://www.apache.org/licenses/
44
+
45
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
46
+
47
+ 1. Definitions.
48
+
49
+ "License" shall mean the terms and conditions for use, reproduction,
50
+ and distribution as defined by Sections 1 through 9 of this document.
51
+
52
+ "Licensor" shall mean the copyright owner or entity authorized by
53
+ the copyright owner that is granting the License.
54
+
55
+ "Legal Entity" shall mean the union of the acting entity and all
56
+ other entities that control, are controlled by, or are under common
57
+ control with that entity. For the purposes of this definition,
58
+ "control" means (i) the power, direct or indirect, to cause the
59
+ direction or management of such entity, whether by contract or
60
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
61
+ outstanding shares, or (iii) beneficial ownership of such entity.
62
+
63
+ "You" (or "Your") shall mean an individual or Legal Entity
64
+ exercising permissions granted by this License.
65
+
66
+ "Source" form shall mean the preferred form for making modifications,
67
+ including but not limited to software source code, documentation
68
+ source, and configuration files.
69
+
70
+ "Object" form shall mean any form resulting from mechanical
71
+ transformation or translation of a Source form, including but
72
+ not limited to compiled object code, generated documentation,
73
+ and conversions to other media types.
74
+
75
+ "Work" shall mean the work of authorship, whether in Source or
76
+ Object form, made available under the License, as indicated by a
77
+ copyright notice that is included in or attached to the work
78
+ (an example is provided in the Appendix below).
79
+
80
+ "Derivative Works" shall mean any work, whether in Source or Object
81
+ form, that is based on (or derived from) the Work and for which the
82
+ editorial revisions, annotations, elaborations, or other modifications
83
+ represent, as a whole, an original work of authorship. For the purposes
84
+ of this License, Derivative Works shall not include works that remain
85
+ separable from, or merely link (or bind by name) to the interfaces of,
86
+ the Work and Derivative Works thereof.
87
+
88
+ "Contribution" shall mean any work of authorship, including
89
+ the original version of the Work and any modifications or additions
90
+ to that Work or Derivative Works thereof, that is intentionally
91
+ submitted to Licensor for inclusion in the Work by the copyright owner
92
+ or by an individual or Legal Entity authorized to submit on behalf of
93
+ the copyright owner. For the purposes of this definition, "submitted"
94
+ means any form of electronic, verbal, or written communication sent
95
+ to the Licensor or its representatives, including but not limited to
96
+ communication on electronic mailing lists, source code control systems,
97
+ and issue tracking systems that are managed by, or on behalf of, the
98
+ Licensor for the purpose of discussing and improving the Work, but
99
+ excluding communication that is conspicuously marked or otherwise
100
+ designated in writing by the copyright owner as "Not a Contribution."
101
+
102
+ "Contributor" shall mean Licensor and any individual or Legal Entity
103
+ on behalf of whom a Contribution has been received by Licensor and
104
+ subsequently incorporated within the Work.
105
+
106
+ 2. Grant of Copyright License. Subject to the terms and conditions of
107
+ this License, each Contributor hereby grants to You a perpetual,
108
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
109
+ copyright license to reproduce, prepare Derivative Works of,
110
+ publicly display, publicly perform, sublicense, and distribute the
111
+ Work and such Derivative Works in Source or Object form.
112
+
113
+ 3. Grant of Patent License. Subject to the terms and conditions of
114
+ this License, each Contributor hereby grants to You a perpetual,
115
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
116
+ (except as stated in this section) patent license to make, have made,
117
+ use, offer to sell, sell, import, and otherwise transfer the Work,
118
+ where such license applies only to those patent claims licensable
119
+ by such Contributor that are necessarily infringed by their
120
+ Contribution(s) alone or by combination of their Contribution(s)
121
+ with the Work to which such Contribution(s) was submitted. If You
122
+ institute patent litigation against any entity (including a
123
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
124
+ or a Contribution incorporated within the Work constitutes direct
125
+ or contributory patent infringement, then any patent licenses
126
+ granted to You under this License for that Work shall terminate
127
+ as of the date such litigation is filed.
128
+
129
+ 4. Redistribution. You may reproduce and distribute copies of the
130
+ Work or Derivative Works thereof in any medium, with or without
131
+ modifications, and in Source or Object form, provided that You
132
+ meet the following conditions:
133
+
134
+ (a) You must give any other recipients of the Work or
135
+ Derivative Works a copy of this License; and
136
+
137
+ (b) You must cause any modified files to carry prominent notices
138
+ stating that You changed the files; and
139
+
140
+ (c) You must retain, in the Source form of any Derivative Works
141
+ that You distribute, all copyright, patent, trademark, and
142
+ attribution notices from the Source form of the Work,
143
+ excluding those notices that do not pertain to any part of
144
+ the Derivative Works; and
145
+
146
+ (d) If the Work includes a "NOTICE" text file as part of its
147
+ distribution, then any Derivative Works that You distribute must
148
+ include a readable copy of the attribution notices contained
149
+ within such NOTICE file, excluding those notices that do not
150
+ pertain to any part of the Derivative Works, in at least one
151
+ of the following places: within a NOTICE text file distributed
152
+ as part of the Derivative Works; within the Source form or
153
+ documentation, if provided along with the Derivative Works; or,
154
+ within a display generated by the Derivative Works, if and
155
+ wherever such third-party notices normally appear. The contents
156
+ of the NOTICE file are for informational purposes only and
157
+ do not modify the License. You may add Your own attribution
158
+ notices within Derivative Works that You distribute, alongside
159
+ or as an addendum to the NOTICE text from the Work, provided
160
+ that such additional attribution notices cannot be construed
161
+ as modifying the License.
162
+
163
+ You may add Your own copyright statement to Your modifications and
164
+ may provide additional or different license terms and conditions
165
+ for use, reproduction, or distribution of Your modifications, or
166
+ for any such Derivative Works as a whole, provided Your use,
167
+ reproduction, and distribution of the Work otherwise complies with
168
+ the conditions stated in this License.
169
+
170
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
171
+ any Contribution intentionally submitted for inclusion in the Work
172
+ by You to the Licensor shall be under the terms and conditions of
173
+ this License, without any additional terms or conditions.
174
+ Notwithstanding the above, nothing herein shall supersede or modify
175
+ the terms of any separate license agreement you may have executed
176
+ with Licensor regarding such Contributions.
177
+
178
+ 6. Trademarks. This License does not grant permission to use the trade
179
+ names, trademarks, service marks, or product names of the Licensor,
180
+ except as required for reasonable and customary use in describing the
181
+ origin of the Work and reproducing the content of the NOTICE file.
182
+
183
+ 7. Disclaimer of Warranty. Unless required by applicable law or
184
+ agreed to in writing, Licensor provides the Work (and each
185
+ Contributor provides its Contributions) on an "AS IS" BASIS,
186
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
187
+ implied, including, without limitation, any warranties or conditions
188
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
189
+ PARTICULAR PURPOSE. You are solely responsible for determining the
190
+ appropriateness of using or redistributing the Work and assume any
191
+ risks associated with Your exercise of permissions under this License.
192
+
193
+ 8. Limitation of Liability. In no event and under no legal theory,
194
+ whether in tort (including negligence), contract, or otherwise,
195
+ unless required by applicable law (such as deliberate and grossly
196
+ negligent acts) or agreed to in writing, shall any Contributor be
197
+ liable to You for damages, including any direct, indirect, special,
198
+ incidental, or consequential damages of any character arising as a
199
+ result of this License or out of the use or inability to use the
200
+ Work (including but not limited to damages for loss of goodwill,
201
+ work stoppage, computer failure or malfunction, or any and all
202
+ other commercial damages or losses), even if such Contributor
203
+ has been advised of the possibility of such damages.
204
+
205
+ 9. Accepting Warranty or Additional Liability. While redistributing
206
+ the Work or Derivative Works thereof, You may choose to offer,
207
+ and charge a fee for, acceptance of support, warranty, indemnity,
208
+ or other liability obligations and/or rights consistent with this
209
+ License. However, in accepting such obligations, You may act only
210
+ on Your own behalf and on Your sole responsibility, not on behalf
211
+ of any other Contributor, and only if You agree to indemnify,
212
+ defend, and hold each Contributor harmless for any liability
213
+ incurred by, or claims asserted against, such Contributor by reason
214
+ of your accepting any such warranty or additional liability.
215
+
216
+ END OF TERMS AND CONDITIONS
217
+
218
+ APPENDIX: How to apply the Apache License to your work.
219
+
220
+ To apply the Apache License to your work, attach the following
221
+ boilerplate notice, with the fields enclosed by brackets "[]"
222
+ replaced with your own identifying information. (Don't include
223
+ the brackets!) The text should be enclosed in the appropriate
224
+ comment syntax for the file format. We also recommend that a
225
+ file or class name and description of purpose be included on the
226
+ same "printed page" as the copyright notice for easier
227
+ identification within third-party archives.
228
+
229
+ Copyright [yyyy] [name of copyright owner]
230
+
231
+ Licensed under the Apache License, Version 2.0 (the "License");
232
+ you may not use this file except in compliance with the License.
233
+ You may obtain a copy of the License at
234
+
235
+ http://www.apache.org/licenses/LICENSE-2.0
236
+
237
+ Unless required by applicable law or agreed to in writing, software
238
+ distributed under the License is distributed on an "AS IS" BASIS,
239
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
240
+ See the License for the specific language governing permissions and
241
+ limitations under the License.