amaran-light-cli 1.10.0 → 1.12.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 (397) hide show
  1. package/README.md +154 -17
  2. package/dist/__tests__/autoCct.test.js +35 -4
  3. package/dist/__tests__/autoCct.test.js.map +1 -1
  4. package/dist/__tests__/autoCctMaxLux.test.js +11 -9
  5. package/dist/__tests__/autoCctMaxLux.test.js.map +1 -1
  6. package/dist/__tests__/autostart.test.js +18 -0
  7. package/dist/__tests__/autostart.test.js.map +1 -1
  8. package/dist/__tests__/bleHttpControl.test.d.ts +2 -0
  9. package/dist/__tests__/bleHttpControl.test.d.ts.map +1 -0
  10. package/dist/__tests__/bleHttpControl.test.js +230 -0
  11. package/dist/__tests__/bleHttpControl.test.js.map +1 -0
  12. package/dist/__tests__/bleStack.test.d.ts +2 -0
  13. package/dist/__tests__/bleStack.test.d.ts.map +1 -0
  14. package/dist/__tests__/bleStack.test.js +1239 -0
  15. package/dist/__tests__/bleStack.test.js.map +1 -0
  16. package/dist/__tests__/cctUtil.test.js +11 -5
  17. package/dist/__tests__/cctUtil.test.js.map +1 -1
  18. package/dist/__tests__/circadianDashboardSettings.test.d.ts +2 -0
  19. package/dist/__tests__/circadianDashboardSettings.test.d.ts.map +1 -0
  20. package/dist/__tests__/circadianDashboardSettings.test.js +82 -0
  21. package/dist/__tests__/circadianDashboardSettings.test.js.map +1 -0
  22. package/dist/__tests__/circadianIsolation.test.d.ts +2 -0
  23. package/dist/__tests__/circadianIsolation.test.d.ts.map +1 -0
  24. package/dist/__tests__/circadianIsolation.test.js +30 -0
  25. package/dist/__tests__/circadianIsolation.test.js.map +1 -0
  26. package/dist/__tests__/cli.config.test.d.ts +2 -0
  27. package/dist/__tests__/cli.config.test.d.ts.map +1 -0
  28. package/dist/__tests__/cli.config.test.js +114 -0
  29. package/dist/__tests__/cli.config.test.js.map +1 -0
  30. package/dist/__tests__/cli.smoke.test.js +70 -17
  31. package/dist/__tests__/cli.smoke.test.js.map +1 -1
  32. package/dist/__tests__/currentCct.test.d.ts +2 -0
  33. package/dist/__tests__/currentCct.test.d.ts.map +1 -0
  34. package/dist/__tests__/currentCct.test.js +29 -0
  35. package/dist/__tests__/currentCct.test.js.map +1 -0
  36. package/dist/__tests__/dashboard.test.d.ts +2 -0
  37. package/dist/__tests__/dashboard.test.d.ts.map +1 -0
  38. package/dist/__tests__/dashboard.test.js +126 -0
  39. package/dist/__tests__/dashboard.test.js.map +1 -0
  40. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts +2 -0
  41. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts.map +1 -0
  42. package/dist/__tests__/daylightSimulationParseUtils.test.js +16 -0
  43. package/dist/__tests__/daylightSimulationParseUtils.test.js.map +1 -0
  44. package/dist/__tests__/desktopImport.test.d.ts +2 -0
  45. package/dist/__tests__/desktopImport.test.d.ts.map +1 -0
  46. package/dist/__tests__/desktopImport.test.js +234 -0
  47. package/dist/__tests__/desktopImport.test.js.map +1 -0
  48. package/dist/__tests__/lightControl.basic.test.d.ts +2 -0
  49. package/dist/__tests__/lightControl.basic.test.d.ts.map +1 -0
  50. package/dist/__tests__/lightControl.basic.test.js +119 -0
  51. package/dist/__tests__/lightControl.basic.test.js.map +1 -0
  52. package/dist/__tests__/lightControl.colorEffects.test.d.ts +2 -0
  53. package/dist/__tests__/lightControl.colorEffects.test.d.ts.map +1 -0
  54. package/dist/__tests__/lightControl.colorEffects.test.js +170 -0
  55. package/dist/__tests__/lightControl.colorEffects.test.js.map +1 -0
  56. package/dist/__tests__/lightControl.management.test.d.ts +2 -0
  57. package/dist/__tests__/lightControl.management.test.d.ts.map +1 -0
  58. package/dist/__tests__/lightControl.management.test.js +90 -0
  59. package/dist/__tests__/lightControl.management.test.js.map +1 -0
  60. package/dist/__tests__/lightControlTestUtils.d.ts +10 -0
  61. package/dist/__tests__/lightControlTestUtils.d.ts.map +1 -0
  62. package/dist/__tests__/lightControlTestUtils.js +57 -0
  63. package/dist/__tests__/lightControlTestUtils.js.map +1 -0
  64. package/dist/__tests__/maxLuxInterpolation.test.js +4 -2
  65. package/dist/__tests__/maxLuxInterpolation.test.js.map +1 -1
  66. package/dist/__tests__/meshConfiguration.test.d.ts +2 -0
  67. package/dist/__tests__/meshConfiguration.test.d.ts.map +1 -0
  68. package/dist/__tests__/meshConfiguration.test.js +78 -0
  69. package/dist/__tests__/meshConfiguration.test.js.map +1 -0
  70. package/dist/__tests__/nativeGroups.test.d.ts +2 -0
  71. package/dist/__tests__/nativeGroups.test.d.ts.map +1 -0
  72. package/dist/__tests__/nativeGroups.test.js +104 -0
  73. package/dist/__tests__/nativeGroups.test.js.map +1 -0
  74. package/dist/__tests__/packageExports.test.d.ts +2 -0
  75. package/dist/__tests__/packageExports.test.d.ts.map +1 -0
  76. package/dist/__tests__/packageExports.test.js +33 -0
  77. package/dist/__tests__/packageExports.test.js.map +1 -0
  78. package/dist/__tests__/programApi.test.d.ts +2 -0
  79. package/dist/__tests__/programApi.test.d.ts.map +1 -0
  80. package/dist/__tests__/programApi.test.js +73 -0
  81. package/dist/__tests__/programApi.test.js.map +1 -0
  82. package/dist/__tests__/programs.test.d.ts +2 -0
  83. package/dist/__tests__/programs.test.d.ts.map +1 -0
  84. package/dist/__tests__/programs.test.js +176 -0
  85. package/dist/__tests__/programs.test.js.map +1 -0
  86. package/dist/__tests__/scheduleMaker.test.d.ts +2 -0
  87. package/dist/__tests__/scheduleMaker.test.d.ts.map +1 -0
  88. package/dist/__tests__/scheduleMaker.test.js +25 -0
  89. package/dist/__tests__/scheduleMaker.test.js.map +1 -0
  90. package/dist/__tests__/simulateSchedule.test.js +7 -3
  91. package/dist/__tests__/simulateSchedule.test.js.map +1 -1
  92. package/dist/ble/async.d.ts +2 -0
  93. package/dist/ble/async.d.ts.map +1 -0
  94. package/dist/ble/async.js +15 -0
  95. package/dist/ble/async.js.map +1 -0
  96. package/dist/ble/colors.d.ts +5 -0
  97. package/dist/ble/colors.d.ts.map +1 -0
  98. package/dist/ble/colors.js +44 -0
  99. package/dist/ble/colors.js.map +1 -0
  100. package/dist/ble/configuration.d.ts +22 -0
  101. package/dist/ble/configuration.d.ts.map +1 -0
  102. package/dist/ble/configuration.js +122 -0
  103. package/dist/ble/configuration.js.map +1 -0
  104. package/dist/ble/controller.d.ts +118 -0
  105. package/dist/ble/controller.d.ts.map +1 -0
  106. package/dist/ble/controller.js +931 -0
  107. package/dist/ble/controller.js.map +1 -0
  108. package/dist/ble/crypto.d.ts +34 -0
  109. package/dist/ble/crypto.d.ts.map +1 -0
  110. package/dist/ble/crypto.js +178 -0
  111. package/dist/ble/crypto.js.map +1 -0
  112. package/dist/ble/daemon.d.ts +2 -0
  113. package/dist/ble/daemon.d.ts.map +1 -0
  114. package/dist/ble/daemon.js +76 -0
  115. package/dist/ble/daemon.js.map +1 -0
  116. package/dist/ble/dashboard.d.ts +331 -0
  117. package/dist/ble/dashboard.d.ts.map +1 -0
  118. package/dist/ble/dashboard.js +280 -0
  119. package/dist/ble/dashboard.js.map +1 -0
  120. package/dist/ble/desktop.d.ts +4 -0
  121. package/dist/ble/desktop.d.ts.map +1 -0
  122. package/dist/ble/desktop.js +33 -0
  123. package/dist/ble/desktop.js.map +1 -0
  124. package/dist/ble/desktopLibrary.d.ts +12 -0
  125. package/dist/ble/desktopLibrary.d.ts.map +1 -0
  126. package/dist/ble/desktopLibrary.js +346 -0
  127. package/dist/ble/desktopLibrary.js.map +1 -0
  128. package/dist/ble/effects.d.ts +34 -0
  129. package/dist/ble/effects.d.ts.map +1 -0
  130. package/dist/ble/effects.js +138 -0
  131. package/dist/ble/effects.js.map +1 -0
  132. package/dist/ble/fan.d.ts +244 -0
  133. package/dist/ble/fan.d.ts.map +1 -0
  134. package/dist/ble/fan.js +46 -0
  135. package/dist/ble/fan.js.map +1 -0
  136. package/dist/ble/library.d.ts +341 -0
  137. package/dist/ble/library.d.ts.map +1 -0
  138. package/dist/ble/library.js +201 -0
  139. package/dist/ble/library.js.map +1 -0
  140. package/dist/ble/media.d.ts +133 -0
  141. package/dist/ble/media.d.ts.map +1 -0
  142. package/dist/ble/media.js +186 -0
  143. package/dist/ble/media.js.map +1 -0
  144. package/dist/ble/nativeGroups.d.ts +22 -0
  145. package/dist/ble/nativeGroups.d.ts.map +1 -0
  146. package/dist/ble/nativeGroups.js +114 -0
  147. package/dist/ble/nativeGroups.js.map +1 -0
  148. package/dist/ble/packets.d.ts +3 -0
  149. package/dist/ble/packets.d.ts.map +1 -0
  150. package/dist/ble/packets.js +15 -0
  151. package/dist/ble/packets.js.map +1 -0
  152. package/dist/ble/programs.d.ts +318 -0
  153. package/dist/ble/programs.d.ts.map +1 -0
  154. package/dist/ble/programs.js +329 -0
  155. package/dist/ble/programs.js.map +1 -0
  156. package/dist/ble/provisioning.d.ts +13 -0
  157. package/dist/ble/provisioning.d.ts.map +1 -0
  158. package/dist/ble/provisioning.js +39 -0
  159. package/dist/ble/provisioning.js.map +1 -0
  160. package/dist/ble/server.d.ts +18 -0
  161. package/dist/ble/server.d.ts.map +1 -0
  162. package/dist/ble/server.js +548 -0
  163. package/dist/ble/server.js.map +1 -0
  164. package/dist/ble/service.d.ts +2 -0
  165. package/dist/ble/service.d.ts.map +1 -0
  166. package/dist/ble/service.js +77 -0
  167. package/dist/ble/service.js.map +1 -0
  168. package/dist/ble/settings.d.ts +18 -0
  169. package/dist/ble/settings.d.ts.map +1 -0
  170. package/dist/ble/settings.js +25 -0
  171. package/dist/ble/settings.js.map +1 -0
  172. package/dist/ble/setup.d.ts +2 -0
  173. package/dist/ble/setup.d.ts.map +1 -0
  174. package/dist/ble/setup.js +31 -0
  175. package/dist/ble/setup.js.map +1 -0
  176. package/dist/ble/storage.d.ts +94 -0
  177. package/dist/ble/storage.d.ts.map +1 -0
  178. package/dist/ble/storage.js +132 -0
  179. package/dist/ble/storage.js.map +1 -0
  180. package/dist/ble/telink.d.ts +63 -0
  181. package/dist/ble/telink.d.ts.map +1 -0
  182. package/dist/ble/telink.js +108 -0
  183. package/dist/ble/telink.js.map +1 -0
  184. package/dist/ble/transitions.d.ts +3 -0
  185. package/dist/ble/transitions.d.ts.map +1 -0
  186. package/dist/ble/transitions.js +28 -0
  187. package/dist/ble/transitions.js.map +1 -0
  188. package/dist/ble/transport.d.ts +48 -0
  189. package/dist/ble/transport.d.ts.map +1 -0
  190. package/dist/ble/transport.js +370 -0
  191. package/dist/ble/transport.js.map +1 -0
  192. package/dist/circadian.d.ts +19 -0
  193. package/dist/circadian.d.ts.map +1 -0
  194. package/dist/circadian.js +13 -0
  195. package/dist/circadian.js.map +1 -0
  196. package/dist/cli.d.ts +5 -3
  197. package/dist/cli.d.ts.map +1 -1
  198. package/dist/cli.js +159 -33
  199. package/dist/cli.js.map +1 -1
  200. package/dist/commands/__tests__/integration.test.js +28 -0
  201. package/dist/commands/__tests__/integration.test.js.map +1 -1
  202. package/dist/commands/__tests__/newCommands.test.js +3 -4
  203. package/dist/commands/__tests__/newCommands.test.js.map +1 -1
  204. package/dist/commands/cmdUtils.d.ts +8 -2
  205. package/dist/commands/cmdUtils.d.ts.map +1 -1
  206. package/dist/commands/cmdUtils.js +40 -2
  207. package/dist/commands/cmdUtils.js.map +1 -1
  208. package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
  209. package/dist/commands/daylightSimulation/autoCct.js +74 -172
  210. package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
  211. package/dist/commands/daylightSimulation/graphSchedule.d.ts +1 -1
  212. package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
  213. package/dist/commands/daylightSimulation/graphSchedule.js +2 -0
  214. package/dist/commands/daylightSimulation/graphSchedule.js.map +1 -1
  215. package/dist/commands/daylightSimulation/printSchedule.d.ts +1 -1
  216. package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
  217. package/dist/commands/daylightSimulation/printSchedule.js +4 -2
  218. package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
  219. package/dist/commands/daylightSimulation/service.d.ts +1 -1
  220. package/dist/commands/daylightSimulation/service.d.ts.map +1 -1
  221. package/dist/commands/daylightSimulation/service.js +20 -10
  222. package/dist/commands/daylightSimulation/service.js.map +1 -1
  223. package/dist/commands/daylightSimulation/simulateSchedule.d.ts +1 -1
  224. package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
  225. package/dist/commands/daylightSimulation/simulateSchedule.js +31 -13
  226. package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
  227. package/dist/commands/daylightSimulation/weather.d.ts.map +1 -1
  228. package/dist/commands/daylightSimulation/weather.js +19 -4
  229. package/dist/commands/daylightSimulation/weather.js.map +1 -1
  230. package/dist/commands/deviceControl/ble.d.ts +4 -0
  231. package/dist/commands/deviceControl/ble.d.ts.map +1 -0
  232. package/dist/commands/deviceControl/ble.js +214 -0
  233. package/dist/commands/deviceControl/ble.js.map +1 -0
  234. package/dist/commands/deviceControl/cct.d.ts.map +1 -1
  235. package/dist/commands/deviceControl/cct.js +47 -19
  236. package/dist/commands/deviceControl/cct.js.map +1 -1
  237. package/dist/commands/deviceControl/color.d.ts.map +1 -1
  238. package/dist/commands/deviceControl/color.js +16 -12
  239. package/dist/commands/deviceControl/color.js.map +1 -1
  240. package/dist/commands/deviceControl/config.d.ts.map +1 -1
  241. package/dist/commands/deviceControl/config.js +94 -58
  242. package/dist/commands/deviceControl/config.js.map +1 -1
  243. package/dist/commands/deviceControl/{discover.d.ts → desktop.d.ts} +3 -2
  244. package/dist/commands/deviceControl/desktop.d.ts.map +1 -0
  245. package/dist/commands/deviceControl/desktop.js +66 -0
  246. package/dist/commands/deviceControl/desktop.js.map +1 -0
  247. package/dist/commands/deviceControl/effect.d.ts.map +1 -1
  248. package/dist/commands/deviceControl/effect.js +90 -159
  249. package/dist/commands/deviceControl/effect.js.map +1 -1
  250. package/dist/commands/deviceControl/fan.d.ts.map +1 -1
  251. package/dist/commands/deviceControl/fan.js +77 -95
  252. package/dist/commands/deviceControl/fan.js.map +1 -1
  253. package/dist/commands/deviceControl/group.d.ts.map +1 -1
  254. package/dist/commands/deviceControl/group.js +43 -6
  255. package/dist/commands/deviceControl/group.js.map +1 -1
  256. package/dist/commands/deviceControl/hsi.d.ts.map +1 -1
  257. package/dist/commands/deviceControl/hsi.js +6 -10
  258. package/dist/commands/deviceControl/hsi.js.map +1 -1
  259. package/dist/commands/deviceControl/info.d.ts.map +1 -1
  260. package/dist/commands/deviceControl/info.js +0 -50
  261. package/dist/commands/deviceControl/info.js.map +1 -1
  262. package/dist/commands/deviceControl/intensity.d.ts.map +1 -1
  263. package/dist/commands/deviceControl/intensity.js +38 -16
  264. package/dist/commands/deviceControl/intensity.js.map +1 -1
  265. package/dist/commands/deviceControl/list.d.ts.map +1 -1
  266. package/dist/commands/deviceControl/list.js +21 -15
  267. package/dist/commands/deviceControl/list.js.map +1 -1
  268. package/dist/commands/deviceControl/power.d.ts.map +1 -1
  269. package/dist/commands/deviceControl/power.js +19 -28
  270. package/dist/commands/deviceControl/power.js.map +1 -1
  271. package/dist/commands/deviceControl/preset.d.ts.map +1 -1
  272. package/dist/commands/deviceControl/preset.js +56 -19
  273. package/dist/commands/deviceControl/preset.js.map +1 -1
  274. package/dist/commands/deviceControl/program.d.ts +4 -0
  275. package/dist/commands/deviceControl/program.d.ts.map +1 -0
  276. package/dist/commands/deviceControl/program.js +199 -0
  277. package/dist/commands/deviceControl/program.js.map +1 -0
  278. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -1
  279. package/dist/commands/deviceControl/quickshot.js +75 -13
  280. package/dist/commands/deviceControl/quickshot.js.map +1 -1
  281. package/dist/commands/deviceControl/scene.d.ts.map +1 -1
  282. package/dist/commands/deviceControl/scene.js +72 -9
  283. package/dist/commands/deviceControl/scene.js.map +1 -1
  284. package/dist/commands/deviceControl/status.d.ts.map +1 -1
  285. package/dist/commands/deviceControl/status.js +29 -6
  286. package/dist/commands/deviceControl/status.js.map +1 -1
  287. package/dist/commands/parseUtils.d.ts +6 -0
  288. package/dist/commands/parseUtils.d.ts.map +1 -0
  289. package/dist/commands/parseUtils.js +32 -0
  290. package/dist/commands/parseUtils.js.map +1 -0
  291. package/dist/commands-api.d.ts +28 -0
  292. package/dist/commands-api.d.ts.map +1 -0
  293. package/dist/commands-api.js +27 -0
  294. package/dist/commands-api.js.map +1 -0
  295. package/dist/commands.d.ts.map +1 -1
  296. package/dist/commands.js +4 -2
  297. package/dist/commands.js.map +1 -1
  298. package/dist/config.d.ts +165 -0
  299. package/dist/config.d.ts.map +1 -0
  300. package/dist/config.js +125 -0
  301. package/dist/config.js.map +1 -0
  302. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
  303. package/dist/daylightSimulation/cctUtil.js +23 -22
  304. package/dist/daylightSimulation/cctUtil.js.map +1 -1
  305. package/dist/daylightSimulation/constants.d.ts +10 -0
  306. package/dist/daylightSimulation/constants.d.ts.map +1 -1
  307. package/dist/daylightSimulation/constants.js +4 -0
  308. package/dist/daylightSimulation/constants.js.map +1 -1
  309. package/dist/daylightSimulation/currentCct.d.ts +42 -0
  310. package/dist/daylightSimulation/currentCct.d.ts.map +1 -0
  311. package/dist/daylightSimulation/currentCct.js +217 -0
  312. package/dist/daylightSimulation/currentCct.js.map +1 -0
  313. package/dist/daylightSimulation/curves/realistic.d.ts +6 -6
  314. package/dist/daylightSimulation/curves/realistic.d.ts.map +1 -1
  315. package/dist/daylightSimulation/curves/realistic.js +36 -6
  316. package/dist/daylightSimulation/curves/realistic.js.map +1 -1
  317. package/dist/daylightSimulation/dashboardSettings.d.ts +47 -0
  318. package/dist/daylightSimulation/dashboardSettings.d.ts.map +1 -0
  319. package/dist/daylightSimulation/dashboardSettings.js +95 -0
  320. package/dist/daylightSimulation/dashboardSettings.js.map +1 -0
  321. package/dist/daylightSimulation/dashboardStatus.d.ts +72 -0
  322. package/dist/daylightSimulation/dashboardStatus.d.ts.map +1 -0
  323. package/dist/daylightSimulation/dashboardStatus.js +191 -0
  324. package/dist/daylightSimulation/dashboardStatus.js.map +1 -0
  325. package/dist/daylightSimulation/mathUtil.d.ts.map +1 -1
  326. package/dist/daylightSimulation/mathUtil.js +6 -2
  327. package/dist/daylightSimulation/mathUtil.js.map +1 -1
  328. package/dist/daylightSimulation/parseUtils.d.ts +3 -0
  329. package/dist/daylightSimulation/parseUtils.d.ts.map +1 -0
  330. package/dist/daylightSimulation/parseUtils.js +25 -0
  331. package/dist/daylightSimulation/parseUtils.js.map +1 -0
  332. package/dist/daylightSimulation/scheduleMaker.d.ts +6 -2
  333. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
  334. package/dist/daylightSimulation/scheduleMaker.js +9 -11
  335. package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
  336. package/dist/daylightSimulation/types.d.ts +15 -2
  337. package/dist/daylightSimulation/types.d.ts.map +1 -1
  338. package/dist/daylightSimulation/types.js +0 -2
  339. package/dist/daylightSimulation/types.js.map +1 -1
  340. package/dist/daylightSimulation/weatherUtil.d.ts.map +1 -1
  341. package/dist/daylightSimulation/weatherUtil.js +31 -0
  342. package/dist/daylightSimulation/weatherUtil.js.map +1 -1
  343. package/dist/device-control.d.ts +8 -0
  344. package/dist/device-control.d.ts.map +1 -0
  345. package/dist/device-control.js +8 -0
  346. package/dist/device-control.js.map +1 -0
  347. package/dist/deviceControl/autostart.d.ts.map +1 -1
  348. package/dist/deviceControl/autostart.js +15 -16
  349. package/dist/deviceControl/autostart.js.map +1 -1
  350. package/dist/deviceControl/bleHttpControl.d.ts +129 -0
  351. package/dist/deviceControl/bleHttpControl.d.ts.map +1 -0
  352. package/dist/deviceControl/bleHttpControl.js +753 -0
  353. package/dist/deviceControl/bleHttpControl.js.map +1 -0
  354. package/dist/deviceControl/lightControl.d.ts +9 -68
  355. package/dist/deviceControl/lightControl.d.ts.map +1 -1
  356. package/dist/deviceControl/lightControl.js +25 -255
  357. package/dist/deviceControl/lightControl.js.map +1 -1
  358. package/dist/deviceControl/lightControlCommands.d.ts +68 -0
  359. package/dist/deviceControl/lightControlCommands.d.ts.map +1 -0
  360. package/dist/deviceControl/lightControlCommands.js +244 -0
  361. package/dist/deviceControl/lightControlCommands.js.map +1 -0
  362. package/dist/deviceControl/types.d.ts +83 -4
  363. package/dist/deviceControl/types.d.ts.map +1 -1
  364. package/dist/deviceControl/types.js +1 -0
  365. package/dist/deviceControl/types.js.map +1 -1
  366. package/dist/index.d.ts +12 -0
  367. package/dist/index.d.ts.map +1 -0
  368. package/dist/index.js +8 -0
  369. package/dist/index.js.map +1 -0
  370. package/dist/test/MockLightServer.d.ts +1 -0
  371. package/dist/test/MockLightServer.d.ts.map +1 -1
  372. package/dist/test/MockLightServer.js +5 -0
  373. package/dist/test/MockLightServer.js.map +1 -1
  374. package/docs/CHANGELOG.md +171 -0
  375. package/docs/DIRECT_BLE.md +359 -0
  376. package/package.json +39 -8
  377. package/scripts/ble-cli-check.ts +129 -0
  378. package/scripts/ble-config-probe.ts +109 -0
  379. package/scripts/ble-effects-check.ts +82 -0
  380. package/scripts/ble-extended-probe.ts +44 -0
  381. package/scripts/ble-fan-check.ts +129 -0
  382. package/scripts/ble-feature-probe.ts +37 -0
  383. package/scripts/ble-followup-check.ts +165 -0
  384. package/scripts/ble-hardware-check.ts +99 -0
  385. package/scripts/ble-live-extended-check.ts +205 -0
  386. package/scripts/ble-non-ota-check.ts +193 -0
  387. package/scripts/ble-probe.ts +45 -0
  388. package/scripts/calibrate-webcam.ts +152 -0
  389. package/scripts/desktop-reference.ts +85 -0
  390. package/scripts/webcam.ts +129 -0
  391. package/dist/__tests__/lightControl.test.d.ts +0 -2
  392. package/dist/__tests__/lightControl.test.d.ts.map +0 -1
  393. package/dist/__tests__/lightControl.test.js +0 -424
  394. package/dist/__tests__/lightControl.test.js.map +0 -1
  395. package/dist/commands/deviceControl/discover.d.ts.map +0 -1
  396. package/dist/commands/deviceControl/discover.js +0 -29
  397. package/dist/commands/deviceControl/discover.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import chalk from 'chalk';
2
- import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
2
+ import { addStandardOptions, commandCallbackPromise, getLightDevices, runDeviceAction } from '../cmdUtils.js';
3
3
  export function registerPower(program, deps) {
4
4
  const { asyncCommand } = deps;
5
5
  // on
@@ -22,9 +22,12 @@ async function getPowerStatus(deps, deviceQuery, options, _actionName) {
22
22
  }, async (device, controller) => {
23
23
  return new Promise((resolve) => {
24
24
  controller.getLightSleepStatus(device.node_id, (success, message, data) => {
25
- if (!success)
26
- throw new Error(message);
27
25
  const displayName = device.device_name || device.name || device.id || device.node_id || 'Unknown';
26
+ if (!success) {
27
+ console.error(chalk.red(`✗ ${displayName}: Failed to get status: ${message}`));
28
+ resolve();
29
+ return;
30
+ }
28
31
  // Handle potential nesting: { data: { data: false } } or { data: { sleep: false } }
29
32
  let state = data;
30
33
  if (state && typeof state === 'object' && 'data' in state) {
@@ -52,7 +55,7 @@ async function getPowerStatus(deps, deviceQuery, options, _actionName) {
52
55
  return;
53
56
  }
54
57
  // Filter for light devices only, skipping groups like 'ALL'
55
- const lightDevices = devices.filter((d) => d.node_id?.includes('-') && d.node_id !== '00000000000000000000000000000000');
58
+ const lightDevices = getLightDevices(devices);
56
59
  if (lightDevices.length === 0) {
57
60
  console.log(chalk.yellow('No light devices found'));
58
61
  return;
@@ -101,17 +104,13 @@ function handleOn(deps) {
101
104
  actionName: 'turn on light',
102
105
  onSuccess: (device) => `✓ ${device.device_name || device.name || device.id || device.node_id || 'Unknown'} turned on`,
103
106
  }, (device, controller) => {
104
- return new Promise((resolve) => {
105
- controller.turnLightOn(device.node_id, (success, message) => {
106
- if (!success)
107
- throw new Error(message);
108
- resolve();
109
- });
110
- });
107
+ return commandCallbackPromise((callback) => controller.turnLightOn(device.node_id, callback));
111
108
  }, async (controller) => {
112
109
  await controller.turnOnAllLights((success, message) => {
113
- if (!success)
110
+ if (!success) {
111
+ process.exitCode = 1;
114
112
  console.error(`✗ Failed to turn on light: ${message}`);
113
+ }
115
114
  });
116
115
  });
117
116
  };
@@ -128,17 +127,13 @@ function handleOff(deps) {
128
127
  actionName: 'turn off light',
129
128
  onSuccess: (device) => `✓ ${device.device_name || device.name || device.id || device.node_id || 'Unknown'} turned off`,
130
129
  }, (device, controller) => {
131
- return new Promise((resolve) => {
132
- controller.turnLightOff(device.node_id, (success, message) => {
133
- if (!success)
134
- throw new Error(message);
135
- resolve();
136
- });
137
- });
130
+ return commandCallbackPromise((callback) => controller.turnLightOff(device.node_id, callback));
138
131
  }, async (controller) => {
139
132
  await controller.turnOffAllLights((success, message) => {
140
- if (!success)
133
+ if (!success) {
134
+ process.exitCode = 1;
141
135
  console.error(`✗ Failed to turn off light: ${message}`);
136
+ }
142
137
  });
143
138
  });
144
139
  };
@@ -151,17 +146,13 @@ function handleToggle(deps) {
151
146
  actionName: 'toggle light',
152
147
  onSuccess: (device) => `✓ ${device.device_name || device.name || device.id || device.node_id || 'Unknown'} toggled`,
153
148
  }, (device, controller) => {
154
- return new Promise((resolve) => {
155
- controller.toggleLight(device.node_id, (success, message) => {
156
- if (!success)
157
- throw new Error(message);
158
- resolve();
159
- });
160
- });
149
+ return commandCallbackPromise((callback) => controller.toggleLight(device.node_id, callback));
161
150
  }, async (controller) => {
162
151
  await controller.toggleAllLights((success, message) => {
163
- if (!success)
152
+ if (!success) {
153
+ process.exitCode = 1;
164
154
  console.error(`✗ Failed to toggle light: ${message}`);
155
+ }
165
156
  });
166
157
  });
167
158
  }
@@ -1 +1 @@
1
- {"version":3,"file":"power.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/power.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"power.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/power.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/preset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,8BAA8B,CAAC;AAGxF,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAejE;AAmDD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/preset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,8BAA8B,CAAC;AAGxF,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAqGjE;AA0DD,eAAe,cAAc,CAAC"}
@@ -1,16 +1,60 @@
1
1
  import chalk from 'chalk';
2
- import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
2
+ import { addStandardOptions, commandCallbackResult, requireBleController, runDeviceAction } from '../cmdUtils.js';
3
3
  export function registerPreset(program, deps) {
4
4
  const { asyncCommand } = deps;
5
5
  const preset = program.command('preset').description('Manage and recall presets');
6
+ addStandardOptions(preset
7
+ .command('update <id>')
8
+ .option('--name <name>', 'New name')
9
+ .description('Replace a local preset with its fixture current state')).action(asyncCommand(async (id, options) => {
10
+ const controller = await deps.createController(options.url, options.clientId, options.debug, options.backend);
11
+ try {
12
+ console.log(JSON.stringify(await commandCallbackResult((cb) => requireBleController(controller).updateSaved('presets', id, typeof options.name === 'string' ? options.name : undefined, cb)), null, 2));
13
+ }
14
+ finally {
15
+ await controller.disconnect();
16
+ }
17
+ }));
6
18
  addStandardOptions(preset.command('list').description('List all available presets')).action(asyncCommand(handlePresetList(deps)));
7
- addStandardOptions(preset.command('recall <device> <preset_id>').description('Recall a preset on a device')).action(asyncCommand(handlePresetRecall(deps)));
8
- addStandardOptions(preset.command('set <device> <preset_id>').description('Set a preset on a device (alias for recall)')).action(asyncCommand(handlePresetRecall(deps)));
19
+ addStandardOptions(preset.command('show <id>').description('Show the stored fixture, fan and effect state')).action(asyncCommand(async (id, options) => {
20
+ const controller = await deps.createController(options.url, options.clientId, options.debug, options.backend);
21
+ try {
22
+ console.log(JSON.stringify(await commandCallbackResult((cb) => requireBleController(controller).getSaved('presets', id, cb)), null, 2));
23
+ }
24
+ finally {
25
+ await controller.disconnect();
26
+ }
27
+ }));
28
+ addStandardOptions(preset
29
+ .command('recall <device> <preset_id>')
30
+ .option('--fade <seconds>', 'Transition to a steady preset over 0.5-20 seconds')
31
+ .description('Recall a preset on a device')).action(asyncCommand(handlePresetRecall(deps)));
32
+ addStandardOptions(preset
33
+ .command('set <device> <preset_id>')
34
+ .option('--fade <seconds>', 'Transition to a steady preset over 0.5-20 seconds')
35
+ .description('Set a preset on a device (alias for recall)')).action(asyncCommand(handlePresetRecall(deps)));
36
+ addStandardOptions(preset.command('save <device> <name>').description('Save a single-fixture local BLE preset')).action(asyncCommand(async (deviceQuery, name, options) => {
37
+ await runDeviceAction({ deps, options, deviceQuery, actionName: 'save preset' }, async (device, controller) => {
38
+ console.log(JSON.stringify(await commandCallbackResult((callback) => requireBleController(controller).savePreset(device.node_id, name, callback)), null, 2));
39
+ }, async () => {
40
+ throw new Error('A preset stores one fixture; use scene save for all lights');
41
+ });
42
+ }));
43
+ addStandardOptions(preset.command('delete <id>').description('Delete a local BLE preset')).action(asyncCommand(async (id, options) => {
44
+ const controller = await deps.createController(options.url, options.clientId, options.debug, options.backend);
45
+ try {
46
+ await commandCallbackResult((callback) => requireBleController(controller).deleteSaved('presets', id, callback));
47
+ console.log(`Preset ${id} deleted`);
48
+ }
49
+ finally {
50
+ await controller.disconnect();
51
+ }
52
+ }));
9
53
  }
10
54
  function handlePresetList(deps) {
11
55
  const { createController } = deps;
12
56
  return async (options) => {
13
- const controller = await createController(options.url, options.clientId, options.debug);
57
+ const controller = await createController(options.url, options.clientId, options.debug, options.backend);
14
58
  controller.getPresetList((success, message, data) => {
15
59
  if (success) {
16
60
  // biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
@@ -19,6 +63,7 @@ function handlePresetList(deps) {
19
63
  console.log(JSON.stringify(presets, null, 2));
20
64
  }
21
65
  else {
66
+ process.exitCode = 1;
22
67
  console.error(chalk.red(`Error getting preset list: ${message}`));
23
68
  }
24
69
  controller.disconnect();
@@ -32,22 +77,14 @@ function handlePresetRecall(deps) {
32
77
  options,
33
78
  deviceQuery,
34
79
  actionName: `recall preset ${presetId}`,
35
- }, (device, controller) => {
36
- return new Promise((resolve) => {
37
- const nodeId = device.node_id;
38
- controller.recallPreset(nodeId, presetId, (success, message) => {
39
- if (success) {
40
- console.log(chalk.green(`✓ Preset ${presetId} recalled on ${device.device_name || 'device'}`));
41
- }
42
- else {
43
- console.error(chalk.red(`✗ Failed to recall preset: ${message}`));
44
- }
45
- resolve();
46
- });
47
- });
80
+ }, async (device, controller) => {
81
+ const nodeId = device.node_id;
82
+ await commandCallbackResult((callback) => options.fade === undefined
83
+ ? controller.recallPreset(nodeId, presetId, callback)
84
+ : requireBleController(controller).recallSaved('presets', presetId, { target: nodeId, seconds: Number(options.fade) }, callback));
85
+ console.log(chalk.green(`✓ Preset ${presetId} ${options.fade === undefined ? 'recalled' : 'transitioned'} on ${device.device_name || 'device'}`));
48
86
  }, () => {
49
- console.log(chalk.yellow('Preset recall for "all" is not supported.'));
50
- return Promise.resolve();
87
+ throw new Error('Preset recall for "all" is not supported; use a saved scene');
51
88
  });
52
89
  };
53
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/preset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/preset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../../deviceControl/types.js';
3
+ export declare function registerPrograms(ble: Command, deps: CommandDeps): void;
4
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/program.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,8BAA8B,CAAC;AAwGhF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAmH/D"}
@@ -0,0 +1,199 @@
1
+ import { readFileSync, realpathSync } from 'node:fs';
2
+ import { setTimeout as delay } from 'node:timers/promises';
3
+ import { z } from 'zod';
4
+ import { MediaSourceSchema, mediaSamples } from '../../ble/media.js';
5
+ import { addStandardOptions, commandCallbackResult, requireBleController } from '../cmdUtils.js';
6
+ const Status = z
7
+ .object({
8
+ id: z.string(),
9
+ state: z.enum(['preparing', 'running', 'restoring', 'completed', 'cancelled', 'failed']),
10
+ error: z.string().optional(),
11
+ })
12
+ .passthrough();
13
+ const targets = (value) => value === undefined || value === 'all'
14
+ ? 'all'
15
+ : String(value)
16
+ .split(',')
17
+ .map((key) => key.trim());
18
+ async function run(deps, options, body) {
19
+ const source = body.source === undefined ? undefined : MediaSourceSchema.parse(body.source);
20
+ const localSource = source && (source.kind === 'camera' || source.kind === 'microphone') ? source : undefined;
21
+ if (localSource && options.background)
22
+ throw new Error('Live camera/microphone capture stays with this CLI; use files or timelines for background jobs');
23
+ const capture = new AbortController();
24
+ const controller = await deps.createController(options.url, options.clientId, options.debug, 'ble');
25
+ const ble = requireBleController(controller);
26
+ let interrupted = false;
27
+ const interrupt = () => {
28
+ interrupted = true;
29
+ capture.abort(new Error('CLI capture interrupted'));
30
+ };
31
+ process.once('SIGINT', interrupt);
32
+ process.once('SIGTERM', interrupt);
33
+ try {
34
+ const request = localSource
35
+ ? { ...body, source: { kind: 'samples', media: localSource.kind === 'camera' ? 'image' : 'audio' } }
36
+ : body;
37
+ let status = z
38
+ .object({ data: Status })
39
+ .parse(await commandCallbackResult((cb) => ble.startProgram(request, cb))).data;
40
+ if (interrupted) {
41
+ await commandCallbackResult((cb) => ble.stopProgram(status.id, cb));
42
+ process.exitCode = 130;
43
+ return;
44
+ }
45
+ if (options.background) {
46
+ console.log(JSON.stringify(status, null, 2));
47
+ return;
48
+ }
49
+ if (localSource) {
50
+ try {
51
+ for await (const sample of mediaSamples(localSource, capture.signal)) {
52
+ status = z
53
+ .object({ data: Status })
54
+ .parse(await commandCallbackResult((cb) => ble.getPrograms(status.id, cb))).data;
55
+ if (!['preparing', 'running'].includes(status.state))
56
+ break;
57
+ try {
58
+ await commandCallbackResult((cb) => ble.programSample(status.id, sample, cb));
59
+ }
60
+ catch (error) {
61
+ status = z
62
+ .object({ data: Status })
63
+ .parse(await commandCallbackResult((cb) => ble.getPrograms(status.id, cb))).data;
64
+ if (!['preparing', 'running'].includes(status.state))
65
+ break;
66
+ throw error;
67
+ }
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (!interrupted) {
72
+ await commandCallbackResult((cb) => ble.stopProgram(status.id, cb));
73
+ throw error;
74
+ }
75
+ }
76
+ }
77
+ while (['preparing', 'running', 'restoring'].includes(status.state)) {
78
+ if (interrupted) {
79
+ status = z
80
+ .object({ data: Status })
81
+ .parse(await commandCallbackResult((cb) => ble.stopProgram(status.id, cb))).data;
82
+ break;
83
+ }
84
+ await delay(500);
85
+ status = z
86
+ .object({ data: Status })
87
+ .parse(await commandCallbackResult((cb) => ble.getPrograms(status.id, cb))).data;
88
+ }
89
+ console.log(JSON.stringify(status, null, 2));
90
+ if (status.state === 'failed')
91
+ throw new Error(status.error ?? 'Program failed');
92
+ if (status.state === 'cancelled')
93
+ process.exitCode = interrupted ? 130 : 1;
94
+ }
95
+ finally {
96
+ capture.abort(new Error('CLI capture ended'));
97
+ process.removeListener('SIGINT', interrupt);
98
+ process.removeListener('SIGTERM', interrupt);
99
+ await controller.disconnect();
100
+ }
101
+ }
102
+ function common(command) {
103
+ if (!command.options.some((option) => option.long === '--targets'))
104
+ command.option('--targets <keys>', 'Comma-separated fixture keys/group IDs or all');
105
+ return addStandardOptions(command
106
+ .option('--background', 'Return the daemon-owned job ID without waiting')
107
+ .option('--no-restore', 'Keep final settings instead of restoring the initial state'));
108
+ }
109
+ export function registerPrograms(ble, deps) {
110
+ common(ble.command('program <file>').description('Run a validated JSON lighting timeline; at most two cues per second')).action(deps.asyncCommand(async (file, options) => {
111
+ const data = z.record(z.unknown()).parse(JSON.parse(readFileSync(file, 'utf8')));
112
+ await run(deps, options, {
113
+ ...data,
114
+ kind: 'timeline',
115
+ targets: options.targets === undefined ? (data.targets ?? 'all') : targets(options.targets),
116
+ restore: options.restore === false ? false : (data.restore ?? true),
117
+ });
118
+ }));
119
+ common(ble
120
+ .command('audio <file>')
121
+ .description('Drive brightness from a local audio file, without uploading audio')
122
+ .option('--seconds <seconds>', 'Maximum run duration, 1-1200 seconds', '30')
123
+ .option('--max <percent>', 'Maximum brightness', '100')
124
+ .option('--gain <gain>', 'Audio sensitivity', '3')).action(deps.asyncCommand(async (file, options) => {
125
+ await run(deps, options, {
126
+ kind: 'audio',
127
+ targets: targets(options.targets),
128
+ source: { kind: 'audio-file', file: realpathSync(file) },
129
+ duration: Number(options.seconds),
130
+ maxBrightness: Number(options.max),
131
+ gain: Number(options.gain),
132
+ restore: options.restore,
133
+ });
134
+ }));
135
+ common(ble
136
+ .command('microphone [device]')
137
+ .description('Explicitly capture local microphone audio to drive brightness; macOS permission required')
138
+ .option('--seconds <seconds>', 'Maximum run duration, 1-1200 seconds', '30')
139
+ .option('--max <percent>', 'Maximum brightness', '100')
140
+ .option('--gain <gain>', 'Audio sensitivity', '3')).action(deps.asyncCommand(async (device, options) => {
141
+ await run(deps, options, {
142
+ kind: 'audio',
143
+ targets: targets(options.targets),
144
+ source: { kind: 'microphone', device: Number(device ?? 0) },
145
+ duration: Number(options.seconds),
146
+ maxBrightness: Number(options.max),
147
+ gain: Number(options.gain),
148
+ restore: options.restore,
149
+ });
150
+ }));
151
+ common(ble
152
+ .command('picker')
153
+ .description('Drive HSI from a local image or live camera; no images are uploaded')
154
+ .requiredOption('--targets <keys>', 'HSI-capable fixture keys/group IDs')
155
+ .option('--image <file>', 'Use a local image instead of the camera')
156
+ .option('--camera <index>', 'Live camera index (default 0)')
157
+ .option('--region <x,y,width,height>', 'Optional pixel crop')
158
+ .option('--seconds <seconds>', 'Maximum run duration, 1-1200 seconds', '30')
159
+ .option('--max <percent>', 'Output brightness', '100')).action(deps.asyncCommand(async (options) => {
160
+ if (options.image && options.camera)
161
+ throw new Error('Choose an image or a camera, not both');
162
+ let region;
163
+ if (options.region !== undefined) {
164
+ const values = String(options.region)
165
+ .split(',')
166
+ .map((value) => value.trim());
167
+ if (values.length !== 4 || values.some((value) => !/^\d+$/.test(value)))
168
+ throw new Error('Region must be x,y,width,height integers');
169
+ const [x, y, width, height] = values.map(Number);
170
+ region = { x, y, width, height };
171
+ }
172
+ const source = options.image
173
+ ? { kind: 'image-file', file: realpathSync(String(options.image)), region }
174
+ : { kind: 'camera', device: Number(options.camera ?? 0), region };
175
+ await run(deps, options, {
176
+ kind: 'picker',
177
+ targets: targets(options.targets),
178
+ source,
179
+ duration: Number(options.seconds),
180
+ maxBrightness: Number(options.max),
181
+ restore: options.restore,
182
+ });
183
+ }));
184
+ addStandardOptions(ble.command('jobs <action> [id]').description('List, inspect or stop a running lighting program')).action(deps.asyncCommand(async (action, id, options) => {
185
+ if (!['list', 'status', 'stop'].includes(action) || (action !== 'list' && !id))
186
+ throw new Error('Use jobs list, jobs status ID, or jobs stop ID');
187
+ const controller = await deps.createController(options.url, options.clientId, options.debug, 'ble');
188
+ try {
189
+ const api = requireBleController(controller);
190
+ console.log(JSON.stringify(await commandCallbackResult((cb) => action === 'stop'
191
+ ? api.stopProgram(id ?? '', cb)
192
+ : api.getPrograms(action === 'list' ? undefined : id, cb)), null, 2));
193
+ }
194
+ finally {
195
+ await controller.disconnect();
196
+ }
197
+ }));
198
+ }
199
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/program.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quickshot.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/quickshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,8BAA8B,CAAC;AAGhF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAWpE;AA4CD,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"quickshot.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/quickshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,8BAA8B,CAAC;AAGhF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAsFpE;AA2DD,eAAe,iBAAiB,CAAC"}
@@ -1,15 +1,63 @@
1
1
  import chalk from 'chalk';
2
- import { addStandardOptions } from '../cmdUtils.js';
2
+ import { addStandardOptions, commandCallbackResult, requireBleController } from '../cmdUtils.js';
3
3
  export function registerQuickshot(program, deps) {
4
4
  const { asyncCommand } = deps;
5
5
  const quickshot = program.command('quickshot').description('Manage quickshots');
6
+ addStandardOptions(quickshot
7
+ .command('update <id>')
8
+ .option('--name <name>', 'New name')
9
+ .option('--targets <keys>', 'Replace with these fixture keys/group IDs')
10
+ .description('Replace a local quickshot with current fixture states')).action(asyncCommand(async (id, options) => {
11
+ const controller = await deps.createController(options.url, options.clientId, options.debug, options.backend);
12
+ try {
13
+ console.log(JSON.stringify(await commandCallbackResult((cb) => {
14
+ const ble = requireBleController(controller);
15
+ return options.targets === undefined
16
+ ? ble.updateSaved('quickshots', id, typeof options.name === 'string' ? options.name : undefined, cb)
17
+ : ble.replaceSaved('quickshots', id, typeof options.name === 'string' ? options.name : undefined, targetList(options.targets), cb);
18
+ }), null, 2));
19
+ }
20
+ finally {
21
+ await controller.disconnect();
22
+ }
23
+ }));
6
24
  addStandardOptions(quickshot.command('list').description('List all available quickshots')).action(asyncCommand(handleQuickshotList(deps)));
7
- addStandardOptions(quickshot.command('set <id>').description('Apply a quickshot')).action(asyncCommand(handleQuickshotSet(deps)));
25
+ addStandardOptions(quickshot.command('show <id>').description('Show every stored fixture, fan and effect state')).action(asyncCommand(async (id, options) => {
26
+ const controller = await deps.createController(options.url, options.clientId, options.debug, options.backend);
27
+ try {
28
+ console.log(JSON.stringify(await commandCallbackResult((cb) => requireBleController(controller).getSaved('quickshots', id, cb)), null, 2));
29
+ }
30
+ finally {
31
+ await controller.disconnect();
32
+ }
33
+ }));
34
+ addStandardOptions(quickshot
35
+ .command('set <id>')
36
+ .option('--fade <seconds>', 'Transition to a steady quickshot over 0.5-20 seconds')
37
+ .description('Apply a quickshot')).action(asyncCommand(handleQuickshotSet(deps)));
38
+ for (const action of ['save', 'delete']) {
39
+ const command = quickshot.command(`${action} <name-or-id>`).description(`${action} a local BLE quickshot`);
40
+ if (action === 'save')
41
+ command.option('--targets <keys>', 'Comma-separated fixture keys/group IDs; defaults to all');
42
+ addStandardOptions(command).action(asyncCommand(async (value, options) => {
43
+ const controller = await deps.createController(options.url, options.clientId, options.debug, options.backend);
44
+ try {
45
+ const ble = requireBleController(controller);
46
+ const result = await commandCallbackResult((callback) => action === 'save'
47
+ ? ble.saveSaved('quickshots', value, targetList(options.targets), callback)
48
+ : ble.deleteSaved('quickshots', value, callback));
49
+ console.log(JSON.stringify(result, null, 2));
50
+ }
51
+ finally {
52
+ await controller.disconnect();
53
+ }
54
+ }));
55
+ }
8
56
  }
9
57
  function handleQuickshotList(deps) {
10
58
  const { createController } = deps;
11
59
  return async (options) => {
12
- const controller = await createController(options.url, options.clientId, options.debug);
60
+ const controller = await createController(options.url, options.clientId, options.debug, options.backend);
13
61
  controller.getQuickshotList((success, message, data) => {
14
62
  if (success) {
15
63
  // biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
@@ -26,6 +74,7 @@ function handleQuickshotList(deps) {
26
74
  }
27
75
  }
28
76
  else {
77
+ process.exitCode = 1;
29
78
  console.error(chalk.red(`Error getting quickshot list: ${message}`));
30
79
  }
31
80
  controller.disconnect();
@@ -35,17 +84,30 @@ function handleQuickshotList(deps) {
35
84
  function handleQuickshotSet(deps) {
36
85
  const { createController } = deps;
37
86
  return async (id, options) => {
38
- const controller = await createController(options.url, options.clientId, options.debug);
39
- controller.setQuickshot(id, (success, message) => {
40
- if (success) {
41
- console.log(chalk.green(`Quickshot ${id} applied successfully`));
42
- }
43
- else {
44
- console.error(chalk.red(`Error applying quickshot: ${message}`));
45
- }
46
- controller.disconnect();
47
- });
87
+ const controller = await createController(options.url, options.clientId, options.debug, options.backend);
88
+ try {
89
+ await commandCallbackResult((callback) => options.fade === undefined
90
+ ? controller.setQuickshot(id, callback)
91
+ : requireBleController(controller).recallSaved('quickshots', id, { seconds: Number(options.fade) }, callback));
92
+ console.log(chalk.green(`Quickshot ${id} ${options.fade === undefined ? 'applied' : 'transitioned'} successfully`));
93
+ }
94
+ finally {
95
+ await controller.disconnect();
96
+ }
48
97
  };
49
98
  }
99
+ function targetList(value) {
100
+ if (value === undefined)
101
+ return undefined;
102
+ if (String(value).trim().toLowerCase() === 'all')
103
+ return 'all';
104
+ const keys = String(value)
105
+ .split(',')
106
+ .map((key) => key.trim())
107
+ .filter(Boolean);
108
+ if (!keys.length)
109
+ throw new Error('Targets must contain at least one fixture or group');
110
+ return keys;
111
+ }
50
112
  export default registerQuickshot;
51
113
  //# sourceMappingURL=quickshot.js.map