Skip to content

Change Log



  • The VSCode extension now provides more details on hover, as well as navigation from, for example, Science:CTD_Seabird.sea_water_salinity, to corresponding definition in C++ source location (when the lrauv-application codebase is available).

    As an example, includes:

    readData strategy="MinError" {
      while ( EnabledSeabird )
    Unlike many other cases, this kind of definition is not captured in *IF.h headers, but indirectly via calls to newUniversalWriter in module .cpp files.

  • Internal code reorg and cleanup.



  • The VSCode extension Reload Base Information command now also works for when using a published set of LRAUV definitions (that is, when using the LRAUV Revision setting). See 2.9.90 notes below for more details on this feature.
  • Internal adjustments.



This important release is primarily intended to better support TethysL users with no access to the lrauv-application codebase. The new support involves two main aspects:

  1. Publication of lrauv-application definitions by MBARI:

    • The definitions get published under This happens in two main ways:

      • As part of the regular lrauv-application nightly build process
      • LRAUV developers can also trigger the update whenever needed, and not only for master, but for any other branch as needed:

        make tl-publish-lrauv-info

      The published revision identifier will be the latest commit hash of the checked-out branch. Also, a soft link with the name of the branch is created for convenience.

  2. Now in VSCode, the user can instruct TethysL to use a published set of LRAUV definitions by indicating the corresponding revision identifier:

    • Open the VSCode Settings window and filter for example by "tethysl" to quickly find the TethysL settings. The new setting is named LRAUV Revision, and the attached screenshot shows master as the value.

    • Reload your workspace for any change in this setting to have effect (you can use the Developer: Reload Window command).

    • TethysL will now use those published definitions for all validations in the editor.
    • The user can also trigger a reload of the definitions at any time by running the usual Reload Base Information command:

      A summary of the reloaded definitions will be shown in the output window:


For CLI users, there's a corresponding new option --lrauv-revision for the compile command.



  • Maintenance release including these changes:

    • CLI compile command: If no --mission-dir option is given, then the compile command now defaults to current directory as base for any mission inserts.


      However, when the CLI discovers there's a lrauv-application codebase available depending on the given mission file path, then it will try to determine the associated Missions/ subdirectory as such base for any mission inserts.

    • VSCode extension: Hovering on some behavior settings was triggering an error instead of showing the associated information. Fixed.



  • Maintenance release:
    • Embedding LRAUV resources as of lrauv-application commit faa20085d2a (Jul 15), which includes new settings that are used in WHOI missions.
    • Some code cleanup and minor fixes.



  • First release with a proper parser for lrauv-application xyzModule/XyzModule.cpp files to extract the module information, that is, not using the traditional scripts there(*). The new parser already seems to be covering most, if not all of, what the traditional scripting has provided, and even including some fixes (for issues like missing entries, duplicates).

    (*) Note

    Our immediate plan is to have the new parser enabled for some time to facilitate testing by others, but the final parsing mechanism for LRAUV module information is still TBD.

  • Other updates:

    • VS Code extension: The user can now do searches in the resulting panel created by some commands (for example, upon running TethysL: Reload Base Information).
    • VS Code extension: Fixed regression that prevented navigating from a call refId to corresponding referenced element.
    • Fix: *IF.h parser would not always capture all namespace members.



  • Fix in xml-to-tethysl related with translation of comments in expression



  • Improved prettification of syslog statements: If no printed fragment has any comments associated, TethysL will split the set of fragments into new lines as needed so no individual line gets too long. Example of resulting formatting:
    syslog "Depth=" + Universal:depth~meter + ", Thermocline Depth = "
         + Derivation:TempGradientCalculator.thermoclineDepth~meter + ", Target depth = "
         + Derivation:TempGradientCalculator.targetDepth~meter



Further improvements toward facilitating XML migrations to TethysL.

2023-05-31 - 2.9.1

This release brings the following significant improvements:

  • The XML-to-TethysL translator now performs a more complete handling of expressions in terms of retaining the traditional but non-standard evaluation semantics performed by the LRAUV framework.


    At the TethysL level, expression evaluation continues to follow the standard practice in most common programming languages, in particular, in terms of operator precedence and associativity.

  • Reformatting of expressions involving nested sub-expressions now results in significantly more legible structure. As an example (taken from translation of the circle_sample mission):

    run when (
      and not ( FlagSamplingOngoing )
      and CntSamples <= NumSamplers
      and SampleOptionsSet
      and not ( SampleCompleted )
      and (
        CntSamples == 1 count
        and (
          and not ( OtherLRAUVSampleStartReceived )
          and elapsed ( ElapsedSinceStartOrLastFiring ) > MaxWaitFirstSample
          or (
            not ( UseOtherLRAUVSignals )
            and elapsed ( ElapsedSinceStartOrLastFiring ) > MaxWaitFirstSample
        or elapsed ( ElapsedSinceStartOrLastFiring ) > MaxWaitMustFire

Other adjustments include:

  • VS Code extension: For the "Format Document" command, now the user is notified when there's any syntax error that prevents the operation from proceeding.
  • Though redundant, now an optional bool "units" is allowed after a boolean literal expression (e.g., true bool or false bool). Such cases are found when translating from some XML missions, so this is intended to further facilitate the migration efforts.
  • Improved prettification of not expressions.
  • Fix in the XML-to-TethysL translator: Any """ in a <Description> content is now replaced with something else (''') in the generated TethysL (otherwise it would conflict with the regular """ delimiter).



  • TethysL VS Code extension enhancements, including new commands for mission regression testing and xml/tx diffing to facilitate XML-to-TethysL conversions.



  • Fixes in the VSCode TethysL extension regarding the automatic download of its dependencies at activation time. (In particular, various fixes related with the download of Java when needed. For more details, see the VSCode extension page. Tested on Windows and Linux machines with no prior Java installation.)



  • Fixed a regression exposed when opening the lrauv-application codebase directly in VSCode. Thanks, Quinn, for reporting and testing!



  • Various code adjustments and documentation updates toward resuming the conversion of XML scripts to TethysL.



  • Several fixes in both the VSCode extension and the TethysL language server, so the system should now be functional on the Windows platform. Please let us know if you encounter any issues.
  • Fixes and adjustments mainly related with the validation of arrays, that is, arguments or output variables using the foo[1..10] syntax as supported by TethysL. As an example, one can now have an argument definition CartridgeType[1..60] and also an output variable CartridgeType, which was previously not allowed.



  • Several internal dependencies updated, and some fixes.

  • Note: The Java-based release is the recommended and fully tested mechanism to install the TethysL CLI. The binary releases continue to be auto-generated from the Java one, but, unfortunately, are proving unreliable in general. If you cannot use the Java based release, please let us know to determine possible solutions.



  • TethysL CLI: Various internal adjustments, including the direct parsing of C++ module information to support the case of possibly using a different branch or tag of the lrauv-application codebase.

  • TethysL VSCode extension 2.4.5 (and requiring TethysL CLI 2.4.5+), now includes a command for the conversion of the currently open XML script to TethysL. See the Migrating from XML page for more details.



  • Language: Related with the array/macro extensions, one can now use a static, simple addition/subtraction expression in two general cases:

    • Anywhere where a number expression can be used, e.g., $( $k - 1 ) count

      Note: The $( ... ) construct is to group the static expression itself.

    • Array index expression, e.g., Latitude[$k - 1]

      Note: The usual [ ... ] serves as the grouping construct for the static expression.

    "Static" here means that the expression is only to be evaluated at compile time, with the resulting value used in the generated XML. The expression can only involve literal numbers (excluding NaN), and macro variable. Typically, this feature is to be used within the context of a macro.

    Here's an example (as used in _examples/

    macro $k = 2..5 {
      aggregate Leg$k {
        run in sequence
          break if ( leg <= $( $k - 1 ) count )
          assign in sequence {
            Lat[$k - 1] = NaN degree
            Lon[$k - 1] = NaN degree
  • Validation adjustments for macro.

  • LSP: Added basic references handling. (For now, both references and definitions are handled in the same way.)



  • Now, explicit extension for all inserts is required. This avoids confusion given that both .tl and .xml inserts are supported, and also fixes an interlinking issue in the markdown generation.
  • Various adjustments and fixes (source reformatting, markdown generation).





  • TethysL CLI 2.0.5 released, with binary executables available for Linux, macOS, and Windows. See CLI.

  • VSCode extension 2.0.5 published (requires TethysL CLI 2.0.5). See VSCode.



  • TethysL CLI 1.9.0 and VSCode extension 1.9.0 released.

  • TethysL CLI: the markdown command (which supports the automatic generation of some content exposed here) has been expanded to also generate pages for Units and Universals.

  • Various LSP related enhancements

    • Smart handling of the lrauv-application "workspace" for resolution of inserts. That is, in this case, the server determines the actual base mission directory to be Missions/ (instead of the workspace directory itself).
    • Improved go-to-definition functionality: when dealing with a lrauv-application workspace, a behavior resolution will now point to corresponding IF*.h header file, and even to the specific line when resolving a particular setting.
  • Language syntax adjustment: Quotes are not needed anymore for the filename in an insert construct. So, one now writes insert Insert/NeedComms ... instead of insert "Insert/NeedComms" ....

  • Various validation improvements and fixes in the language engine.

  • XML generation now with https:// for schema hrefs (instead of http://). This is a pretty standard best practice, and should not have any impact on the LRAUV.

  • Reformatting of a .tl source now simplifies the behavior setting IDs (by removing the redundant prefix corresponding to the behavior itself).

    As an example, with this source (originally, a direct translation from some XML file):

    behavior Trigger:PeakDetectVsDepth {
      run in sequence
      set Trigger:PeakDetectVsDepth.detect = Universal:mass_concentration_of_chlorophyll_in_sea_water
      set Trigger:PeakDetectVsDepth.timeWindowPeakReport = TimeWindowPeakReport
      set Trigger:PeakDetectVsDepth.windowLength = LowPassWindowLength
      set Trigger:PeakDetectVsDepth.medianFilterLength = MedianFilterLen
      set Trigger:PeakDetectVsDepth.shallowBound = PeakShallowBound
      set Trigger:PeakDetectVsDepth.deepBound = PeakDeepBound
      set Trigger:PeakDetectVsDepth.depthChangeThresh = DepChangeThreshForAttitudeFlip
      outputArg PeakChl = Trigger:PeakDetectVsDepth.peakDetect
      outputArg PeakChlDepth = Trigger:PeakDetectVsDepth.peakDepth
      outputArg PeakChlTemperature = Trigger:PeakDetectVsDepth.peakTemperature
      outputArg PeakChlLatitude = Trigger:PeakDetectVsDepth.peakLatitude
      outputArg PeakChlLongitude = Trigger:PeakDetectVsDepth.peakLongitude

    the reformatting results in the following, semantically equivalent but more legible:

    behavior Trigger:PeakDetectVsDepth {
      run in sequence
      set detect = Universal:mass_concentration_of_chlorophyll_in_sea_water
      set timeWindowPeakReport = TimeWindowPeakReport
      set windowLength = LowPassWindowLength
      set medianFilterLength = MedianFilterLen
      set shallowBound = PeakShallowBound
      set deepBound = PeakDeepBound
      set depthChangeThresh = DepChangeThreshForAttitudeFlip
      outputArg PeakChl = peakDetect
      outputArg PeakChlDepth = peakDepth
      outputArg PeakChlTemperature = peakTemperature
      outputArg PeakChlLatitude = peakLatitude
      outputArg PeakChlLongitude = peakLongitude



  • The Tethysl CLI can now generate documentation pages for all .tl missions under a given directory.

  • The behavior construct now always require a body and the specification of the execution mode, which now goes in the body and not in the "header".

    This is intended for consistency with other constructs.

    Example, now:

    behavior Guidance:Buoyancy {
      run in parallel
      set position = BuoyancyNeutral


    behavior Guidance:Buoyancy in parallel {
      set position = BuoyancyNeutral
  • Delimitation of test_code blocks is now with {{{ and }}}.


  • TethysL engine undergoing enhancements mainly toward implementing the Language Server Protocol so the editing capabilities can be leveraged in diverse development tools. Initial focus on VS Code. Details will be captured in the vscode section.

(Older change notes here.)