JupyterLab Changelog¶
v0.34.0¶
August 18, 2018¶
See the JupyterLab 0.34.0 milestone on GitHub for the full list of pull requests and issues closed.
Key Features¶
- Notebooks, consoles, and text files now have access to completions for local tokens.
- Python 3.5+ is now required to use JupyterLab. Python 2 kernels can still be run within JupyterLab.
- Added the pipe (
|) character as a CSV delimiter option. - Added “Open From Path…”” to top level
Filemenu. - Added “Copy Download Link” to context menu for files.
Changes for Developers¶
Notebooks, consoles, and text files now have access to completions for local tokens. If a text file has a running kernel associated with its path (as happens with an attached console), it also gets completions and tooltips from that kernel. (#5049)
The
FileBrowserwidget has a new constructor optionrefreshInterval, allowing the creator to customize how often the widget polls the storage backend. This can be useful to prevent rate-limiting in certain contexts. (#5048)The application shell now gets a pair of CSS data attributes indicating the current theme, and whether it is light or dark. Extension authors can write CSS rules targeting these to have their extension UI elements respond to the application theme. For instance, to write a rule targeting whether the theme is overall light or dark, you can use
[data-theme-light="true"] your-ui-class { background-color: white; } [data-theme-light="false"] your-ui-class { background-color: black; }The theme name can also be targeted by writing CSS rules for
data-theme-name. (#5078)The
IThemeManagerinterface now exposes a signal forthemeChanged, allowing extension authors to react to changes in the theme. Theme extensions must also provide a new boolean propertyisLight, declaring whether they are broadly light colored. This data allows third-party extensions to react better to the active application theme. (#5078)Added a patch to update the
uploadsfor eachFileBrowserModelinstantly whenever a file upload errors. Previously, the upload that erred was only being removed from uploads upon an update. This would allow the status bar component and other extensions that use theFileBrowserModelto be more precise. (#5077)Cell IDs are now passed in the shell message as part of the cell metadata when a cell is executed. This helps in developing reactive kernels. (#5033)
The IDs of all deleted cells since the last run cell are now passed as part of the cell metadata on execution. The IDs of deleted cells since the last run cell are stored as
deletedCellsinNotebookModel. This helps in developing reactive kernels. (#5037)The
ToolbarButtoninapputilshas been refactored with an API change and now uses a React componentToolbarButtonComponentto render its children. It is now adivwith a singlebuttonchild, which in turn as twospanelements for an icon and text label. Extensions that were using theclassNameoptions should rename it asiconClassName. TheclassNameoptions still exists, but it used as the CSS class on thebuttonelement itself. The API changes were done to accommodate styling changes to the button. (#5117)The
Toolbar.createFromCommandfunction has been replaced by a dedicatedToolbarButtonsubclass calledCommandToolbarButton, that wraps a similarly named React component. (#5117)The design and styling of the right and left sidebars tabs has been improved to address #5054. We are now using icons to render tabs for the extensions we ship with JupyterLab and extension authors are encouraged to do the same (text labels still work). Icon based tabs can be used by removing
widget.captionand addingwidget.iconClass = '<youriconclass> jp-SideBar-tabIcon';. (#5117)The style of buttons in JupyterLab has been updated to a borderless design. (#5117)
A new series of helper CSS classes for stying SVG-based icons at different sizes has been added:
jp-Icon,jp-Icon-16,jp-Icon-18,jp-Icon-20.The rank of the default sidebar widget has been updated. The main change is giving the extension manager a rank of
1000so that it appears at the end of the default items.Python 3.5+ is now required to use JupyterLab. Python 2 kernels can still be run within JupyterLab. (#5119)
JupyterLab now uses
yarn 1.9.4(aliased asjlpm), which now allows uses to use Node 10+. (#5121)Clean up handling of
baseUrlandwsURLforPageConfigandServerConnection. (#5111)
Other Changes¶
- Added the pipe (
|) character as a CSV delimiter option. (#5112) - Added
Open From Path...to top levelFilemenu. (#5108) - Added a
saveStatesignal to the document context object. (#5096) - Added “Copy Download Link” to context menu for files. (#5089)
- Extensions marked as
deprecatedare no longer shown in the extension manager. (#5058) - Remove
InandOuttext from cell prompts. Shrunk the prompt width from 90px to 64px. In the light theme, set the prompt colors of executed console cells to active prompt colors and reduced their opacity to 0.5. In the dark theme, set the prompt colors of executed console cells to active prompt colors and set their opacity to 1. (#5097 and #5130)
Bug Fixes¶
- Fixed a bug in the rendering of the “New Notebook” item of the command palette. (#5079)
- We only create the extension manager widget if it is enabled. This prevents
unnecessary network requests to
npmjs.com. (#5075) - The
runningpanel now shows the running sessions at startup. (#5118) - Double clicking a file in the file browser always opens it rather than sometimes selecting it for a rename. (#5101)
v0.33.0¶
July 26, 2018¶
See the JupyterLab 0.33.0 milestone on GitHub for the full list of pull requests and issues closed.
Key Features:¶
No longer in beta¶
In JupyterLab 0.33, we removed the “Beta” label to better signal that JupyterLab is ready for users to use on a daily basis. The extension developer API is still being stabilized. See the release blog post for details. (#4898, #4920)
Workspaces¶
We added new workspace support, which enables you to have multiple saved layouts, including in different browser windows. See the workspace documentation for more details. (#4502, #4708, #4088, #4041 #3673, #4780)
Keyboard shortcuts¶
- “Save As…” given the keyboard shortcut
Ctrl/Cmd Shift S. (#4560) - “Run All Cells” given the keyboard shortcut
Ctrl/Cmd Shift Enter. (#4558) - “notebook:change-to-cell-heading-X” keyboard shortcuts (and commands) renamed to “notebook:change-cell-to-heading-X” for X=1…6. This fixes the notebook command-mode keyboard shortcuts for changing headings. (#4430)
- The console execute shortcut can now be set to either
EnterorShift Enteras a Console setting. (#4054)
Command palette items¶
“Notebook” added to the command palette to open a new notebook. (#4812)
“Run Selected Text or Current Line in Console” added to the command palette to run the selected text or current line from a notebook in a console. A default keyboard shortcut for this command is not yet provided, but can be added by users with the
notebook:run-in-consolecommand. To add a keyboard shortcutCtrl Gfor this command, use the “Settings” | “Advanced Settings Editor” menu item to open the “Keyboard Shortcuts” advanced settings, and add the following JSON in the shortcut JSON object in the User Overrides pane (adjust the actual keyboard shortcut if you wish). (#3453, #4206, #4330)"notebook:run-in-console": { "command": "notebook:run-in-console", "keys": ["Ctrl G"], "selector": ".jp-Notebook.jp-mod-editMode" }
The command palette now renders labels, toggled state, and keyboard shortcuts in a more consistent and correct way. (#4533, #4510)
Settings¶
Larger file uploads¶
- Support for larger file uploads (>15MB) when using Jupyter notebook server version >= 5.1. (#4224)
Extension management and installation¶
- New extension manager for installing JupyterLab extensions from npm within the JupyterLab UI. You can enable this from the Advanced Settings interface. (#4682, #4925)
- Please note that to install extensions in JupyterLab, you must use NodeJS version 9 or earlier (i.e., not NodeJS version 10). We will upgrade yarn, with NodeJS version 10 support, when a bug in yarn is fixed. (#4804)
Interface changes¶
- Wider tabs in the main working area to show longer filenames. (#4801)
- Initial kernel selection for a notebook or console can no longer be canceled: the user must select a kernel. (#4596)
- Consoles now do not display output from other clients by default. A new “Show All Kernel Activity” console context menu item has been added to show all activity from a kernel in the console. (#4503)
- The favicon now shows the busy status of the kernels in JupyterLab. (#4361, #3957, #4966)
Renderers¶
- JupyterLab now ships with a Vega4 renderer by default (upgraded from Vega3). (#4806)
- The HTML sanitizer now allows some extra tags in rendered HTML,
including
kbd,sup, andsub. (#4618) - JupyterLab now recognizes the
.tsvfile extension as tab-separated files. (#4684) - Javascript execution in notebook cells has been re-enabled. (#4515)
Changes for developers¶
- A new signal for observing application dirty status state changes. (#4840)
- A new signal for observing notebook cell execution. (#4740, #4744)
- A new
anyMessagesignal for observing any message a kernel sends or receives. (#4437) - A generic way for different widgets to register a “Save with extras” command that appears in the File menu under save. (#3981)
- A new API for removing groups from a JupyterLab menu.
addGroupnow returns anIDisposablewhich can be used to remove the group.removeGrouphas been removed. (#4890) - The
Launchernow uses commands from the applicationCommandRegistryto launch new activities. Extension authors that add items to the launcher will need to update them to use commands. (#4757) - There is now a top-level
addToBottomAreafunction in the application, allowing extension authors to add bottom panel items like status bars. (#4752) - Rendermime extensions can now indicate that they are the default rendered widget factory for a file-type. For instance, the default widget for a markdown file is a text editor, but the default rendered widget is the markdown viewer. (#4692)
- Add new workspace REST endpoints to
jupyterlab_launcherand make them available in@jupyterlab/services. (#4841) - Documents created with a mimerenderer extension can now be accessed
using an
IInstanceTrackerwhich tracks them. Include the tokenIMimeDocumentTrackerin your plugin to access this. TheIInstanceTrackerinterface has also gained convenience functionsfindandfilterto simplify iterating over instances. (#4762) - RenderMime render errors are now displayed to the user. (#4465)
getNotebookVersionis added to thePageConfigobject. (#4224)- The session
kernelChangedsignal now contains both the old kernel and the new kernel to make it easy to unregister things from the old kernel. (#4834) - The
connectTofunctions for connecting to kernels and sessions are now synchronous (returning a connection immediately rather than a promise). The DefaultSessioncloneandupdatemethods are also synchronous now. (#4725) - Kernel message processing is now asynchronous, which guarantees the
order of processing even if a handler is asynchronous. If a kernel
message handler returns a promise, kernel message processing is
paused until the promise resolves. The kernel’s
anyMessagesignal is emitted synchronously when a message is received before asynchronous message handling, and theiopubMessageandunhandledMessagesignals are emitted during asynchronous message handling. These changes mean that the commonMsgandonClosehandlers and the kernel futureonReply,onIOPub, andonStdinhandlers, as well as the comm target and message hook handlers, may be asynchronous and return promises. (#4697) - Kernel comm targets and message hooks now are unregistered with
removeCommTargetandremoveMessageHook, instead of using disposables. The correspondingregisterCommTargetandregisterMessageHookfunctions now return nothing. (#4697) - The kernel
connectToCommfunction is synchronous, and now returns the comm rather than a promise to the comm. (#4697) - The
KernelFutureHandlerclassexpectShellconstructor argument is renamed toexpectReply. (#4697) - The kernel future
donereturned promise now resolves to undefined if there is no reply message. (#4697) - The
IDisplayDataMsgis updated to have the optionaltransientkey, and a newIUpdateDisplayDataMsgtype was added for update display messages. (#4697) - The
uuidfunction from@jupyterlab/coreutilsis removed. Instead importUUIDfrom@phosphor/coreutilsand useUUID.uuid4(). (#4604) - Main area widgets like the launcher and console inherit from a common
MainAreaWidgetclass which provides a content area (.content) and a toolbar (.toolbar), consistent focus handling and activation behavior, and a spinner displayed until the givenrevealpromise is resolved. Document widgets, like the notebook and text editor and other documents opened from the document manager, implement theIDocumentWidgetinterface (instead ofDocumentRegistry.IReadyWidget), which builds onMainAreaWidgetand adds a.contextattribute for the document context and makes dirty handling consistent. Extension authors may consider inheriting from theMainAreaWidgetorDocumentWidgetclass for consistency. Several effects from these changes are noted below. (#3499, #4453)- The notebook panel
.notebookattribute is renamed to.content. - The text editor is now the
.contentof aDocumentWidget, so the top-level editor widget has a toolbar and the editor itself iswidget.content.editorrather than justwidget.editor. - Mime documents use a
MimeContentwidget embedded inside of aDocumentWidgetnow. - Main area widgets and document widgets now have a
revealedpromise which resolves when the widget has been revealed (i.e., the spinner has been removed). This should be used instead of thereadypromise.
- The notebook panel
Changes in the JupyterLab code infrastructure include:
- The JupyterLab TypeScript codebase is now compiled to ES2015 (ES6)
using TypeScript 2.9. We also turned on the TypeScript
esModuleInteropflag to enable more natural imports from non-es2015 JavaScript modules. With the update to ES2015 output, code generated from async/await syntax became much more manageable, so we have started to use async/await liberally throughout the codebase, especially in tests. Because we use Typedoc for API documentation, we still use syntax compatible with TypeScript 2.7 where Typedoc is used. Extension authors may have some minor compatibility updates to make. If you are writing an extension in TypeScript, we recommend updating to TypeScript 2.9 and targeting ES2015 output as well. (#4462, #4675, #4714, #4797) - The JupyterLab codebase is now formatted using Prettier. By default the development environment installs a pre-commit hook that formats your staged changes. (#4090)
- Updated build infrastructure using webpack 4 and better typing. (#4702, #4698)
- Upgraded yarn to version 1.6. Please note that you must use NodeJS version 9 or earlier with JupyterLab (i.e., not NodeJS version 10). We will upgrade yarn, with NodeJS version 10 support, when a bug in yarn is fixed. (#4804)
- Various process utilities were moved to
jupyterlab_launcher. (#4696)
Other fixes¶
- Fixed a rendering bug with the Launcher in single-document mode. (#4805)
- Fixed a bug where the native context menu could not be triggered in a notebook cell in Chrome. (#4720)
- Fixed a bug where the cursor would not show up in the dark theme. (#4699)
- Fixed a bug preventing relative links from working correctly in
alternate
IDrives. (#4613) - Fixed a bug breaking the image viewer upon saving the image. (#4602)
- Fixed the font size for code blocks in notebook Markdown headers. (#4617)
- Prevented a memory leak when repeatedly rendering a Vega chart. (#4904)
- Support dropped terminal connection re-connecting. (#4763, #4802)
- Use
require.ensureinvega4-extensionto lazily loadvega-embedand its dependencies on first render. (#4706) - Relative links to documents that include anchor tags will now correctly scroll the document to the right place. (#4692)
- Fix default settings JSON in setting editor. (#4591, #4595)
- Fix setting editor pane layout’s stretch factor. (#2971, #4772)
- Programmatically set settings are now output with nicer formatting. (#4870)
- Fixed a bug in displaying one-line CSV files. (#4795, #4796)
- Fixed a bug where JSON arrays in rich outputs were collapsed into strings. (#4480)
Beta 2 (v0.32.0)¶
Apr 16, 2018¶
This is the second in the JupyterLab Beta series of releases. It contains many enhancements, bugfixes, and refinements, including:
- Better handling of a corrupted or invalid state database. (#3619, #3622, #3687, #4114).
- Fixing file dirty status indicator. (#3652).
- New option for whether to autosave documents. (#3734).
- More commands in the notebook context menu. (#3770, #3909)
- Defensively checking for completion metadata from kernels. (#3888)
- New “Shutdown all” button in the Running panel. (#3764)
- Performance improvements wherein non-focused documents poll the server less. (#3931)
- Changing the keyboard shortcut for singled-document-mode to something less easy to trigger. (#3889)
- Performance improvements for rendering text streams, especially around progress bars. (#4045).
- Canceling a “Restart Kernel” now functions correctly. (#3703).
- Defer loading file contents until after the application has been restored. (#4087).
- Ability to rotate, flip, and invert images in the image viewer. (#4000)
- Major performance improvements for large CSV viewing. (#3997).
- Always show the context menu in the file browser, even for an empty directory. (#4264).
- Handle asynchronous comm messages in the services library more
correctly (Note: this means
@jupyterlab/servicesis now at version 2.0!) ([#4115](https://github.com/jupyterlab/jupyterlab/issues/4115)). - Display the kernel banner in the console when a kernel is restarted to mark the restart ([#3663](https://github.com/jupyterlab/jupyterlab/issues/3663)).
- Many tweaks to the UI, as well as better error handling.
Beta 1 (v0.31.0)¶
Jan 11, 2018¶
- Add a
/treehandler andCopy Shareable Linkto file listing right click menu: https://github.com/jupyterlab/jupyterlab/pull/3396 - Experimental support for saved workspaces: #3490, #3586
- Added types information to the completer: #3508
- More improvements to the top level menus: https://github.com/jupyterlab/jupyterlab/pull/3344
- Editor settings for notebook cells: https://github.com/jupyterlab/jupyterlab/pull/3441
- Simplification of theme extensions: https://github.com/jupyterlab/jupyterlab/pull/3423
- New CSS variable naming scheme: https://github.com/jupyterlab/jupyterlab/pull/3403
- Improvements to cell selection and dragging: https://github.com/jupyterlab/jupyterlab/pull/3414
- Style and typography improvements: https://github.com/jupyterlab/jupyterlab/pull/3468 https://github.com/jupyterlab/jupyterlab/pull/3457 https://github.com/jupyterlab/jupyterlab/pull/3445 https://github.com/jupyterlab/jupyterlab/pull/3431 https://github.com/jupyterlab/jupyterlab/pull/3428 https://github.com/jupyterlab/jupyterlab/pull/3408 https://github.com/jupyterlab/jupyterlab/pull/3418
v0.30.0¶
Dec 05, 2017¶
- Semantic menus: https://github.com/jupyterlab/jupyterlab/pull/3182
- Settings editor now allows comments and provides setting validation: https://github.com/jupyterlab/jupyterlab/pull/3167
- Switch to Yarn as the package manager: https://github.com/jupyterlab/jupyterlab/pull/3182
- Support for carriage return in outputs: #2761
- Upgrade to TypeScript 2.6: https://github.com/jupyterlab/jupyterlab/pull/3288
- Cleanup of the build, packaging, and extension systems.
jupyter labextension installis now the recommended way to install a local directory. Local directories are considered linked to the application. cf https://github.com/jupyterlab/jupyterlab/pull/3182 --core-modeand--dev-modeare now semantically different.--core-modeis a version of JupyterLab using released JavaScript packages and is what we ship in the Python package.--dev-modeis for unreleased JavaScript and shows the red banner at the top of the page. https://github.com/jupyterlab/jupyterlab/pull/3270
v0.29.2¶
Nov 17, 2017¶
Bug fix for file browser right click handling. https://github.com/jupyterlab/jupyterlab/issues/3019
v0.28.0¶
Oct 16, 2017¶
This release generally focuses on developer and extension author enhancements and general bug fixes.
- Plugin id and schema file conventions change. https://github.com/jupyterlab/jupyterlab/pull/2936.
- Theme authoring conventions change. #3061
- Enhancements to enabling and disabling of extensions. #3078
- Mime extensions API change (
name->idand new naming convention). #3078 - Added a
jupyter lab --watchmode for extension authors. #3077 - New comprehensive extension authoring tutorial. #2921
- Added the ability to use an alternate LaTeX renderer. #2974
- Numerous bug fixes and style enhancements.
v0.27.0¶
Aug 23, 2017¶
- Added support for dynamic theme loading. https://github.com/jupyterlab/jupyterlab/pull/2759
- Added an application splash screen. https://github.com/jupyterlab/jupyterlab/pull/2899
- Enhancements to the settings editor. https://github.com/jupyterlab/jupyterlab/pull/2784
- Added a PDF viewer. #2867
- Numerous bug fixes and style improvements.
v0.26.0¶
Jul 21, 2017¶
- Implemented server side handling of users settings: https://github.com/jupyterlab/jupyterlab/pull/2585
- Revamped the handling of file types in the application - affects document and mime renderers: https://github.com/jupyterlab/jupyterlab/pull/2701
- Updated dialog API - uses virtual DOM instead of raw DOM nodes and better use of the widget lifecycle: https://github.com/jupyterlab/jupyterlab/pull/2661
v0.25.0¶
Jul 07, 2017¶
- Added a new extension type for mime renderers, with the
vega2-extensionas a built-in example. Also overhauled the rendermime interfaces. https://github.com/jupyterlab/jupyterlab/pull/2488 https://github.com/jupyterlab/jupyterlab/pull/2555 https://github.com/jupyterlab/jupyterlab/pull/2595 - Finished JSON-schema based settings system, using client-side storage for now. https://github.com/jupyterlab/jupyterlab/pull/2411
- Overhauled the launcher design. https://github.com/jupyterlab/jupyterlab/pull/2506 https://github.com/jupyterlab/jupyterlab/pull/2580
- Numerous bug fixes and style updates.
v0.24.0¶
Jun 16, 2017¶
- Overhaul of the launcher. #2380
- Initial implementation of client-side settings system. #2157
- Updatable outputs. #2439
- Use new Phosphor Datagrid for CSV viewer. #2433
- Added ability to enable/disable extensions without rebuilding. #2409
- Added language and tab settings for the file viewer. #2406
- Improvements to real time collaboration experience. #2387 #2333
- Compatibility checking for extensions. #2410
- Numerous bug fixes and style improvements.
v0.23.0¶
Jun 02, 2017¶
- Chat box feature. https://github.com/jupyterlab/jupyterlab/pull/2118
- Collaborative cursors. https://github.com/jupyterlab/jupyterlab/pull/2139
- Added concept of Drive to ContentsManager. https://github.com/jupyterlab/jupyterlab/pull/2248
- Refactored to enable switching the theme. https://github.com/jupyterlab/jupyterlab/pull/2283
- Clean up the APIs around kernel execution. https://github.com/jupyterlab/jupyterlab/pull/2266
- Various bug fixes and style improvements.
v0.22.0¶
May 18, 2017¶
- Export To… for notebooks. https://github.com/jupyterlab/jupyterlab/pull/2200
- Change kernel by clicking on the kernel name in the notebook. https://github.com/jupyterlab/jupyterlab/pull/2195
- Improved handling of running code in text editors. https://github.com/jupyterlab/jupyterlab/pull/2191
- Can select file in file browser by typing: https://github.com/jupyterlab/jupyterlab/pull/2190
- Ability to open a console for a notebook. https://github.com/jupyterlab/jupyterlab/pull/2189
- Upgrade to Phosphor 1.2 with Command Palette fuzzy matching improvements. #1182
- Rename of widgets that had
Widgetin the name and associated package names. https://github.com/jupyterlab/jupyterlab/pull/2177 - New
jupyter labhubcommand to launch JupyterLab on JupyterHub: https://github.com/jupyterlab/jupyterlab/pull/2222 - Removed the
utilsfrom@jupyterlab/servicesin favor ofPageConfigandServerConnection. https://github.com/jupyterlab/jupyterlab/pull/2173 https://github.com/jupyterlab/jupyterlab/pull/2185 - Cleanup, bug fixes, and style updates.
v0.20.0¶
Apr 21, 2017¶
Release Notes:
- Overhaul of extension handling, see updated docs for users and developers. https://github.com/jupyterlab/jupyterlab/pull/2023
- Added single document mode and a
Tabssidebar. https://github.com/jupyterlab/jupyterlab/pull/2037 - More work toward real time collaboration - implemented a model database interface that can be in-memory by real time backends. https://github.com/jupyterlab/jupyterlab/pull/2039
Numerous bug fixes and improvements.
v0.19.0¶
Apr 04, 2017¶
Mainly backend-focused release with compatibility with Phosphor 1.0 and a big refactor of session handling (the ClientSession class) that provides a simpler object for classes like notebooks, consoles, inspectors, etc. to use to communicate with the API. Also includes improvements to the development workflow of JupyterLab itself after the big split.
https://github.com/jupyterlab/jupyterlab/pull/1984 https://github.com/jupyterlab/jupyterlab/pull/1927
v0.18.0¶
Mar 21, 2017¶
- Split the repository into multiple packages that are managed using the lerna build tool. https://github.com/jupyterlab/jupyterlab/issues/1773
- Added restoration of main area layout on refresh. https://github.com/jupyterlab/jupyterlab/pull/1880
- Numerous bug fixes and style updates.
v0.17.0¶
Mar 01, 2017¶
- Upgrade to new
@phosphorpackages - brings a new Command Palette interaction that should be more intuitive, and restores the ability to drag to dock panel edges https://github.com/jupyterlab/jupyterlab/pull/1762. - Refactor of
RenderMimeand associated renders to use live models. See https://github.com/jupyterlab/jupyterlab/pull/1709 and https://github.com/jupyterlab/jupyterlab/issues/1763. - Improvements and bug fixes for the completer widget: https://github.com/jupyterlab/jupyterlab/pull/1778
- Upgrade CodeMirror to 5.23: https://github.com/jupyterlab/jupyterlab/pull/1764
- Numerous style updates and bug fixes.
v0.16.0¶
Feb 09, 2017¶
- Adds a Cell Tools sidebar that allows you to edit notebook cell metadata. #1586.
- Adds keyboard shortcuts to switch between tabs (Cmd/Ctrl LeftArrow and Cmd/Ctrl RightArrow). #1647
- Upgrades to xterm.js 2.3. #1664
- Fixes a bug in application config, but lab extensions will need to be re-enabled. #1607
- Numerous other bug fixes and style improvements.