To allow other developers maximum usefulness from building apps with FarmBotJS, it's imperative that it has a verbose event logging system which apps can tap into.
{ verbosity : 1, ancestors : 0, message : 'Starting sequence "Water The Carrots".' }
{ verbosity : 2, ancestors : 0, message : 'Executing sequence "Attach Watering Tool".' } // called by parent sequence "Water The Carrots"
{ verbosity : 1, ancestors : 1, message : 'Starting sequence "Attach Watering Tool".' } // stepping into child sequence "Attach Watering Tool"
{ verbosity : 2, ancestors : 1, message : 'Moving to 2532,1230,0.' }
{ verbosity : 3, ancestors : 1, message : 'Homing Z-Axis.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 0,0,-230.' }
{ verbosity : 3, ancestors : 1, message : 'Homed Z-Axis.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 60,225,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 60,225,0.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 60,225,493.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 0,0,493.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 85,225,493.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 25,0,0.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 85,225,0.' }
{ verbosity : 3, ancestors : 1, message : 'Homing Z-Axis.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 0,0,-493.' }
{ verbosity : 3, ancestors : 1, message : 'Homed Z-Axis.' }
{ verbosity : 1, ancestors : 1, message : 'Finished sequence "Attach Watering Tool".' } // last event from child sequence
{ verbosity : 2, ancestors : 0, message : 'Executed sequence "Attach Watering Tool".' } // we're back in parent sequence "Water The Carrots"
{ verbosity : 2, ancestors : 0, message : 'Executing sequence "Water Carrot Row One".' } // called by parent sequence "Water The Carrots"
{ verbosity : 1, ancestors : 1, message : 'Starting sequence "Water Carrot Row One".' } // stepping into child sequence "Water Carrot Row One"
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,200,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 200,200,0.' }
{ verbosity : 2, ancestors : 1, message : 'Executing sequence "Medium Water".' } // called by parent sequence "Water Carrot Row One"
{ verbosity : 1, ancestors : 2, message : 'Starting sequence "Medium Water".' }
{ verbosity : 2, ancestors : 2, message : 'Activating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 1.' }
{ verbosity : 2, ancestors : 2, message : 'Waiting.' }
{ verbosity : 3, ancestors : 2, message : 'Wait 2300 milliseconds.' }
{ verbosity : 2, ancestors : 2, message : 'Deactivating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 0.' }
{ verbosity : 1, ancestors : 2, message : 'Finished sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Executed sequence "Medium Water".' } // we're back in parent sequence "Water Carrot Row One"
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,300,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 200,300,0.' }
{ verbosity : 2, ancestors : 1, message : 'Executing sequence "Medium Water".' } // called by parent sequence "Water Carrot Row One"
{ verbosity : 1, ancestors : 2, message : 'Starting sequence "Medium Water".' }
{ verbosity : 2, ancestors : 2, message : 'Activating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 1.' }
{ verbosity : 2, ancestors : 2, message : 'Waiting.' }
{ verbosity : 3, ancestors : 2, message : 'Wait 2300 milliseconds.' }
{ verbosity : 2, ancestors : 2, message : 'Deactivating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 0.' }
{ verbosity : 1, ancestors : 2, message : 'Finished sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Executed sequence "Medium Water".' } // we're back in parent sequence "Water Carrot Row One"
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,400,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 200,400,0.' }
{ verbosity : 2, ancestors : 1, message : 'Executing sequence "Medium Water".' } // called by parent sequence "Water Carrot Row One"
{ verbosity : 1, ancestors : 2, message : 'Starting sequence "Medium Water".' }
{ verbosity : 1, ancestors : 2, message : 'Activating Peripheral "Solenoid Valve".' }
{ verbosity : 1, ancestors : 2, message : 'Writing Pin 9. Value is now 1.' }
{ verbosity : 1, ancestors : 2, message : 'Waiting.' }
{ verbosity : 1, ancestors : 2, message : 'Wait 2300 milliseconds.' }
{ verbosity : 1, ancestors : 2, message : 'Deactivating Peripheral "Solenoid Valve".' }
{ verbosity : 1, ancestors : 2, message : 'Writing Pin 9. Value is now 0.' }
{ verbosity : 1, ancestors : 2, message : 'Finished sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Executed sequence "Medium Water".' } // we're back in parent sequence "Water Carrot Row One"
{ verbosity : 1, ancestors : 1, message : 'Finished sequence "Water Carrot Row One".' }
{ verbosity : 2, ancestors : 0, message : 'Executed sequence "Water Carrot Row One".' } // we're back in parent sequence "Water The Carrots"
{ verbosity : 2, ancestors : 0, message : 'Executing sequence "Water Carrot Row Two".' }
{ verbosity : 1, ancestors : 1, message : 'Starting sequence "Water Carrot Row Two".' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,200,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 200,200,0.' }
{ verbosity : 2, ancestors : 1, message : 'Executing sequence "Medium Water".' }
{ verbosity : 1, ancestors : 2, message : 'Starting sequence "Medium Water".' }
{ verbosity : 2, ancestors : 2, message : 'Activating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 1.' }
{ verbosity : 2, ancestors : 2, message : 'Waiting.' }
{ verbosity : 3, ancestors : 2, message : 'Wait 2300 milliseconds.' }
{ verbosity : 2, ancestors : 2, message : 'Deactivating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 0.' }
{ verbosity : 1, ancestors : 2, message : 'Finished sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Executed sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,300,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 200,300,0.' }
{ verbosity : 2, ancestors : 1, message : 'Executing sequence "Medium Water".' }
{ verbosity : 1, ancestors : 2, message : 'Starting sequence "Medium Water".' }
{ verbosity : 2, ancestors : 2, message : 'Activating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 1.' }
{ verbosity : 2, ancestors : 2, message : 'Waiting.' }
{ verbosity : 3, ancestors : 2, message : 'Wait 2300 milliseconds.' }
{ verbosity : 2, ancestors : 2, message : 'Deactivating Peripheral "Solenoid Valve".' }
{ verbosity : 3, ancestors : 2, message : 'Writing Pin 9. Value is now 0.' }
{ verbosity : 1, ancestors : 2, message : 'Finished sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Executed sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,400,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 200,400,0.' }
{ verbosity : 2, ancestors : 1, message : 'Executing sequence "Medium Water".' }
{ verbosity : 1, ancestors : 2, message : 'Starting sequence "Medium Water".' }
{ verbosity : 1, ancestors : 2, message : 'Activating Peripheral "Solenoid Valve".' }
{ verbosity : 1, ancestors : 2, message : 'Writing Pin 9. Value is now 1.' }
{ verbosity : 1, ancestors : 2, message : 'Waiting.' }
{ verbosity : 1, ancestors : 2, message : 'Wait 2300 milliseconds.' }
{ verbosity : 1, ancestors : 2, message : 'Deactivating Peripheral "Solenoid Valve".' }
{ verbosity : 1, ancestors : 2, message : 'Writing Pin 9. Value is now 0.' }
{ verbosity : 1, ancestors : 2, message : 'Finished sequence "Medium Water".' }
{ verbosity : 2, ancestors : 1, message : 'Executed sequence "Medium Water".' }
{ verbosity : 1, ancestors : 1, message : 'Finished sequence "Water Carrot Row Two".' }
{ verbosity : 2, ancestors : 0, message : 'Executed sequence "Water Carrot Row Two".' }
{ verbosity : 2, ancestors : 0, message : 'Executing sequence "Detach Watering Tool".' }
{ verbosity : 1, ancestors : 1, message : 'Starting sequence "Detach Watering Tool".' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 200,400,0.' }
{ verbosity : 3, ancestors : 1, message : 'Homing Z-Axis.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 0,0,0.' }
{ verbosity : 3, ancestors : 1, message : 'Homed Z-Axis.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 85,225,0.' }
{ verbosity : 3, ancestors : 1, message : 'Absolute move to 60,225,0.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 85,225,493.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 0,0,493.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 60,225,493.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to -25,0,0.' }
{ verbosity : 2, ancestors : 1, message : 'Moving to 60,225,0.' }
{ verbosity : 3, ancestors : 1, message : 'Homing Z-Axis.' }
{ verbosity : 3, ancestors : 1, message : 'Relative move to 0,0,-493.' }
{ verbosity : 3, ancestors : 1, message : 'Homed Z-Axis.' }
{ verbosity : 1, ancestors : 1, message : 'Finished sequence "Detach Watering Tool".' }
{ verbosity : 2, ancestors : 0, message : 'Executed sequence "Detach Watering Tool".' }
{ verbosity : 1, ancestors : 0, message : 'Finished sequence "Water The Carrots".' }
This is basically an app which sees the top-level sequence execute, command by command: