This feature was discussed in #6123, but it doesn't look like anything was ever incorporated into the IPython Notebook.

Here's a brief overview of the changes:

- Display of messages from other clients can be toggled on and off from within a notebook, either using the ``<M-m>e`` keyboard shortcut in the web UI, or through the option in the "Kernel" menu.
- notebook.js controls whether messages are displayed through a callback that is invoked from kernel.js when no callbacks are available for a message.
- The UI displays ``execute_input`` messages originating from an other clients in new cells at the end of the notebook. Output messages (``execute_result`` et al.) will only be displayed if a cell exists with a matching message ID.

Pending design questions:

- Should each ``execute_input`` message cause a new cell to be created?
- Should new cells be placed at the end of the notebook, or elsewhere? If the latter, what criteria should be followed?
Merge remote-tracking branch 'upstream/master'
Merge remote-tracking branch 'upstream/master'
Updated terminology to match the console/qtconsole
config settings and documentation more closely.

Unsolicited messages => output from other clients.
Increased notification message display time.
Merge remote-tracking branch 'upstream/master'
Removed keyboard shortcut.
Fixed inverted logic caused by renaming variables.
Backing out all changes to the UI and notebook.js.

Updated kernel.js to trigger the ``received_unsolicited_message.Kernel`` event instead. Notebook extensions can handle the event in whatever way they deem appropriate.

A notebook extension that takes advantage of this is available at https://github.com/nheijermans/nbexts.git.
Store kernelspecs under jupyter, not IPython
Add kernel directory relative to sys.prefix
Default to systemwide installation for kernelspecs
Update kernelspec command line interface
Update kernelspec tests
generalise manager
Add json in the base config manager name
Fix javascript iteration through array

for(var k in config) was assigning k to the properties of Array, not just the numeric indices

the second argument of add_buttons_group, k[1], should be config[k][1]
fix leading underscore

mering object with itself is stupid otherwise
JSON formatter expects JSONable dict/list

not already-serialized JSON string

pre-3.0 case of JSON string is handled with a warning.

msgspec5 made this change, but Python APIs that publish
JSON weren't updated to match.
put test in content manager