Repository: deephaven/deephaven-plugins (language: python)

Issue:
Infinite loading spinner when upgrading plotly express DH dependencies to 0.60.0
<!-- Please read our Code of Conduct: https://github.com/deephaven/deephaven-core/blob/main/CODE_OF_CONDUCT.md -->
<!-- Please search existing issues to avoid creating duplicates. -->
<!-- Use clear and concise text to keep the issue brief and to the point. -->

**Description**

Upgrading Plotly express plugin dependencies to DH 0.60.0 causes the loading spinner to never go away.

**Steps to reproduce**
- Upgrade dh dependencies to `0.60.0` in `plugins/plotly-express/src/js/package.json`
- Run the plugins repo locally via `npm start`
- Configure proxy port `VITE_JS_PLUGINS_DEV_PORT=4100` in DHC `packages/code-studio/.env.development.local`
- Run the following code:
```
from deephaven import empty_table
import deephaven.plot.express as dx

y = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']

data = map(
    lambda x,i: f"{x}=X*EvenOdd+{i * 20}",
    y,
    range(len(y)))

t = empty_table(100).update([
    "X=ii",
    "EvenOdd = X % 2 / 4",
    ] + list(data))

p1 = dx.line(t, x="X", y=y)
```

**Expected results**

Loading spinner on chart should go away after data is loaded

**Actual results**

Loading spinner stays forever

**Additional details and attachments**

This seems to have been introduced by https://github.com/deephaven/web-client-ui/pull/1729/files , but the underlying issue seems to be we are never firing the `EVENT_LOADFINISHED` event from plotly express.

**Versions**

<!-- Version information. These versions can be copied from the Settings panel in the Deephaven UI. -->
Web UI Version: 0.60.0


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 394ce153d..f431fa514 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ tsconfig.tsbuildinfo
 .tox/
 
 .eslintcache
+.jest-cache
 .stylelintcache
 
 # Ignore the test reports
diff --git a/package-lock.json b/package-lock.json
index 4a4b0f71c..6fd9b7fac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2294,17 +2294,17 @@
       }
     },
     "node_modules/@deephaven/chart": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.55.0.tgz",
-      "integrity": "sha512-S1oFIi5Dejs1nfZbY8k12mQ4hBfuchCJnWWjpRA/yqNbSBvMJ+H+pgDFHB40xjvdjtjFhPnntPl92waA0IFhUA==",
-      "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.60.0.tgz",
+      "integrity": "sha512-L4vBkonA2DtH5cudS6YYYXrTZacq/bmW8eUCP48n9JW9/6wEbMy7WlO83VHcEDEaQwDm5Y/UTf+gt/cVIHgz6A==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "deep-equal": "^2.0.5",
         "lodash.debounce": "^4.0.8",
         "lodash.set": "^4.3.2",
@@ -2322,15 +2322,15 @@
       }
     },
     "node_modules/@deephaven/chart/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+      "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -2358,22 +2358,22 @@
       }
     },
     "node_modules/@deephaven/chart/node_modules/@deephaven/jsapi-types": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-      "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+      "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q==",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/@deephaven/chart/node_modules/@deephaven/jsapi-utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.55.0.tgz",
-      "integrity": "sha512-uDNWPtvkpSSw0j6XhGTq8mupY2mKVsqFEwo/v7D8NxLWRot8vmuXv95rWaH3e6gFuSOROEK2UuaN7c45ZIsHIQ==",
-      "dependencies": {
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.60.0.tgz",
+      "integrity": "sha512-ZLqwqk9fxLScUEL67XV+H5KP7CrMa67muMqMOjPHcF4tZhAuQIei5BvniUyrpOVLnMxqg0zJ2K0aqLtsOR9/CQ==",
+      "dependencies": {
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "lodash.clamp": "^4.0.3",
         "shortid": "^2.2.16"
       },
@@ -2382,9 +2382,9 @@
       }
     },
     "node_modules/@deephaven/chart/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -2393,9 +2393,9 @@
       }
     },
     "node_modules/@deephaven/chart/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -2486,19 +2486,19 @@
       }
     },
     "node_modules/@deephaven/console": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.55.0.tgz",
-      "integrity": "sha512-jOcHLMNjOnQOrsB59TX1Zo58Q7grOIDXDg3V+wSJDBtlMsJIFB9ReWqMg0FN+RECK3MPFrEzOyJ3nCVb17dFsA==",
-      "dependencies": {
-        "@deephaven/chart": "^0.55.0",
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.60.0.tgz",
+      "integrity": "sha512-gbwBa3vmm5Js8A2KkPqZ+Y5KgIyvfqupn50VIlFlJOnetNWy1SZXg6tikHOthANeMFgV76P5wIzvlvzEfCvzHw==",
+      "dependencies": {
+        "@deephaven/chart": "^0.60.0",
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/jsapi-bootstrap": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "classnames": "^2.3.1",
         "linkifyjs": "^4.1.0",
@@ -2522,15 +2522,15 @@
       }
     },
     "node_modules/@deephaven/console/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+      "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -2558,14 +2558,14 @@
       }
     },
     "node_modules/@deephaven/console/node_modules/@deephaven/jsapi-bootstrap": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.55.0.tgz",
-      "integrity": "sha512-BCxplwKLilBxZZLPdrSOCw2Z/jwKPJDUH3+9SLdRySyaAbQnsKU/4wTv4kc+/yZRe6HhGMd/o4d5qld/+FhcHQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.60.0.tgz",
+      "integrity": "sha512-OlsvXnz6tEMF9qFvbmWLqmMlyABzVw7vp0w86up4GZYTczFOKxTYUWPo3qnYhp1iDtRvblfuvMqQCbTI4yrbzQ==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0"
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0"
       },
       "engines": {
         "node": ">=16"
@@ -2575,17 +2575,17 @@
       }
     },
     "node_modules/@deephaven/console/node_modules/@deephaven/jsapi-types": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-      "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+      "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q==",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/@deephaven/console/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -2594,9 +2594,9 @@
       }
     },
     "node_modules/@deephaven/console/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -2640,30 +2640,30 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.55.0.tgz",
-      "integrity": "sha512-8omUZourv0J4al/ZNmrfJx8G9QYF4FdoIbauw/tzV6hgO3I/fVw7BMatJO9NuVkEhd2Nm38npJMzD/VwTHRb5w==",
-      "dependencies": {
-        "@deephaven/chart": "^0.55.0",
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/console": "^0.55.0",
-        "@deephaven/dashboard": "^0.55.0",
-        "@deephaven/file-explorer": "^0.55.0",
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/golden-layout": "^0.55.0",
-        "@deephaven/grid": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/iris-grid": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/jsapi-components": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/plugin": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/redux": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.60.0.tgz",
+      "integrity": "sha512-fyf6sQtvjhMwJHIa1zEa9Suu+wsUmXwM30dxaVzoyC1G0ZtedvU4XaQxyKC6wLLIP0f4MWQbLKJ46yEb/kQcFw==",
+      "dependencies": {
+        "@deephaven/chart": "^0.60.0",
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/console": "^0.60.0",
+        "@deephaven/dashboard": "^0.60.0",
+        "@deephaven/file-explorer": "^0.60.0",
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/golden-layout": "^0.60.0",
+        "@deephaven/grid": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/iris-grid": "^0.60.0",
+        "@deephaven/jsapi-bootstrap": "^0.60.0",
+        "@deephaven/jsapi-components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/plugin": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/redux": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "classnames": "^2.3.1",
         "deep-equal": "^2.0.5",
@@ -2690,15 +2690,15 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+      "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -2726,17 +2726,16 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/dashboard": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.55.0.tgz",
-      "integrity": "sha512-1JowgB2Psc4/vgUyieuh6V+nCBg91kZcYJ/la6b5bKr5UHI/TbTerPXP17XlzhsyHRAXvfzVnvTqDG1WrUOLpQ==",
-      "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/golden-layout": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/redux": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.60.0.tgz",
+      "integrity": "sha512-IviL11Q6S5M4WNDzmkHcTlmjqpNPHFYW9HMQDn7wtFdFVtrpzbaRzI9Pkpjk2mNQgUvTLlB4gkQq+4/aHYv8pA==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/golden-layout": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/redux": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "deep-equal": "^2.0.5",
         "lodash.ismatch": "^4.1.1",
         "lodash.throttle": "^4.1.1",
@@ -2754,11 +2753,11 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/golden-layout": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.55.0.tgz",
-      "integrity": "sha512-5B4Jm23oR+T5Yd2sq371a/MrIsga5FAPRK4dn/ERMadKT06RmkBZTe9ZeqPhw4Aqk76Thd5NRI8sb7fUIwCL4Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.60.0.tgz",
+      "integrity": "sha512-k9+1nJk66N8jYMkId+iE7QZR0r+5izv0pgeGpnqJTmg6eHgfzbwoaaumu4wj4OKTZv++F1JDezRAMHQRskYkYA==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
+        "@deephaven/components": "^0.60.0",
         "jquery": "^3.6.0"
       },
       "peerDependencies": {
@@ -2767,14 +2766,14 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-bootstrap": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.55.0.tgz",
-      "integrity": "sha512-BCxplwKLilBxZZLPdrSOCw2Z/jwKPJDUH3+9SLdRySyaAbQnsKU/4wTv4kc+/yZRe6HhGMd/o4d5qld/+FhcHQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.60.0.tgz",
+      "integrity": "sha512-OlsvXnz6tEMF9qFvbmWLqmMlyABzVw7vp0w86up4GZYTczFOKxTYUWPo3qnYhp1iDtRvblfuvMqQCbTI4yrbzQ==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0"
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0"
       },
       "engines": {
         "node": ">=16"
@@ -2784,17 +2783,17 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.55.0.tgz",
-      "integrity": "sha512-bTKXj/NbCFYFlm+jnm5ejt64WTcmjtLGWoiMfnYNy5l6CXPfwvdZ7UmYMiroEcLcretBqoy232MX3jOB0aZNVg==",
-      "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.60.0.tgz",
+      "integrity": "sha512-00fbIKkdl84HdwPJsTD1EwG8cychNPSENurmn3FB2GvO6DdHwjKZvHkZvvtxb8jOUFFGPDYBK8djo4HKM23AVA==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/jsapi-bootstrap": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@types/js-cookie": "^3.0.3",
         "classnames": "^2.3.2",
         "js-cookie": "^3.0.5",
@@ -2809,22 +2808,22 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-types": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-      "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+      "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q==",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.55.0.tgz",
-      "integrity": "sha512-uDNWPtvkpSSw0j6XhGTq8mupY2mKVsqFEwo/v7D8NxLWRot8vmuXv95rWaH3e6gFuSOROEK2UuaN7c45ZIsHIQ==",
-      "dependencies": {
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.60.0.tgz",
+      "integrity": "sha512-ZLqwqk9fxLScUEL67XV+H5KP7CrMa67muMqMOjPHcF4tZhAuQIei5BvniUyrpOVLnMxqg0zJ2K0aqLtsOR9/CQ==",
+      "dependencies": {
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "lodash.clamp": "^4.0.3",
         "shortid": "^2.2.16"
       },
@@ -2833,9 +2832,9 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -2844,14 +2843,14 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/redux": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.55.0.tgz",
-      "integrity": "sha512-aCM6DtNWqS5zROQ6h4p/Ac0Z14+DUxp61cx4yrQfNRs6emkDNktx/wnQIE6+OJOpZg8rqNAttj5kVcJnJkbyxQ==",
-      "dependencies": {
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/plugin": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.60.0.tgz",
+      "integrity": "sha512-98d5XKttHsc8/hyF98+B6V6kEwodGti1xHDX/mQZXhAjQ12J1JsCIjdOwa3yzE1WSx4Z1IOM5EIZBQex6poHYQ==",
+      "dependencies": {
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/plugin": "^0.60.0",
         "deep-equal": "^2.0.5",
         "redux-thunk": "2.4.1"
       },
@@ -2863,9 +2862,9 @@
       }
     },
     "node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -2926,15 +2925,15 @@
       }
     },
     "node_modules/@deephaven/file-explorer": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.55.0.tgz",
-      "integrity": "sha512-h/eiX8anF6q88QfYrfwGwEDz3pyVYla+92gUivJH2ASGov8hqoQAVsuW5dsjUayusdrAzIL0sqYEKxayVj21PA==",
-      "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.60.0.tgz",
+      "integrity": "sha512-SJM9t/Zxt88kb03xwRbqI06T/2XrfFP/+NBmxEcJmL/NwxPuCMhywC5sraJ2tyHSNxb+jsuyFTgsYk2uRld6Cw==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "classnames": "^2.3.1",
@@ -2949,15 +2948,15 @@
       }
     },
     "node_modules/@deephaven/file-explorer/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+      "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -2985,9 +2984,9 @@
       }
     },
     "node_modules/@deephaven/file-explorer/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -2996,9 +2995,9 @@
       }
     },
     "node_modules/@deephaven/file-explorer/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -3015,9 +3014,9 @@
       }
     },
     "node_modules/@deephaven/filters": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.55.0.tgz",
-      "integrity": "sha512-ANK9QSXlFqYp+2saJV55VUWMBRop9jwATXpb/pVgwa51LYGxwMsdhvgM6uuMTMygikbzS/NYTXdzoO/ZQPubwQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.60.0.tgz",
+      "integrity": "sha512-mVOLepTNMtuA281tGDv/mrhmbvQg2hGvKSuDt9+kJOXxx5lUXCm29ldulx95MQb9te8JpJa5Hyzx8am4KKrpKw==",
       "engines": {
         "node": ">=16"
       }
@@ -3036,11 +3035,11 @@
       }
     },
     "node_modules/@deephaven/grid": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.55.0.tgz",
-      "integrity": "sha512-RbofSswttN5MC1TZgsczCQqm7xmNTMsEO/KFd6H/joRZG30Y3lAWwlDYxO/vjoOgQSyLztsi6DYr2ZeoNc0UFg==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.60.0.tgz",
+      "integrity": "sha512-JU7R1jBU7aMV01Nfv875MJrWogoBUVb7P2NH17qs27OYv9n/0nlXaMi7Xd8McEsqBK+1JM4NnL3vJwFUN9MRaA==",
       "dependencies": {
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/utils": "^0.60.0",
         "classnames": "^2.3.1",
         "color-convert": "^2.0.1",
         "event-target-shim": "^6.0.2",
@@ -3058,9 +3057,9 @@
       }
     },
     "node_modules/@deephaven/grid/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -3093,9 +3092,9 @@
       }
     },
     "node_modules/@deephaven/icons": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.55.0.tgz",
-      "integrity": "sha512-TwgDPJoNCHzt24YwkMheqnpq2GTnQjGXqFZ/XLjUej7W5xieetzpYyuP9KYW17R8O8QL+Dkq+xkGysXciouYZQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.60.0.tgz",
+      "integrity": "sha512-zbfPncScVrGzRqSKT9hNtNgWI3CJxWZRhBHqHMidOWpwuVWG19Pgpyzj4nRahdcWzKv6LAbMYB0kIBEr1cs7gQ==",
       "dependencies": {
         "@fortawesome/fontawesome-common-types": "^6.1.1"
       },
@@ -3105,21 +3104,22 @@
       }
     },
     "node_modules/@deephaven/iris-grid": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.55.0.tgz",
-      "integrity": "sha512-LOcT1qHeQhf/VHZ7VcpPfuMvaTqcjH/VdPg0XJVLvHljZIuNmWwIS3bh0Nck/MS3JpYGIdYqhRO3P2sT1gA7EA==",
-      "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/console": "^0.55.0",
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/grid": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.60.0.tgz",
+      "integrity": "sha512-dL1US3EU5ZUVWXlDWFNHFFnDWvUPbV6WjZX+uW0XEFsUxI2bJtwSIiIRXQeTVGEeXHCsb2zq0Gq00aVicH2bog==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/console": "^0.60.0",
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/grid": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/jsapi-components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@dnd-kit/core": "^6.0.5",
         "@dnd-kit/sortable": "^7.0.0",
         "@dnd-kit/utilities": "^3.2.0",
@@ -3146,15 +3146,15 @@
       }
     },
     "node_modules/@deephaven/iris-grid/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+      "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -3181,23 +3181,65 @@
         "react-dom": "^17.x"
       }
     },
+    "node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-bootstrap": {
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.60.0.tgz",
+      "integrity": "sha512-OlsvXnz6tEMF9qFvbmWLqmMlyABzVw7vp0w86up4GZYTczFOKxTYUWPo3qnYhp1iDtRvblfuvMqQCbTI4yrbzQ==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
+    "node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-components": {
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.60.0.tgz",
+      "integrity": "sha512-00fbIKkdl84HdwPJsTD1EwG8cychNPSENurmn3FB2GvO6DdHwjKZvHkZvvtxb8jOUFFGPDYBK8djo4HKM23AVA==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/jsapi-bootstrap": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
+        "@types/js-cookie": "^3.0.3",
+        "classnames": "^2.3.2",
+        "js-cookie": "^3.0.5",
+        "lodash.debounce": "^4.0.8",
+        "prop-types": "^15.8.1"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
     "node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-types": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-      "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+      "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q==",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.55.0.tgz",
-      "integrity": "sha512-uDNWPtvkpSSw0j6XhGTq8mupY2mKVsqFEwo/v7D8NxLWRot8vmuXv95rWaH3e6gFuSOROEK2UuaN7c45ZIsHIQ==",
-      "dependencies": {
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.60.0.tgz",
+      "integrity": "sha512-ZLqwqk9fxLScUEL67XV+H5KP7CrMa67muMqMOjPHcF4tZhAuQIei5BvniUyrpOVLnMxqg0zJ2K0aqLtsOR9/CQ==",
+      "dependencies": {
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "lodash.clamp": "^4.0.3",
         "shortid": "^2.2.16"
       },
@@ -3206,9 +3248,9 @@
       }
     },
     "node_modules/@deephaven/iris-grid/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -3217,9 +3259,9 @@
       }
     },
     "node_modules/@deephaven/iris-grid/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -3394,16 +3436,17 @@
       }
     },
     "node_modules/@deephaven/plugin": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.55.0.tgz",
-      "integrity": "sha512-YHUZu2hPmONIZ7eFH7HkVsZuDmJYB9plb5oKu7SWDcmfYxfR3xfRFafHO/Z9fPnczJ/9iU8ZqwYuwPtyG9fhEw==",
-      "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/golden-layout": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/iris-grid": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.60.0.tgz",
+      "integrity": "sha512-qGg3ECTf06x/eB8lBDYI9KgW2QqXn2G66EkpNWrAC0PwKK7MeMvUY0+q5eyQTTLdX27dxIq6aTt3D0lv9NO6oA==",
+      "dependencies": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/golden-layout": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/iris-grid": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
         "@fortawesome/fontawesome-common-types": "^6.1.1",
         "@fortawesome/react-fontawesome": "^0.2.0"
       },
@@ -3415,15 +3458,15 @@
       }
     },
     "node_modules/@deephaven/plugin/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+      "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -3451,11 +3494,11 @@
       }
     },
     "node_modules/@deephaven/plugin/node_modules/@deephaven/golden-layout": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.55.0.tgz",
-      "integrity": "sha512-5B4Jm23oR+T5Yd2sq371a/MrIsga5FAPRK4dn/ERMadKT06RmkBZTe9ZeqPhw4Aqk76Thd5NRI8sb7fUIwCL4Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.60.0.tgz",
+      "integrity": "sha512-k9+1nJk66N8jYMkId+iE7QZR0r+5izv0pgeGpnqJTmg6eHgfzbwoaaumu4wj4OKTZv++F1JDezRAMHQRskYkYA==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
+        "@deephaven/components": "^0.60.0",
         "jquery": "^3.6.0"
       },
       "peerDependencies": {
@@ -3464,17 +3507,17 @@
       }
     },
     "node_modules/@deephaven/plugin/node_modules/@deephaven/jsapi-types": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-      "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+      "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q==",
       "engines": {
         "node": ">=16"
       }
     },
     "node_modules/@deephaven/plugin/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -3483,9 +3526,9 @@
       }
     },
     "node_modules/@deephaven/plugin/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -3511,13 +3554,13 @@
       }
     },
     "node_modules/@deephaven/react-hooks": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.55.0.tgz",
-      "integrity": "sha512-YvrjVLWMvPOGUVHV6yDZzpG8L4H1rTXo6GH+Lp2NntR/7KuHKMyPHetQJAYh/z7+zoUqzsTFmiubExLs2+WFeQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.60.0.tgz",
+      "integrity": "sha512-R4ZNF9DVCaajpLSEe1Ev1B+K9Iv2fOK7nLWESENb9VhViUkAjBw8DjW1+Qph59NlJkkGd6k2TTsqE7VswO7TNw==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "lodash.debounce": "^4.0.8",
         "shortid": "^2.2.16"
       },
@@ -3529,9 +3572,9 @@
       }
     },
     "node_modules/@deephaven/react-hooks/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -3540,9 +3583,9 @@
       }
     },
     "node_modules/@deephaven/react-hooks/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+      "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw==",
       "engines": {
         "node": ">=16"
       }
@@ -3585,12 +3628,12 @@
       }
     },
     "node_modules/@deephaven/storage": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.55.0.tgz",
-      "integrity": "sha512-4YMs55OR4NgPF9mkG6J4iyywFJzP6BDSB3lfFve1wrAmAfGV4szpShmh6Vj1jBDOncudBwnKC8pSo0fj8s+grg==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.60.0.tgz",
+      "integrity": "sha512-5U27ibvuGOq4U2lGY17VFAPDY2SdrehOrCgbd1pB3cXoX0uQmkJyaOIpNdcN2RNSgzTRYidSa0ilhY6b96wDlg==",
       "dependencies": {
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
         "lodash.throttle": "^4.1.1"
       },
       "engines": {
@@ -3601,9 +3644,9 @@
       }
     },
     "node_modules/@deephaven/storage/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+      "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -30939,15 +30982,15 @@
       "version": "0.3.2",
       "license": "Apache-2.0",
       "dependencies": {
-        "@deephaven/chart": "0.55.0",
-        "@deephaven/components": "0.55.0",
-        "@deephaven/dashboard": "0.55.0",
-        "@deephaven/dashboard-core-plugins": "0.55.0",
-        "@deephaven/icons": "0.55.0",
-        "@deephaven/jsapi-bootstrap": "0.55.0",
-        "@deephaven/log": "0.55.0",
-        "@deephaven/plugin": "0.55.0",
-        "@deephaven/utils": "0.55.0",
+        "@deephaven/chart": "0.62.0",
+        "@deephaven/components": "0.62.0",
+        "@deephaven/dashboard": "0.62.0",
+        "@deephaven/dashboard-core-plugins": "0.62.0",
+        "@deephaven/icons": "0.62.0",
+        "@deephaven/jsapi-bootstrap": "0.62.0",
+        "@deephaven/log": "0.62.0",
+        "@deephaven/plugin": "0.62.0",
+        "@deephaven/utils": "0.62.0",
         "deep-equal": "^2.2.1",
         "plotly.js": "^2.23.0",
         "plotly.js-dist-min": "^2.23.0",
@@ -30956,7 +30999,7 @@
         "shortid": "^2.2.16"
       },
       "devDependencies": {
-        "@deephaven/jsapi-types": "0.55.0",
+        "@deephaven/jsapi-types": "0.62.0",
         "@types/deep-equal": "^1.0.1",
         "@types/plotly.js": "^2.12.18",
         "@types/plotly.js-dist-min": "^2.3.1",
@@ -30971,15 +31014,44 @@
         "react": "^17.0.2"
       }
     },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/chart": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.62.0.tgz",
+      "integrity": "sha512-zakQjG0V+QYdHsr01ThQS2ffhaCnF2a9GtlUDhw43qYfHeEiC2IkkinizY2pYgSJf2CPLNe7ibiIBflifQSBMQ==",
+      "dependencies": {
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/jsapi-utils": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "deep-equal": "^2.0.5",
+        "lodash.debounce": "^4.0.8",
+        "lodash.set": "^4.3.2",
+        "memoize-one": "^5.1.1",
+        "memoizee": "^0.4.15",
+        "plotly.js": "^2.18.2",
+        "prop-types": "^15.7.2",
+        "react-plotly.js": "^2.6.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
     "plugins/plotly-express/src/js/node_modules/@deephaven/components": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.62.0.tgz",
+      "integrity": "sha512-VKHZgsOO/VL1o9CS794eeRAa28lMQCLRrFbp3KgMBGvZVC68+rtuNpxWnc4zRZLZJxFiAxJbyJcleZS6QyW5Vg==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -31006,17 +31078,53 @@
         "react-dom": "^17.x"
       }
     },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/console": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.62.0.tgz",
+      "integrity": "sha512-9jDywMHxiNpUjMMXQhQwI6vwnhEseG1Jf+RreZuTKVFJ4VTmhRg/xG14Bd6p/D6ichVQ4jGtMSLHKmYFYZ9HZg==",
+      "dependencies": {
+        "@deephaven/chart": "^0.62.0",
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/jsapi-bootstrap": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/storage": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "@fortawesome/react-fontawesome": "^0.2.0",
+        "classnames": "^2.3.1",
+        "linkifyjs": "^4.1.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.throttle": "^4.1.1",
+        "memoize-one": "^5.1.1",
+        "memoizee": "^0.4.15",
+        "monaco-editor": "^0.41.0",
+        "papaparse": "5.3.2",
+        "popper.js": "^1.16.1",
+        "prop-types": "^15.7.2",
+        "shell-quote": "^1.7.2",
+        "shortid": "^2.2.16"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x",
+        "react-dom": "^17.x"
+      }
+    },
     "plugins/plotly-express/src/js/node_modules/@deephaven/dashboard": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.62.0.tgz",
+      "integrity": "sha512-tBrpe52cl+UK2jtGGz7lIAJdxNm1givhquz4JKEBDJ/k8rqWwucXsxLgJ22nGASzct14xBk2Gb5IeuH/swkUDg==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/golden-layout": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/redux": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/golden-layout": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/redux": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
         "deep-equal": "^2.0.5",
         "lodash.ismatch": "^4.1.1",
         "lodash.throttle": "^4.1.1",
@@ -31033,112 +31141,373 @@
         "react-redux": "^7.2.4"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/golden-layout": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
+    "plugins/plotly-express/src/js/node_modules/@deephaven/dashboard-core-plugins": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.62.0.tgz",
+      "integrity": "sha512-c5pULTIPABzEJJSZRPBnCmt6OKxt9Vcy4riI0WX7wj+ZDvfo+Sg59ErBpSoY3bHgDsUzV28bmh2Vn+RBQNN8vQ==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "jquery": "^3.6.0"
+        "@deephaven/chart": "^0.62.0",
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/console": "^0.62.0",
+        "@deephaven/dashboard": "^0.62.0",
+        "@deephaven/file-explorer": "^0.62.0",
+        "@deephaven/filters": "^0.62.0",
+        "@deephaven/golden-layout": "^0.62.0",
+        "@deephaven/grid": "^0.62.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/iris-grid": "^0.62.0",
+        "@deephaven/jsapi-bootstrap": "^0.62.0",
+        "@deephaven/jsapi-components": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/jsapi-utils": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/plugin": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/redux": "^0.62.0",
+        "@deephaven/storage": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "@fortawesome/react-fontawesome": "^0.2.0",
+        "classnames": "^2.3.1",
+        "deep-equal": "^2.0.5",
+        "lodash.clamp": "^4.0.3",
+        "lodash.debounce": "^4.0.8",
+        "lodash.throttle": "^4.1.1",
+        "memoize-one": "^5.1.1",
+        "memoizee": "^0.4.15",
+        "prop-types": "^15.7.2",
+        "react-markdown": "^6.0.2",
+        "react-transition-group": "^4.4.2",
+        "redux": "^4.2.0",
+        "redux-thunk": "^2.4.1",
+        "remark-gfm": "1.0.0",
+        "shortid": "^2.2.16"
+      },
+      "engines": {
+        "node": ">=16"
       },
       "peerDependencies": {
-        "react": "^17.x",
-        "react-dom": "^17.x"
+        "react": "^17.0.0",
+        "react-dom": "^17.0.0",
+        "react-redux": "^7.2.4"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-bootstrap": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
+    "plugins/plotly-express/src/js/node_modules/@deephaven/file-explorer": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.62.0.tgz",
+      "integrity": "sha512-pc6cH34DNkRxeWgy2ofGv/HUIGpI57LWLxVlnPqX7El/Q+Ma3cSBqj1sQH0uz5uNwP5WHv8q0L32JrJXJef0/Q==",
       "dependencies": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0"
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/storage": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "@fortawesome/fontawesome-svg-core": "^6.2.1",
+        "@fortawesome/react-fontawesome": "^0.2.0",
+        "classnames": "^2.3.1",
+        "lodash.throttle": "^4.1.1",
+        "prop-types": "^15.7.2"
       },
       "engines": {
         "node": ">=16"
       },
       "peerDependencies": {
-        "react": "^17.x"
-      }
-    },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-types": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=16"
+        "react": "^17.0.0"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-utils": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
-        "lodash.clamp": "^4.0.3",
-        "shortid": "^2.2.16"
-      },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/filters": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.62.0.tgz",
+      "integrity": "sha512-WTa3z250SRoh8xYmL3gdfddPOwqZBj95sVKaj3LBGGepcTO0Me3vCp9nODl8MyUBaOGBsCXIsrnWX6DFjkiGLQ==",
       "engines": {
         "node": ">=16"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/log": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
+    "plugins/plotly-express/src/js/node_modules/@deephaven/golden-layout": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.62.0.tgz",
+      "integrity": "sha512-eeXz4GHm3JO8S8GNr5SGrdoeyuktwsH8cFwDy5V3WOVut1QwGVkPiTNb63Lt7F55rdLeuOHVdsXDYNDnDUcZtQ==",
       "dependencies": {
-        "event-target-shim": "^6.0.2"
+        "@deephaven/components": "^0.62.0",
+        "jquery": "^3.6.0"
       },
-      "engines": {
-        "node": ">=16"
+      "peerDependencies": {
+        "react": "^17.x",
+        "react-dom": "^17.x"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/redux": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
+    "plugins/plotly-express/src/js/node_modules/@deephaven/grid": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.62.0.tgz",
+      "integrity": "sha512-rqCfJUtu83ApSSBJPOFx6bUyZG+5PMb+CGx74xg8QQ1OO61whfNOW5+A1DWRPnpK3GdOqmu+KMH39KPCXKVLTg==",
       "dependencies": {
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/plugin": "^0.55.0",
-        "deep-equal": "^2.0.5",
-        "redux-thunk": "2.4.1"
+        "@deephaven/utils": "^0.62.0",
+        "classnames": "^2.3.1",
+        "color-convert": "^2.0.1",
+        "event-target-shim": "^6.0.2",
+        "linkifyjs": "^4.1.0",
+        "lodash.clamp": "^4.0.3",
+        "memoize-one": "^5.1.1",
+        "memoizee": "^0.4.15",
+        "prop-types": "^15.7.2"
       },
       "engines": {
         "node": ">=16"
       },
       "peerDependencies": {
-        "redux": "^4.2.0"
-      }
-    },
-    "plugins/plotly-express/src/js/node_modules/@deephaven/utils": {
-      "version": "0.55.0",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=16"
+        "react": "^17.x"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/event-target-shim": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz",
-      "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==",
-      "engines": {
-        "node": ">=10.13.0"
+    "plugins/plotly-express/src/js/node_modules/@deephaven/icons": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.62.0.tgz",
+      "integrity": "sha512-KQUftXbKj5Oww+Fxjto+wDcr8sFUP1ghhl6ZlynfbIx7KJg6QM6LDwyHIfMv+RX1MQID+i9gcGLnPfBYak7d6A==",
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "^6.1.1"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
-    "plugins/plotly-express/src/js/node_modules/redux-thunk": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz",
-      "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==",
       "peerDependencies": {
-        "redux": "^4"
+        "@fortawesome/fontawesome-svg-core": "^6.2.1",
+        "@fortawesome/react-fontawesome": "^0.2.0"
       }
     },
-    "plugins/plotly-express/src/js/node_modules/typescript": {
-      "version": "4.9.5",
+    "plugins/plotly-express/src/js/node_modules/@deephaven/iris-grid": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.62.0.tgz",
+      "integrity": "sha512-LkEbiCEE7MlBC0coaA6gw0tTG77+sV2FDmmK4MuTf0R6PE+EwXCtRdRPrknbBq4DsZynAsWRKB5PIBszQdt3Cw==",
+      "dependencies": {
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/console": "^0.62.0",
+        "@deephaven/filters": "^0.62.0",
+        "@deephaven/grid": "^0.62.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/jsapi-components": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/jsapi-utils": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/storage": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "@dnd-kit/core": "^6.0.5",
+        "@dnd-kit/sortable": "^7.0.0",
+        "@dnd-kit/utilities": "^3.2.0",
+        "@fortawesome/react-fontawesome": "^0.2.0",
+        "classnames": "^2.3.1",
+        "deep-equal": "^2.0.5",
+        "lodash.clamp": "^4.0.3",
+        "lodash.debounce": "^4.0.8",
+        "lodash.throttle": "^4.1.1",
+        "memoize-one": "^5.1.1",
+        "memoizee": "^0.4.15",
+        "monaco-editor": "^0.41.0",
+        "prop-types": "^15.7.2",
+        "react-beautiful-dnd": "^13.1.0",
+        "react-transition-group": "^4.4.2",
+        "shortid": "^2.2.16"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "react": "^17.x",
+        "react-dom": "^17.x"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-bootstrap": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.62.0.tgz",
+      "integrity": "sha512-LjXAn2nIyjiIyV7zsjAp921IPrknori6Yzh3RhgqTh8fWLF2x8RNWFpk7AGF/WKfzDJbMrpQ36u3B79PecmTaw==",
+      "dependencies": {
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-components": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.62.0.tgz",
+      "integrity": "sha512-S1zouiD9Imd6g+UsSmrRRykA3IbHw7LLWxoG26sA6ITuNCXw76vpM++mPWsHkAau3WQNxI9QVEUuhHEWkrnK+g==",
+      "dependencies": {
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/jsapi-bootstrap": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/jsapi-utils": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "@types/js-cookie": "^3.0.3",
+        "classnames": "^2.3.2",
+        "js-cookie": "^3.0.5",
+        "lodash.debounce": "^4.0.8",
+        "prop-types": "^15.8.1"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-types": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.62.0.tgz",
+      "integrity": "sha512-5R/SdTsID37S+tn+l62xOeecSccmnhJtn0/+VOP1taPAZGRcOak36gVJnEos/4hJruiJK1Dri3v9M8P/GfLn8g==",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/jsapi-utils": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.62.0.tgz",
+      "integrity": "sha512-yWAk+zo2DOViROdpWRmA56xDwZotskIgyJCSO+9wFNxIo2YMUJNydtkB0vLWxXj/+lWWo0qTnbbDD+wNFoFTtg==",
+      "dependencies": {
+        "@deephaven/filters": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "lodash.clamp": "^4.0.3",
+        "shortid": "^2.2.16"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/log": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.62.0.tgz",
+      "integrity": "sha512-k3CDUJ21u1MzEb/C15qQCGKkXuVzO4Pc3KUTHSYMCyRDyskKbpcyQM88rYiQKFtp2Igyb6mvAdKIj7uubPc8Aw==",
+      "dependencies": {
+        "event-target-shim": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/plugin": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.62.0.tgz",
+      "integrity": "sha512-IokazAXbWLoITsAlnK+VM3HXtL5zpjH1DWY0mETpJwlMP6kAolhbc/UfDC2bRFYlQzTTHEPjVPVtRskse4JRAA==",
+      "dependencies": {
+        "@deephaven/components": "^0.62.0",
+        "@deephaven/golden-layout": "^0.62.0",
+        "@deephaven/icons": "^0.62.0",
+        "@deephaven/iris-grid": "^0.62.0",
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/react-hooks": "^0.62.0",
+        "@fortawesome/fontawesome-common-types": "^6.1.1",
+        "@fortawesome/react-fontawesome": "^0.2.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/react-hooks": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.62.0.tgz",
+      "integrity": "sha512-jlCqhSWa9V/jyfynZjPc+WlbQQAnhIilpQvI7bdU9q4fTRDfQvd0nSqr0sA0xODgGq8kBgz+6yzZ9yVWsg7IIA==",
+      "dependencies": {
+        "@adobe/react-spectrum": "^3.29.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/utils": "^0.62.0",
+        "lodash.debounce": "^4.0.8",
+        "shortid": "^2.2.16"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/redux": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.62.0.tgz",
+      "integrity": "sha512-vmbSAKymKrPlgo3NJ8S/fl/ifjBv3R9pC0Ms/1HqsfNOftXKVlUKSRv/crZPcNWoLsD7fSufPs2lLVQijgXvjg==",
+      "dependencies": {
+        "@deephaven/jsapi-types": "^0.62.0",
+        "@deephaven/jsapi-utils": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "@deephaven/plugin": "^0.62.0",
+        "deep-equal": "^2.0.5",
+        "redux-thunk": "2.4.1"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "redux": "^4.2.0"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/storage": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.62.0.tgz",
+      "integrity": "sha512-4ALHUPLTkNxmI3rxtjQ46631SIMQZlCI4lwamjQufg06f/KNPOkS2VIp2ZRoyiHhha0pnGADaOWqB6bAdKMMFA==",
+      "dependencies": {
+        "@deephaven/filters": "^0.62.0",
+        "@deephaven/log": "^0.62.0",
+        "lodash.throttle": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "react": "^17.x"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/@deephaven/utils": {
+      "version": "0.62.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.62.0.tgz",
+      "integrity": "sha512-faAhWYpMBSXNVD9hw9VP88pIbNkcPqQkodTdSEitc5MguYg65pP2a63ylYkR0xCgWM5jViy797LY1w3c8ZGgIA==",
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "plugins/plotly-express/src/js/node_modules/event-target-shim": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz",
+      "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==",
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/redux-thunk": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz",
+      "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==",
+      "peerDependencies": {
+        "redux": "^4"
+      }
+    },
+    "plugins/plotly-express/src/js/node_modules/typescript": {
+      "version": "4.9.5",
       "dev": true,
       "license": "Apache-2.0",
       "bin": {
@@ -33300,17 +33669,17 @@
       }
     },
     "@deephaven/chart": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.55.0.tgz",
-      "integrity": "sha512-S1oFIi5Dejs1nfZbY8k12mQ4hBfuchCJnWWjpRA/yqNbSBvMJ+H+pgDFHB40xjvdjtjFhPnntPl92waA0IFhUA==",
-      "requires": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.60.0.tgz",
+      "integrity": "sha512-L4vBkonA2DtH5cudS6YYYXrTZacq/bmW8eUCP48n9JW9/6wEbMy7WlO83VHcEDEaQwDm5Y/UTf+gt/cVIHgz6A==",
+      "requires": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "deep-equal": "^2.0.5",
         "lodash.debounce": "^4.0.8",
         "lodash.set": "^4.3.2",
@@ -33322,15 +33691,15 @@
       },
       "dependencies": {
         "@deephaven/components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+          "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -33351,35 +33720,35 @@
           }
         },
         "@deephaven/jsapi-types": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-          "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+          "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q=="
         },
         "@deephaven/jsapi-utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.55.0.tgz",
-          "integrity": "sha512-uDNWPtvkpSSw0j6XhGTq8mupY2mKVsqFEwo/v7D8NxLWRot8vmuXv95rWaH3e6gFuSOROEK2UuaN7c45ZIsHIQ==",
-          "requires": {
-            "@deephaven/filters": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.60.0.tgz",
+          "integrity": "sha512-ZLqwqk9fxLScUEL67XV+H5KP7CrMa67muMqMOjPHcF4tZhAuQIei5BvniUyrpOVLnMxqg0zJ2K0aqLtsOR9/CQ==",
+          "requires": {
+            "@deephaven/filters": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "lodash.clamp": "^4.0.3",
             "shortid": "^2.2.16"
           }
         },
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -33442,19 +33811,19 @@
       }
     },
     "@deephaven/console": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.55.0.tgz",
-      "integrity": "sha512-jOcHLMNjOnQOrsB59TX1Zo58Q7grOIDXDg3V+wSJDBtlMsJIFB9ReWqMg0FN+RECK3MPFrEzOyJ3nCVb17dFsA==",
-      "requires": {
-        "@deephaven/chart": "^0.55.0",
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.60.0.tgz",
+      "integrity": "sha512-gbwBa3vmm5Js8A2KkPqZ+Y5KgIyvfqupn50VIlFlJOnetNWy1SZXg6tikHOthANeMFgV76P5wIzvlvzEfCvzHw==",
+      "requires": {
+        "@deephaven/chart": "^0.60.0",
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/jsapi-bootstrap": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "classnames": "^2.3.1",
         "linkifyjs": "^4.1.0",
@@ -33471,15 +33840,15 @@
       },
       "dependencies": {
         "@deephaven/components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+          "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -33500,33 +33869,33 @@
           }
         },
         "@deephaven/jsapi-bootstrap": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.55.0.tgz",
-          "integrity": "sha512-BCxplwKLilBxZZLPdrSOCw2Z/jwKPJDUH3+9SLdRySyaAbQnsKU/4wTv4kc+/yZRe6HhGMd/o4d5qld/+FhcHQ==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.60.0.tgz",
+          "integrity": "sha512-OlsvXnz6tEMF9qFvbmWLqmMlyABzVw7vp0w86up4GZYTczFOKxTYUWPo3qnYhp1iDtRvblfuvMqQCbTI4yrbzQ==",
           "requires": {
-            "@deephaven/components": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0"
+            "@deephaven/components": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0"
           }
         },
         "@deephaven/jsapi-types": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-          "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+          "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q=="
         },
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -33567,30 +33936,30 @@
       }
     },
     "@deephaven/dashboard-core-plugins": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.55.0.tgz",
-      "integrity": "sha512-8omUZourv0J4al/ZNmrfJx8G9QYF4FdoIbauw/tzV6hgO3I/fVw7BMatJO9NuVkEhd2Nm38npJMzD/VwTHRb5w==",
-      "requires": {
-        "@deephaven/chart": "^0.55.0",
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/console": "^0.55.0",
-        "@deephaven/dashboard": "^0.55.0",
-        "@deephaven/file-explorer": "^0.55.0",
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/golden-layout": "^0.55.0",
-        "@deephaven/grid": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/iris-grid": "^0.55.0",
-        "@deephaven/jsapi-bootstrap": "^0.55.0",
-        "@deephaven/jsapi-components": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/plugin": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/redux": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.60.0.tgz",
+      "integrity": "sha512-fyf6sQtvjhMwJHIa1zEa9Suu+wsUmXwM30dxaVzoyC1G0ZtedvU4XaQxyKC6wLLIP0f4MWQbLKJ46yEb/kQcFw==",
+      "requires": {
+        "@deephaven/chart": "^0.60.0",
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/console": "^0.60.0",
+        "@deephaven/dashboard": "^0.60.0",
+        "@deephaven/file-explorer": "^0.60.0",
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/golden-layout": "^0.60.0",
+        "@deephaven/grid": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/iris-grid": "^0.60.0",
+        "@deephaven/jsapi-bootstrap": "^0.60.0",
+        "@deephaven/jsapi-components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/plugin": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/redux": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "classnames": "^2.3.1",
         "deep-equal": "^2.0.5",
@@ -33609,15 +33978,15 @@
       },
       "dependencies": {
         "@deephaven/components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+          "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -33638,17 +34007,16 @@
           }
         },
         "@deephaven/dashboard": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.55.0.tgz",
-          "integrity": "sha512-1JowgB2Psc4/vgUyieuh6V+nCBg91kZcYJ/la6b5bKr5UHI/TbTerPXP17XlzhsyHRAXvfzVnvTqDG1WrUOLpQ==",
-          "requires": {
-            "@deephaven/components": "^0.55.0",
-            "@deephaven/golden-layout": "^0.55.0",
-            "@deephaven/jsapi-bootstrap": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/redux": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.60.0.tgz",
+          "integrity": "sha512-IviL11Q6S5M4WNDzmkHcTlmjqpNPHFYW9HMQDn7wtFdFVtrpzbaRzI9Pkpjk2mNQgUvTLlB4gkQq+4/aHYv8pA==",
+          "requires": {
+            "@deephaven/components": "^0.60.0",
+            "@deephaven/golden-layout": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/redux": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "deep-equal": "^2.0.5",
             "lodash.ismatch": "^4.1.1",
             "lodash.throttle": "^4.1.1",
@@ -33657,37 +34025,37 @@
           }
         },
         "@deephaven/golden-layout": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.55.0.tgz",
-          "integrity": "sha512-5B4Jm23oR+T5Yd2sq371a/MrIsga5FAPRK4dn/ERMadKT06RmkBZTe9ZeqPhw4Aqk76Thd5NRI8sb7fUIwCL4Q==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.60.0.tgz",
+          "integrity": "sha512-k9+1nJk66N8jYMkId+iE7QZR0r+5izv0pgeGpnqJTmg6eHgfzbwoaaumu4wj4OKTZv++F1JDezRAMHQRskYkYA==",
           "requires": {
-            "@deephaven/components": "^0.55.0",
+            "@deephaven/components": "^0.60.0",
             "jquery": "^3.6.0"
           }
         },
         "@deephaven/jsapi-bootstrap": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.55.0.tgz",
-          "integrity": "sha512-BCxplwKLilBxZZLPdrSOCw2Z/jwKPJDUH3+9SLdRySyaAbQnsKU/4wTv4kc+/yZRe6HhGMd/o4d5qld/+FhcHQ==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.60.0.tgz",
+          "integrity": "sha512-OlsvXnz6tEMF9qFvbmWLqmMlyABzVw7vp0w86up4GZYTczFOKxTYUWPo3qnYhp1iDtRvblfuvMqQCbTI4yrbzQ==",
           "requires": {
-            "@deephaven/components": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0"
+            "@deephaven/components": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0"
           }
         },
         "@deephaven/jsapi-components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.55.0.tgz",
-          "integrity": "sha512-bTKXj/NbCFYFlm+jnm5ejt64WTcmjtLGWoiMfnYNy5l6CXPfwvdZ7UmYMiroEcLcretBqoy232MX3jOB0aZNVg==",
-          "requires": {
-            "@deephaven/components": "^0.55.0",
-            "@deephaven/jsapi-bootstrap": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/jsapi-utils": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.60.0.tgz",
+          "integrity": "sha512-00fbIKkdl84HdwPJsTD1EwG8cychNPSENurmn3FB2GvO6DdHwjKZvHkZvvtxb8jOUFFGPDYBK8djo4HKM23AVA==",
+          "requires": {
+            "@deephaven/components": "^0.60.0",
+            "@deephaven/jsapi-bootstrap": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/jsapi-utils": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@types/js-cookie": "^3.0.3",
             "classnames": "^2.3.2",
             "js-cookie": "^3.0.5",
@@ -33696,48 +34064,48 @@
           }
         },
         "@deephaven/jsapi-types": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-          "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+          "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q=="
         },
         "@deephaven/jsapi-utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.55.0.tgz",
-          "integrity": "sha512-uDNWPtvkpSSw0j6XhGTq8mupY2mKVsqFEwo/v7D8NxLWRot8vmuXv95rWaH3e6gFuSOROEK2UuaN7c45ZIsHIQ==",
-          "requires": {
-            "@deephaven/filters": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.60.0.tgz",
+          "integrity": "sha512-ZLqwqk9fxLScUEL67XV+H5KP7CrMa67muMqMOjPHcF4tZhAuQIei5BvniUyrpOVLnMxqg0zJ2K0aqLtsOR9/CQ==",
+          "requires": {
+            "@deephaven/filters": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "lodash.clamp": "^4.0.3",
             "shortid": "^2.2.16"
           }
         },
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/redux": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.55.0.tgz",
-          "integrity": "sha512-aCM6DtNWqS5zROQ6h4p/Ac0Z14+DUxp61cx4yrQfNRs6emkDNktx/wnQIE6+OJOpZg8rqNAttj5kVcJnJkbyxQ==",
-          "requires": {
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/jsapi-utils": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/plugin": "^0.55.0",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.60.0.tgz",
+          "integrity": "sha512-98d5XKttHsc8/hyF98+B6V6kEwodGti1xHDX/mQZXhAjQ12J1JsCIjdOwa3yzE1WSx4Z1IOM5EIZBQex6poHYQ==",
+          "requires": {
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/jsapi-utils": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/plugin": "^0.60.0",
             "deep-equal": "^2.0.5",
             "redux-thunk": "2.4.1"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -33764,15 +34132,15 @@
       }
     },
     "@deephaven/file-explorer": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.55.0.tgz",
-      "integrity": "sha512-h/eiX8anF6q88QfYrfwGwEDz3pyVYla+92gUivJH2ASGov8hqoQAVsuW5dsjUayusdrAzIL0sqYEKxayVj21PA==",
-      "requires": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.60.0.tgz",
+      "integrity": "sha512-SJM9t/Zxt88kb03xwRbqI06T/2XrfFP/+NBmxEcJmL/NwxPuCMhywC5sraJ2tyHSNxb+jsuyFTgsYk2uRld6Cw==",
+      "requires": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "classnames": "^2.3.1",
@@ -33781,15 +34149,15 @@
       },
       "dependencies": {
         "@deephaven/components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+          "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -33810,17 +34178,17 @@
           }
         },
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -33830,9 +34198,9 @@
       }
     },
     "@deephaven/filters": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.55.0.tgz",
-      "integrity": "sha512-ANK9QSXlFqYp+2saJV55VUWMBRop9jwATXpb/pVgwa51LYGxwMsdhvgM6uuMTMygikbzS/NYTXdzoO/ZQPubwQ=="
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.60.0.tgz",
+      "integrity": "sha512-mVOLepTNMtuA281tGDv/mrhmbvQg2hGvKSuDt9+kJOXxx5lUXCm29ldulx95MQb9te8JpJa5Hyzx8am4KKrpKw=="
     },
     "@deephaven/golden-layout": {
       "version": "0.40.4",
@@ -33844,11 +34212,11 @@
       }
     },
     "@deephaven/grid": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.55.0.tgz",
-      "integrity": "sha512-RbofSswttN5MC1TZgsczCQqm7xmNTMsEO/KFd6H/joRZG30Y3lAWwlDYxO/vjoOgQSyLztsi6DYr2ZeoNc0UFg==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.60.0.tgz",
+      "integrity": "sha512-JU7R1jBU7aMV01Nfv875MJrWogoBUVb7P2NH17qs27OYv9n/0nlXaMi7Xd8McEsqBK+1JM4NnL3vJwFUN9MRaA==",
       "requires": {
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/utils": "^0.60.0",
         "classnames": "^2.3.1",
         "color-convert": "^2.0.1",
         "event-target-shim": "^6.0.2",
@@ -33860,9 +34228,9 @@
       },
       "dependencies": {
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "color-convert": {
           "version": "2.0.1",
@@ -33885,29 +34253,30 @@
       }
     },
     "@deephaven/icons": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.55.0.tgz",
-      "integrity": "sha512-TwgDPJoNCHzt24YwkMheqnpq2GTnQjGXqFZ/XLjUej7W5xieetzpYyuP9KYW17R8O8QL+Dkq+xkGysXciouYZQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.60.0.tgz",
+      "integrity": "sha512-zbfPncScVrGzRqSKT9hNtNgWI3CJxWZRhBHqHMidOWpwuVWG19Pgpyzj4nRahdcWzKv6LAbMYB0kIBEr1cs7gQ==",
       "requires": {
         "@fortawesome/fontawesome-common-types": "^6.1.1"
       }
     },
     "@deephaven/iris-grid": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.55.0.tgz",
-      "integrity": "sha512-LOcT1qHeQhf/VHZ7VcpPfuMvaTqcjH/VdPg0XJVLvHljZIuNmWwIS3bh0Nck/MS3JpYGIdYqhRO3P2sT1gA7EA==",
-      "requires": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/console": "^0.55.0",
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/grid": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/jsapi-utils": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
-        "@deephaven/storage": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.60.0.tgz",
+      "integrity": "sha512-dL1US3EU5ZUVWXlDWFNHFFnDWvUPbV6WjZX+uW0XEFsUxI2bJtwSIiIRXQeTVGEeXHCsb2zq0Gq00aVicH2bog==",
+      "requires": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/console": "^0.60.0",
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/grid": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/jsapi-components": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/jsapi-utils": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
+        "@deephaven/storage": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "@dnd-kit/core": "^6.0.5",
         "@dnd-kit/sortable": "^7.0.0",
         "@dnd-kit/utilities": "^3.2.0",
@@ -33927,15 +34296,15 @@
       },
       "dependencies": {
         "@deephaven/components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+          "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -33955,36 +34324,66 @@
             "shortid": "^2.2.16"
           }
         },
+        "@deephaven/jsapi-bootstrap": {
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.60.0.tgz",
+          "integrity": "sha512-OlsvXnz6tEMF9qFvbmWLqmMlyABzVw7vp0w86up4GZYTczFOKxTYUWPo3qnYhp1iDtRvblfuvMqQCbTI4yrbzQ==",
+          "requires": {
+            "@deephaven/components": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0"
+          }
+        },
+        "@deephaven/jsapi-components": {
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.60.0.tgz",
+          "integrity": "sha512-00fbIKkdl84HdwPJsTD1EwG8cychNPSENurmn3FB2GvO6DdHwjKZvHkZvvtxb8jOUFFGPDYBK8djo4HKM23AVA==",
+          "requires": {
+            "@deephaven/components": "^0.60.0",
+            "@deephaven/jsapi-bootstrap": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/jsapi-utils": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
+            "@types/js-cookie": "^3.0.3",
+            "classnames": "^2.3.2",
+            "js-cookie": "^3.0.5",
+            "lodash.debounce": "^4.0.8",
+            "prop-types": "^15.8.1"
+          }
+        },
         "@deephaven/jsapi-types": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-          "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+          "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q=="
         },
         "@deephaven/jsapi-utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.55.0.tgz",
-          "integrity": "sha512-uDNWPtvkpSSw0j6XhGTq8mupY2mKVsqFEwo/v7D8NxLWRot8vmuXv95rWaH3e6gFuSOROEK2UuaN7c45ZIsHIQ==",
-          "requires": {
-            "@deephaven/filters": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.60.0.tgz",
+          "integrity": "sha512-ZLqwqk9fxLScUEL67XV+H5KP7CrMa67muMqMOjPHcF4tZhAuQIei5BvniUyrpOVLnMxqg0zJ2K0aqLtsOR9/CQ==",
+          "requires": {
+            "@deephaven/filters": "^0.60.0",
+            "@deephaven/jsapi-types": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "lodash.clamp": "^4.0.3",
             "shortid": "^2.2.16"
           }
         },
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -34363,16 +34762,16 @@
     "@deephaven/js-plugin-plotly-express": {
       "version": "file:plugins/plotly-express/src/js",
       "requires": {
-        "@deephaven/chart": "0.55.0",
-        "@deephaven/components": "0.55.0",
-        "@deephaven/dashboard": "0.55.0",
-        "@deephaven/dashboard-core-plugins": "0.55.0",
-        "@deephaven/icons": "0.55.0",
-        "@deephaven/jsapi-bootstrap": "0.55.0",
-        "@deephaven/jsapi-types": "0.55.0",
-        "@deephaven/log": "0.55.0",
-        "@deephaven/plugin": "0.55.0",
-        "@deephaven/utils": "0.55.0",
+        "@deephaven/chart": "0.62.0",
+        "@deephaven/components": "0.62.0",
+        "@deephaven/dashboard": "0.62.0",
+        "@deephaven/dashboard-core-plugins": "0.62.0",
+        "@deephaven/icons": "0.62.0",
+        "@deephaven/jsapi-bootstrap": "0.62.0",
+        "@deephaven/jsapi-types": "0.62.0",
+        "@deephaven/log": "0.62.0",
+        "@deephaven/plugin": "0.62.0",
+        "@deephaven/utils": "0.62.0",
         "@types/deep-equal": "^1.0.1",
         "@types/plotly.js": "^2.12.18",
         "@types/plotly.js-dist-min": "^2.3.1",
@@ -34390,14 +34789,38 @@
         "vite": "~4.1.4"
       },
       "dependencies": {
-        "@deephaven/components": {
-          "version": "0.55.0",
-          "requires": {
+        "@deephaven/chart": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.62.0.tgz",
+          "integrity": "sha512-zakQjG0V+QYdHsr01ThQS2ffhaCnF2a9GtlUDhw43qYfHeEiC2IkkinizY2pYgSJf2CPLNe7ibiIBflifQSBMQ==",
+          "requires": {
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/jsapi-utils": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "deep-equal": "^2.0.5",
+            "lodash.debounce": "^4.0.8",
+            "lodash.set": "^4.3.2",
+            "memoize-one": "^5.1.1",
+            "memoizee": "^0.4.15",
+            "plotly.js": "^2.18.2",
+            "prop-types": "^15.7.2",
+            "react-plotly.js": "^2.6.0"
+          }
+        },
+        "@deephaven/components": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.62.0.tgz",
+          "integrity": "sha512-VKHZgsOO/VL1o9CS794eeRAa28lMQCLRrFbp3KgMBGvZVC68+rtuNpxWnc4zRZLZJxFiAxJbyJcleZS6QyW5Vg==",
+          "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -34417,16 +34840,46 @@
             "shortid": "^2.2.16"
           }
         },
+        "@deephaven/console": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.62.0.tgz",
+          "integrity": "sha512-9jDywMHxiNpUjMMXQhQwI6vwnhEseG1Jf+RreZuTKVFJ4VTmhRg/xG14Bd6p/D6ichVQ4jGtMSLHKmYFYZ9HZg==",
+          "requires": {
+            "@deephaven/chart": "^0.62.0",
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/jsapi-bootstrap": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/storage": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "@fortawesome/react-fontawesome": "^0.2.0",
+            "classnames": "^2.3.1",
+            "linkifyjs": "^4.1.0",
+            "lodash.debounce": "^4.0.8",
+            "lodash.throttle": "^4.1.1",
+            "memoize-one": "^5.1.1",
+            "memoizee": "^0.4.15",
+            "monaco-editor": "^0.41.0",
+            "papaparse": "5.3.2",
+            "popper.js": "^1.16.1",
+            "prop-types": "^15.7.2",
+            "shell-quote": "^1.7.2",
+            "shortid": "^2.2.16"
+          }
+        },
         "@deephaven/dashboard": {
-          "version": "0.55.0",
-          "requires": {
-            "@deephaven/components": "^0.55.0",
-            "@deephaven/golden-layout": "^0.55.0",
-            "@deephaven/jsapi-bootstrap": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/redux": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.62.0.tgz",
+          "integrity": "sha512-tBrpe52cl+UK2jtGGz7lIAJdxNm1givhquz4JKEBDJ/k8rqWwucXsxLgJ22nGASzct14xBk2Gb5IeuH/swkUDg==",
+          "requires": {
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/golden-layout": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/redux": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
             "deep-equal": "^2.0.5",
             "lodash.ismatch": "^4.1.1",
             "lodash.throttle": "^4.1.1",
@@ -34434,55 +34887,262 @@
             "shortid": "^2.2.16"
           }
         },
+        "@deephaven/dashboard-core-plugins": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.62.0.tgz",
+          "integrity": "sha512-c5pULTIPABzEJJSZRPBnCmt6OKxt9Vcy4riI0WX7wj+ZDvfo+Sg59ErBpSoY3bHgDsUzV28bmh2Vn+RBQNN8vQ==",
+          "requires": {
+            "@deephaven/chart": "^0.62.0",
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/console": "^0.62.0",
+            "@deephaven/dashboard": "^0.62.0",
+            "@deephaven/file-explorer": "^0.62.0",
+            "@deephaven/filters": "^0.62.0",
+            "@deephaven/golden-layout": "^0.62.0",
+            "@deephaven/grid": "^0.62.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/iris-grid": "^0.62.0",
+            "@deephaven/jsapi-bootstrap": "^0.62.0",
+            "@deephaven/jsapi-components": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/jsapi-utils": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/plugin": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/redux": "^0.62.0",
+            "@deephaven/storage": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "@fortawesome/react-fontawesome": "^0.2.0",
+            "classnames": "^2.3.1",
+            "deep-equal": "^2.0.5",
+            "lodash.clamp": "^4.0.3",
+            "lodash.debounce": "^4.0.8",
+            "lodash.throttle": "^4.1.1",
+            "memoize-one": "^5.1.1",
+            "memoizee": "^0.4.15",
+            "prop-types": "^15.7.2",
+            "react-markdown": "^6.0.2",
+            "react-transition-group": "^4.4.2",
+            "redux": "^4.2.0",
+            "redux-thunk": "^2.4.1",
+            "remark-gfm": "1.0.0",
+            "shortid": "^2.2.16"
+          }
+        },
+        "@deephaven/file-explorer": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.62.0.tgz",
+          "integrity": "sha512-pc6cH34DNkRxeWgy2ofGv/HUIGpI57LWLxVlnPqX7El/Q+Ma3cSBqj1sQH0uz5uNwP5WHv8q0L32JrJXJef0/Q==",
+          "requires": {
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/storage": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "@fortawesome/fontawesome-svg-core": "^6.2.1",
+            "@fortawesome/react-fontawesome": "^0.2.0",
+            "classnames": "^2.3.1",
+            "lodash.throttle": "^4.1.1",
+            "prop-types": "^15.7.2"
+          }
+        },
+        "@deephaven/filters": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.62.0.tgz",
+          "integrity": "sha512-WTa3z250SRoh8xYmL3gdfddPOwqZBj95sVKaj3LBGGepcTO0Me3vCp9nODl8MyUBaOGBsCXIsrnWX6DFjkiGLQ=="
+        },
         "@deephaven/golden-layout": {
-          "version": "0.55.0",
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.62.0.tgz",
+          "integrity": "sha512-eeXz4GHm3JO8S8GNr5SGrdoeyuktwsH8cFwDy5V3WOVut1QwGVkPiTNb63Lt7F55rdLeuOHVdsXDYNDnDUcZtQ==",
           "requires": {
-            "@deephaven/components": "^0.55.0",
+            "@deephaven/components": "^0.62.0",
             "jquery": "^3.6.0"
           }
         },
+        "@deephaven/grid": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.62.0.tgz",
+          "integrity": "sha512-rqCfJUtu83ApSSBJPOFx6bUyZG+5PMb+CGx74xg8QQ1OO61whfNOW5+A1DWRPnpK3GdOqmu+KMH39KPCXKVLTg==",
+          "requires": {
+            "@deephaven/utils": "^0.62.0",
+            "classnames": "^2.3.1",
+            "color-convert": "^2.0.1",
+            "event-target-shim": "^6.0.2",
+            "linkifyjs": "^4.1.0",
+            "lodash.clamp": "^4.0.3",
+            "memoize-one": "^5.1.1",
+            "memoizee": "^0.4.15",
+            "prop-types": "^15.7.2"
+          }
+        },
+        "@deephaven/icons": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.62.0.tgz",
+          "integrity": "sha512-KQUftXbKj5Oww+Fxjto+wDcr8sFUP1ghhl6ZlynfbIx7KJg6QM6LDwyHIfMv+RX1MQID+i9gcGLnPfBYak7d6A==",
+          "requires": {
+            "@fortawesome/fontawesome-common-types": "^6.1.1"
+          }
+        },
+        "@deephaven/iris-grid": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.62.0.tgz",
+          "integrity": "sha512-LkEbiCEE7MlBC0coaA6gw0tTG77+sV2FDmmK4MuTf0R6PE+EwXCtRdRPrknbBq4DsZynAsWRKB5PIBszQdt3Cw==",
+          "requires": {
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/console": "^0.62.0",
+            "@deephaven/filters": "^0.62.0",
+            "@deephaven/grid": "^0.62.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/jsapi-components": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/jsapi-utils": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/storage": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "@dnd-kit/core": "^6.0.5",
+            "@dnd-kit/sortable": "^7.0.0",
+            "@dnd-kit/utilities": "^3.2.0",
+            "@fortawesome/react-fontawesome": "^0.2.0",
+            "classnames": "^2.3.1",
+            "deep-equal": "^2.0.5",
+            "lodash.clamp": "^4.0.3",
+            "lodash.debounce": "^4.0.8",
+            "lodash.throttle": "^4.1.1",
+            "memoize-one": "^5.1.1",
+            "memoizee": "^0.4.15",
+            "monaco-editor": "^0.41.0",
+            "prop-types": "^15.7.2",
+            "react-beautiful-dnd": "^13.1.0",
+            "react-transition-group": "^4.4.2",
+            "shortid": "^2.2.16"
+          }
+        },
         "@deephaven/jsapi-bootstrap": {
-          "version": "0.55.0",
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.62.0.tgz",
+          "integrity": "sha512-LjXAn2nIyjiIyV7zsjAp921IPrknori6Yzh3RhgqTh8fWLF2x8RNWFpk7AGF/WKfzDJbMrpQ36u3B79PecmTaw==",
           "requires": {
-            "@deephaven/components": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0"
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0"
+          }
+        },
+        "@deephaven/jsapi-components": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.62.0.tgz",
+          "integrity": "sha512-S1zouiD9Imd6g+UsSmrRRykA3IbHw7LLWxoG26sA6ITuNCXw76vpM++mPWsHkAau3WQNxI9QVEUuhHEWkrnK+g==",
+          "requires": {
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/jsapi-bootstrap": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/jsapi-utils": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "@types/js-cookie": "^3.0.3",
+            "classnames": "^2.3.2",
+            "js-cookie": "^3.0.5",
+            "lodash.debounce": "^4.0.8",
+            "prop-types": "^15.8.1"
           }
         },
         "@deephaven/jsapi-types": {
-          "version": "0.55.0"
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.62.0.tgz",
+          "integrity": "sha512-5R/SdTsID37S+tn+l62xOeecSccmnhJtn0/+VOP1taPAZGRcOak36gVJnEos/4hJruiJK1Dri3v9M8P/GfLn8g=="
         },
         "@deephaven/jsapi-utils": {
-          "version": "0.55.0",
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.62.0.tgz",
+          "integrity": "sha512-yWAk+zo2DOViROdpWRmA56xDwZotskIgyJCSO+9wFNxIo2YMUJNydtkB0vLWxXj/+lWWo0qTnbbDD+wNFoFTtg==",
           "requires": {
-            "@deephaven/filters": "^0.55.0",
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/filters": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
             "lodash.clamp": "^4.0.3",
             "shortid": "^2.2.16"
           }
         },
         "@deephaven/log": {
-          "version": "0.55.0",
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.62.0.tgz",
+          "integrity": "sha512-k3CDUJ21u1MzEb/C15qQCGKkXuVzO4Pc3KUTHSYMCyRDyskKbpcyQM88rYiQKFtp2Igyb6mvAdKIj7uubPc8Aw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
+        "@deephaven/plugin": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.62.0.tgz",
+          "integrity": "sha512-IokazAXbWLoITsAlnK+VM3HXtL5zpjH1DWY0mETpJwlMP6kAolhbc/UfDC2bRFYlQzTTHEPjVPVtRskse4JRAA==",
+          "requires": {
+            "@deephaven/components": "^0.62.0",
+            "@deephaven/golden-layout": "^0.62.0",
+            "@deephaven/icons": "^0.62.0",
+            "@deephaven/iris-grid": "^0.62.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/react-hooks": "^0.62.0",
+            "@fortawesome/fontawesome-common-types": "^6.1.1",
+            "@fortawesome/react-fontawesome": "^0.2.0"
+          }
+        },
+        "@deephaven/react-hooks": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.62.0.tgz",
+          "integrity": "sha512-jlCqhSWa9V/jyfynZjPc+WlbQQAnhIilpQvI7bdU9q4fTRDfQvd0nSqr0sA0xODgGq8kBgz+6yzZ9yVWsg7IIA==",
+          "requires": {
+            "@adobe/react-spectrum": "^3.29.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/utils": "^0.62.0",
+            "lodash.debounce": "^4.0.8",
+            "shortid": "^2.2.16"
+          }
+        },
         "@deephaven/redux": {
-          "version": "0.55.0",
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.62.0.tgz",
+          "integrity": "sha512-vmbSAKymKrPlgo3NJ8S/fl/ifjBv3R9pC0Ms/1HqsfNOftXKVlUKSRv/crZPcNWoLsD7fSufPs2lLVQijgXvjg==",
           "requires": {
-            "@deephaven/jsapi-types": "^0.55.0",
-            "@deephaven/jsapi-utils": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/plugin": "^0.55.0",
+            "@deephaven/jsapi-types": "^0.62.0",
+            "@deephaven/jsapi-utils": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "@deephaven/plugin": "^0.62.0",
             "deep-equal": "^2.0.5",
             "redux-thunk": "2.4.1"
           }
         },
+        "@deephaven/storage": {
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.62.0.tgz",
+          "integrity": "sha512-4ALHUPLTkNxmI3rxtjQ46631SIMQZlCI4lwamjQufg06f/KNPOkS2VIp2ZRoyiHhha0pnGADaOWqB6bAdKMMFA==",
+          "requires": {
+            "@deephaven/filters": "^0.62.0",
+            "@deephaven/log": "^0.62.0",
+            "lodash.throttle": "^4.1.1"
+          }
+        },
         "@deephaven/utils": {
-          "version": "0.55.0"
+          "version": "0.62.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.62.0.tgz",
+          "integrity": "sha512-faAhWYpMBSXNVD9hw9VP88pIbNkcPqQkodTdSEitc5MguYg65pP2a63ylYkR0xCgWM5jViy797LY1w3c8ZGgIA=="
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -35022,30 +35682,31 @@
       }
     },
     "@deephaven/plugin": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.55.0.tgz",
-      "integrity": "sha512-YHUZu2hPmONIZ7eFH7HkVsZuDmJYB9plb5oKu7SWDcmfYxfR3xfRFafHO/Z9fPnczJ/9iU8ZqwYuwPtyG9fhEw==",
-      "requires": {
-        "@deephaven/components": "^0.55.0",
-        "@deephaven/golden-layout": "^0.55.0",
-        "@deephaven/icons": "^0.55.0",
-        "@deephaven/iris-grid": "^0.55.0",
-        "@deephaven/jsapi-types": "^0.55.0",
-        "@deephaven/react-hooks": "^0.55.0",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.60.0.tgz",
+      "integrity": "sha512-qGg3ECTf06x/eB8lBDYI9KgW2QqXn2G66EkpNWrAC0PwKK7MeMvUY0+q5eyQTTLdX27dxIq6aTt3D0lv9NO6oA==",
+      "requires": {
+        "@deephaven/components": "^0.60.0",
+        "@deephaven/golden-layout": "^0.60.0",
+        "@deephaven/icons": "^0.60.0",
+        "@deephaven/iris-grid": "^0.60.0",
+        "@deephaven/jsapi-types": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/react-hooks": "^0.60.0",
         "@fortawesome/fontawesome-common-types": "^6.1.1",
         "@fortawesome/react-fontawesome": "^0.2.0"
       },
       "dependencies": {
         "@deephaven/components": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
-          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.60.0.tgz",
+          "integrity": "sha512-liD2ILrDWOoQ1j9qHK7XbO5gQSpuJExQukOE6HmowcjE6ZFx114gSuPbLck97g2QTnNN3L2rqrqaaB+9fgeDMA==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.55.0",
-            "@deephaven/log": "^0.55.0",
-            "@deephaven/react-hooks": "^0.55.0",
-            "@deephaven/utils": "^0.55.0",
+            "@deephaven/icons": "^0.60.0",
+            "@deephaven/log": "^0.60.0",
+            "@deephaven/react-hooks": "^0.60.0",
+            "@deephaven/utils": "^0.60.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -35066,31 +35727,31 @@
           }
         },
         "@deephaven/golden-layout": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.55.0.tgz",
-          "integrity": "sha512-5B4Jm23oR+T5Yd2sq371a/MrIsga5FAPRK4dn/ERMadKT06RmkBZTe9ZeqPhw4Aqk76Thd5NRI8sb7fUIwCL4Q==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.60.0.tgz",
+          "integrity": "sha512-k9+1nJk66N8jYMkId+iE7QZR0r+5izv0pgeGpnqJTmg6eHgfzbwoaaumu4wj4OKTZv++F1JDezRAMHQRskYkYA==",
           "requires": {
-            "@deephaven/components": "^0.55.0",
+            "@deephaven/components": "^0.60.0",
             "jquery": "^3.6.0"
           }
         },
         "@deephaven/jsapi-types": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
-          "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.60.0.tgz",
+          "integrity": "sha512-Ml0/iEjUDQCKdTxwyMQ1lgO2XbohNrYy5NZmpveUaiN/Ml/Kxm1VHBt739kvHVaBVZ10etLR8bmad70fzWpX2Q=="
         },
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -35107,29 +35768,29 @@
       "requires": {}
     },
     "@deephaven/react-hooks": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.55.0.tgz",
-      "integrity": "sha512-YvrjVLWMvPOGUVHV6yDZzpG8L4H1rTXo6GH+Lp2NntR/7KuHKMyPHetQJAYh/z7+zoUqzsTFmiubExLs2+WFeQ==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.60.0.tgz",
+      "integrity": "sha512-R4ZNF9DVCaajpLSEe1Ev1B+K9Iv2fOK7nLWESENb9VhViUkAjBw8DjW1+Qph59NlJkkGd6k2TTsqE7VswO7TNw==",
       "requires": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/log": "^0.55.0",
-        "@deephaven/utils": "^0.55.0",
+        "@deephaven/log": "^0.60.0",
+        "@deephaven/utils": "^0.60.0",
         "lodash.debounce": "^4.0.8",
         "shortid": "^2.2.16"
       },
       "dependencies": {
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
         "@deephaven/utils": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
-          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.60.0.tgz",
+          "integrity": "sha512-EX9/Fw8W69osU1HYwT1auomYbcS3ZcsHr4USlpqxM7S9lcZgeGHsRIXXwck0C/yhdgWLhVTCE30fN2T4/wsqJw=="
         },
         "event-target-shim": {
           "version": "6.0.2",
@@ -35159,19 +35820,19 @@
       }
     },
     "@deephaven/storage": {
-      "version": "0.55.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.55.0.tgz",
-      "integrity": "sha512-4YMs55OR4NgPF9mkG6J4iyywFJzP6BDSB3lfFve1wrAmAfGV4szpShmh6Vj1jBDOncudBwnKC8pSo0fj8s+grg==",
+      "version": "0.60.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.60.0.tgz",
+      "integrity": "sha512-5U27ibvuGOq4U2lGY17VFAPDY2SdrehOrCgbd1pB3cXoX0uQmkJyaOIpNdcN2RNSgzTRYidSa0ilhY6b96wDlg==",
       "requires": {
-        "@deephaven/filters": "^0.55.0",
-        "@deephaven/log": "^0.55.0",
+        "@deephaven/filters": "^0.60.0",
+        "@deephaven/log": "^0.60.0",
         "lodash.throttle": "^4.1.1"
       },
       "dependencies": {
         "@deephaven/log": {
-          "version": "0.55.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
-          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
+          "version": "0.60.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.60.0.tgz",
+          "integrity": "sha512-9LktbG2rlnHv+Sv7Y+l9anPvmFCma7Awylx/Da7Zi9ZFs0fFpnjLIGdPdU6lDgqq4krx8fxCVJnl0bbgVY3btw==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
diff --git a/plugins/plotly-express/src/js/package.json b/plugins/plotly-express/src/js/package.json
index acced0ed0..439099ec8 100644
--- a/plugins/plotly-express/src/js/package.json
+++ b/plugins/plotly-express/src/js/package.json
@@ -35,7 +35,7 @@
     "build": "tsc && vite build"
   },
   "devDependencies": {
-    "@deephaven/jsapi-types": "0.55.0",
+    "@deephaven/jsapi-types": "0.62.0",
     "@types/deep-equal": "^1.0.1",
     "@types/plotly.js": "^2.12.18",
     "@types/plotly.js-dist-min": "^2.3.1",
@@ -50,15 +50,15 @@
     "react": "^17.0.2"
   },
   "dependencies": {
-    "@deephaven/chart": "0.55.0",
-    "@deephaven/components": "0.55.0",
-    "@deephaven/dashboard": "0.55.0",
-    "@deephaven/dashboard-core-plugins": "0.55.0",
-    "@deephaven/icons": "0.55.0",
-    "@deephaven/jsapi-bootstrap": "0.55.0",
-    "@deephaven/log": "0.55.0",
-    "@deephaven/plugin": "0.55.0",
-    "@deephaven/utils": "0.55.0",
+    "@deephaven/chart": "0.62.0",
+    "@deephaven/components": "0.62.0",
+    "@deephaven/dashboard": "0.62.0",
+    "@deephaven/dashboard-core-plugins": "0.62.0",
+    "@deephaven/icons": "0.62.0",
+    "@deephaven/jsapi-bootstrap": "0.62.0",
+    "@deephaven/log": "0.62.0",
+    "@deephaven/plugin": "0.62.0",
+    "@deephaven/utils": "0.62.0",
     "deep-equal": "^2.2.1",
     "plotly.js": "^2.23.0",
     "plotly.js-dist-min": "^2.23.0",
diff --git a/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx b/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx
index 17be31e00..7f8f546be 100644
--- a/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx
+++ b/plugins/plotly-express/src/js/src/PlotlyExpressChart.tsx
@@ -1,13 +1,14 @@
 import React, { useEffect, useRef, useState } from 'react';
 import Plotly from 'plotly.js-dist-min';
 import { Chart } from '@deephaven/chart';
+import type { Widget } from '@deephaven/jsapi-types';
 import { type WidgetComponentProps } from '@deephaven/plugin';
 import { useApi } from '@deephaven/jsapi-bootstrap';
 import PlotlyExpressChartModel from './PlotlyExpressChartModel.js';
 import { useHandleSceneTicks } from './useHandleSceneTicks.js';
 
 export function PlotlyExpressChart(
-  props: WidgetComponentProps
+  props: WidgetComponentProps<Widget>
 ): JSX.Element | null {
   const dh = useApi();
   const { fetch } = props;
diff --git a/plugins/plotly-express/src/js/src/PlotlyExpressChartModel.ts b/plugins/plotly-express/src/js/src/PlotlyExpressChartModel.ts
index d79fc9821..7c9aa1fed 100644
--- a/plugins/plotly-express/src/js/src/PlotlyExpressChartModel.ts
+++ b/plugins/plotly-express/src/js/src/PlotlyExpressChartModel.ts
@@ -101,6 +101,8 @@ export class PlotlyExpressChartModel extends ChartModel {
 
   hasPendingUpdate = false;
 
+  hasInitialLoadCompleted = false;
+
   override getData(): Partial<Data>[] {
     const hydratedData = [...this.plotlyData];
 
@@ -329,6 +331,15 @@ export class PlotlyExpressChartModel extends ChartModel {
   override fireUpdate(data: unknown): void {
     super.fireUpdate(data);
     this.hasPendingUpdate = false;
+
+    // TODO: This will fire on first call to `fireUpdate` even though other data
+    // may still be loading. We should consider making this smarter to fire after
+    // all initial data has loaded.
+    // https://github.com/deephaven/deephaven-plugins/issues/267
+    if (!this.hasInitialLoadCompleted) {
+      this.fireLoadFinished();
+      this.hasInitialLoadCompleted = true;
+    }
   }
 
   pauseUpdates(): void {
diff --git a/plugins/plotly-express/src/js/src/PlotlyExpressChartPanel.tsx b/plugins/plotly-express/src/js/src/PlotlyExpressChartPanel.tsx
index cc6974e2e..db2cd42ad 100644
--- a/plugins/plotly-express/src/js/src/PlotlyExpressChartPanel.tsx
+++ b/plugins/plotly-express/src/js/src/PlotlyExpressChartPanel.tsx
@@ -1,12 +1,13 @@
 import React, { useCallback, useRef, useState } from 'react';
 import Plotly from 'plotly.js-dist-min';
 import { ChartPanel, ChartPanelProps } from '@deephaven/dashboard-core-plugins';
+import type { Widget } from '@deephaven/jsapi-types';
 import { type WidgetPanelProps } from '@deephaven/plugin';
 import { useApi } from '@deephaven/jsapi-bootstrap';
 import PlotlyExpressChartModel from './PlotlyExpressChartModel.js';
 import { useHandleSceneTicks } from './useHandleSceneTicks.js';
 
-export function PlotlyExpressChartPanel(props: WidgetPanelProps) {
+export function PlotlyExpressChartPanel(props: WidgetPanelProps<Widget>) {
   const dh = useApi();
   const { fetch, metadata = {}, ...rest } = props;
   const containerRef = useRef<HTMLDivElement>(null);
diff --git a/plugins/plotly-express/src/js/src/PlotlyExpressPlugin.ts b/plugins/plotly-express/src/js/src/PlotlyExpressPlugin.ts
index 865abab84..9e1bea47f 100644
--- a/plugins/plotly-express/src/js/src/PlotlyExpressPlugin.ts
+++ b/plugins/plotly-express/src/js/src/PlotlyExpressPlugin.ts
@@ -1,9 +1,10 @@
 import { type WidgetPlugin, PluginType } from '@deephaven/plugin';
 import { vsGraph } from '@deephaven/icons';
+import type { Widget } from '@deephaven/jsapi-types';
 import { PlotlyExpressChart } from './PlotlyExpressChart.js';
 import { PlotlyExpressChartPanel } from './PlotlyExpressChartPanel.js';
 
-export const PlotlyExpressPlugin: WidgetPlugin = {
+export const PlotlyExpressPlugin: WidgetPlugin<Widget> = {
   name: '@deephaven/plotly-express',
   type: PluginType.WIDGET_PLUGIN,
   supportedTypes: 'deephaven.plot.express.DeephavenFigure',
diff --git a/plugins/plotly-express/tox.ini b/plugins/plotly-express/tox.ini
index 1c73b2911..689009121 100644
--- a/plugins/plotly-express/tox.ini
+++ b/plugins/plotly-express/tox.ini
@@ -3,6 +3,6 @@ isolated_build = True
 
 [testenv]
 deps =
-    deephaven-server>=0.29.0
+    deephaven-server==0.31.0
 commands =
     python -m unittest discover
\ No newline at end of file


Test patch:
diff --git a/plugins/ui/src/js/src/DocumentHandler.test.tsx b/plugins/ui/src/js/src/DocumentHandler.test.tsx
index 1a654fb31..2e50f6aac 100644
--- a/plugins/ui/src/js/src/DocumentHandler.test.tsx
+++ b/plugins/ui/src/js/src/DocumentHandler.test.tsx
@@ -55,6 +55,8 @@ beforeEach(() => {
 });
 
 it('should throw an error if no children to render', () => {
+  TestUtils.disableConsoleOutput();
+
   const children = makeDocument();
   expect(() => render(makeDocumentHandler({ children }))).toThrow(
     NoChildrenError
@@ -62,6 +64,8 @@ it('should throw an error if no children to render', () => {
 });
 
 it('should throw an error if the document mixes panel and non-panel elements', () => {
+  TestUtils.disableConsoleOutput();
+
   const children = makeDocument([
     makeElement(PANEL_ELEMENT_NAME),
     makeElement('not panel element'),