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

Issue:
ElementPlugin for plugins to wire up displaying an object as an element
Need web-client-ui changes to handle them, see https://github.com/deephaven/web-client-ui/issues/1455

ElementPlugin should not need to define a `Panel` and should get automatically wrapped as necessary.
ElementPlugin should be able to provide a list of objects that it should be registered for in it's package.json (which subsequently gets added to the manifest.json).

Define a proper template/documentation.


Discussion / hints:

Fix patch:
diff --git a/package-lock.json b/package-lock.json
index 0cec347ce..d2f021ca4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -209,25 +209,25 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.22.15",
+      "version": "7.20.12",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.13",
-        "@babel/generator": "^7.22.15",
-        "@babel/helper-compilation-targets": "^7.22.15",
-        "@babel/helper-module-transforms": "^7.22.15",
-        "@babel/helpers": "^7.22.15",
-        "@babel/parser": "^7.22.15",
-        "@babel/template": "^7.22.15",
-        "@babel/traverse": "^7.22.15",
-        "@babel/types": "^7.22.15",
+        "@ampproject/remapping": "^2.1.0",
+        "@babel/code-frame": "^7.18.6",
+        "@babel/generator": "^7.20.7",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helpers": "^7.20.7",
+        "@babel/parser": "^7.20.7",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.12",
+        "@babel/types": "^7.20.7",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.3",
-        "semver": "^6.3.1"
+        "json5": "^2.2.2",
+        "semver": "^6.3.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -3534,8 +3534,9 @@
       }
     },
     "node_modules/@dnd-kit/accessibility": {
-      "version": "3.0.1",
-      "license": "MIT",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz",
+      "integrity": "sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==",
       "dependencies": {
         "tslib": "^2.0.0"
       },
@@ -3544,11 +3545,12 @@
       }
     },
     "node_modules/@dnd-kit/core": {
-      "version": "6.0.8",
-      "license": "MIT",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.1.0.tgz",
+      "integrity": "sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==",
       "dependencies": {
-        "@dnd-kit/accessibility": "^3.0.0",
-        "@dnd-kit/utilities": "^3.2.1",
+        "@dnd-kit/accessibility": "^3.1.0",
+        "@dnd-kit/utilities": "^3.2.2",
         "tslib": "^2.0.0"
       },
       "peerDependencies": {
@@ -3558,7 +3560,8 @@
     },
     "node_modules/@dnd-kit/sortable": {
       "version": "7.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.2.tgz",
+      "integrity": "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==",
       "dependencies": {
         "@dnd-kit/utilities": "^3.2.0",
         "tslib": "^2.0.0"
@@ -3569,8 +3572,9 @@
       }
     },
     "node_modules/@dnd-kit/utilities": {
-      "version": "3.2.1",
-      "license": "MIT",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
+      "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
       "dependencies": {
         "tslib": "^2.0.0"
       },
@@ -8659,12 +8663,12 @@
       }
     },
     "node_modules/@types/aria-query": {
-      "version": "5.0.4",
+      "version": "5.0.3",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/babel__core": {
-      "version": "7.20.4",
+      "version": "7.20.3",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8676,7 +8680,7 @@
       }
     },
     "node_modules/@types/babel__generator": {
-      "version": "7.6.7",
+      "version": "7.6.6",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8684,7 +8688,7 @@
       }
     },
     "node_modules/@types/babel__template": {
-      "version": "7.4.4",
+      "version": "7.4.3",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8693,7 +8697,7 @@
       }
     },
     "node_modules/@types/babel__traverse": {
-      "version": "7.20.4",
+      "version": "7.20.3",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8706,7 +8710,7 @@
       "license": "MIT"
     },
     "node_modules/@types/graceful-fs": {
-      "version": "4.1.9",
+      "version": "4.1.8",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8729,12 +8733,12 @@
       }
     },
     "node_modules/@types/istanbul-lib-coverage": {
-      "version": "2.0.6",
+      "version": "2.0.5",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/istanbul-lib-report": {
-      "version": "3.0.3",
+      "version": "3.0.2",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8742,7 +8746,7 @@
       }
     },
     "node_modules/@types/istanbul-reports": {
-      "version": "3.0.4",
+      "version": "3.0.3",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8750,7 +8754,7 @@
       }
     },
     "node_modules/@types/jest": {
-      "version": "29.5.8",
+      "version": "29.5.6",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8800,11 +8804,11 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "20.9.0",
+      "version": "20.8.8",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~5.26.4"
+        "undici-types": "~5.25.1"
       }
     },
     "node_modules/@types/normalize-package-data": {
@@ -8832,8 +8836,7 @@
     },
     "node_modules/@types/prop-types": {
       "version": "15.7.10",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz",
-      "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A=="
+      "license": "MIT"
     },
     "node_modules/@types/react": {
       "version": "17.0.65",
@@ -8886,7 +8889,7 @@
       "license": "MIT"
     },
     "node_modules/@types/stack-utils": {
-      "version": "2.0.3",
+      "version": "2.0.2",
       "dev": true,
       "license": "MIT"
     },
@@ -8899,7 +8902,7 @@
       }
     },
     "node_modules/@types/tough-cookie": {
-      "version": "4.0.5",
+      "version": "4.0.4",
       "dev": true,
       "license": "MIT"
     },
@@ -8908,7 +8911,7 @@
       "license": "MIT"
     },
     "node_modules/@types/yargs": {
-      "version": "17.0.31",
+      "version": "17.0.29",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8916,7 +8919,7 @@
       }
     },
     "node_modules/@types/yargs-parser": {
-      "version": "21.0.3",
+      "version": "21.0.2",
       "dev": true,
       "license": "MIT"
     },
@@ -9242,7 +9245,7 @@
       }
     },
     "node_modules/acorn-walk": {
-      "version": "8.3.0",
+      "version": "8.2.0",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -12997,7 +13000,7 @@
       }
     },
     "node_modules/flat-cache": {
-      "version": "3.2.0",
+      "version": "3.1.1",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -13006,7 +13009,7 @@
         "rimraf": "^3.0.2"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": ">=12.0.0"
       }
     },
     "node_modules/flatted": {
@@ -14987,7 +14990,7 @@
       }
     },
     "node_modules/istanbul-lib-coverage": {
-      "version": "3.2.2",
+      "version": "3.2.0",
       "dev": true,
       "license": "BSD-3-Clause",
       "engines": {
@@ -17138,8 +17141,9 @@
       }
     },
     "node_modules/linkifyjs": {
-      "version": "4.1.1",
-      "license": "MIT"
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz",
+      "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg=="
     },
     "node_modules/load-json-file": {
       "version": "6.2.0",
@@ -17628,8 +17632,6 @@
     },
     "node_modules/memorystream": {
       "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
-      "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
       "dev": true,
       "engines": {
         "node": ">= 0.10.0"
@@ -18225,7 +18227,8 @@
     },
     "node_modules/monaco-editor": {
       "version": "0.41.0",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.41.0.tgz",
+      "integrity": "sha512-1o4olnZJsiLmv5pwLEAmzHTE/5geLKQ07BrGxlF4Ri/AXAc2yyDGZwHjiTqD8D/ROKUZmwMA28A+yEowLNOEcA=="
     },
     "node_modules/moo-color": {
       "version": "1.0.3",
@@ -18364,9 +18367,8 @@
     },
     "node_modules/nice-try": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/node-addon-api": {
       "version": "3.2.1",
@@ -18755,9 +18757,8 @@
     },
     "node_modules/npm-run-all": {
       "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
-      "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "chalk": "^2.4.1",
@@ -18780,9 +18781,8 @@
     },
     "node_modules/npm-run-all/node_modules/ansi-styles": {
       "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -18792,9 +18792,8 @@
     },
     "node_modules/npm-run-all/node_modules/chalk": {
       "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -18806,24 +18805,21 @@
     },
     "node_modules/npm-run-all/node_modules/color-convert": {
       "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
       }
     },
     "node_modules/npm-run-all/node_modules/color-name": {
       "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/npm-run-all/node_modules/cross-spawn": {
       "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "nice-try": "^1.0.4",
         "path-key": "^2.0.1",
@@ -18837,45 +18833,40 @@
     },
     "node_modules/npm-run-all/node_modules/escape-string-regexp": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
     },
     "node_modules/npm-run-all/node_modules/has-flag": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/npm-run-all/node_modules/path-key": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/npm-run-all/node_modules/semver": {
       "version": "5.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
     },
     "node_modules/npm-run-all/node_modules/shebang-command": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^1.0.0"
       },
@@ -18885,18 +18876,16 @@
     },
     "node_modules/npm-run-all/node_modules/shebang-regex": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/npm-run-all/node_modules/supports-color": {
       "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -18906,9 +18895,8 @@
     },
     "node_modules/npm-run-all/node_modules/which": {
       "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -19695,7 +19683,8 @@
     },
     "node_modules/papaparse": {
       "version": "5.3.2",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz",
+      "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw=="
     },
     "node_modules/parent-module": {
       "version": "1.0.1",
@@ -19906,9 +19895,8 @@
     },
     "node_modules/pidtree": {
       "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
-      "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "pidtree": "bin/pidtree.js"
       },
@@ -21975,9 +21963,8 @@
     },
     "node_modules/string.prototype.padend": {
       "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
-      "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.2.0",
@@ -23156,7 +23143,7 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "5.26.5",
+      "version": "5.25.3",
       "dev": true,
       "license": "MIT"
     },
@@ -24410,17 +24397,18 @@
       "license": "Apache-2.0",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/chart": "^0.54.0",
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/dashboard": "^0.54.0",
-        "@deephaven/dashboard-core-plugins": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/iris-grid": "^0.54.0",
-        "@deephaven/jsapi-bootstrap": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/utils": "^0.54.0",
+        "@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/iris-grid": "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/react-hooks": "0.55.0",
+        "@deephaven/utils": "0.55.0",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "json-rpc-2.0": "^1.6.0",
         "shortid": "^2.2.16"
@@ -24438,44 +24426,16 @@
         "react-dom": "^17.0.2"
       }
     },
-    "plugins/ui/src/js/node_modules/@deephaven/chart": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.54.0.tgz",
-      "integrity": "sha512-0IqI+3mqNIKNQt85z26uTrjYUyhCMh9GkMAPKsNI4UClP6HYPa4Z+X72MaduxaFEw7gg7yw2yJ0hoFyXlHJyLw==",
-      "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/jsapi-utils": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/utils": "^0.54.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/ui/src/js/node_modules/@deephaven/components": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.54.0.tgz",
-      "integrity": "sha512-TAwa2by1EPYT34Oju51LCQGp1w0N9zRBA40DIXh9d7H3mx2YN5SLK1idBWjkrTyR3YIhfAvcZnTvaQpUJM2jIw==",
+      "version": "0.55.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
+      "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/utils": "^0.54.0",
+        "@deephaven/icons": "^0.55.0",
+        "@deephaven/log": "^0.55.0",
+        "@deephaven/react-hooks": "^0.55.0",
+        "@deephaven/utils": "^0.55.0",
         "@fortawesome/fontawesome-svg-core": "^6.2.1",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@react-spectrum/theme-default": "^3.5.1",
@@ -24502,54 +24462,18 @@
         "react-dom": "^17.x"
       }
     },
-    "plugins/ui/src/js/node_modules/@deephaven/console": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.54.0.tgz",
-      "integrity": "sha512-AulFa0NAToNoPexlSFYrloIrkB0lytePsoxbLQbvdq+upBVGhkvQbaBwj4N2mWwfsamy8aWN7q88sflcYYmHIg==",
-      "dependencies": {
-        "@deephaven/chart": "^0.54.0",
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/jsapi-bootstrap": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/storage": "^0.54.0",
-        "@deephaven/utils": "^0.54.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/ui/src/js/node_modules/@deephaven/dashboard": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.54.0.tgz",
-      "integrity": "sha512-Qk4/Mcrmh2xBvYgR8S/u2F3rwnrmbi5OiQu8DZdzri2T2jSmOQHq/s4ShY6C5h7Kcc/4kObI2BLpzfDjCFVpgg==",
-      "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/golden-layout": "^0.54.0",
-        "@deephaven/jsapi-bootstrap": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/redux": "^0.54.0",
-        "@deephaven/utils": "^0.54.0",
+      "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",
         "deep-equal": "^2.0.5",
         "lodash.ismatch": "^4.1.1",
         "lodash.throttle": "^4.1.1",
@@ -24566,93 +24490,12 @@
         "react-redux": "^7.2.4"
       }
     },
-    "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.54.0.tgz",
-      "integrity": "sha512-q/iZIXJG8q4xRt3dkAwbuiknPUWZWs6dToa7xaEt3R0J3029Dh70u4b+VmLvrw2MxvIwgqIqg+lJdGdrAABzow==",
-      "dependencies": {
-        "@deephaven/chart": "^0.54.0",
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/console": "^0.54.0",
-        "@deephaven/dashboard": "^0.54.0",
-        "@deephaven/file-explorer": "^0.54.0",
-        "@deephaven/filters": "^0.54.0",
-        "@deephaven/golden-layout": "^0.54.0",
-        "@deephaven/grid": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/iris-grid": "^0.54.0",
-        "@deephaven/jsapi-bootstrap": "^0.54.0",
-        "@deephaven/jsapi-components": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/jsapi-utils": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/plugin": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/redux": "^0.54.0",
-        "@deephaven/storage": "^0.54.0",
-        "@deephaven/utils": "^0.54.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.0.0",
-        "react-dom": "^17.0.0",
-        "react-redux": "^7.2.4"
-      }
-    },
-    "plugins/ui/src/js/node_modules/@deephaven/file-explorer": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.54.0.tgz",
-      "integrity": "sha512-iAEPhyd/WLXEZKCJHI4ztbsvJAQZPgzLu2uZbRIlmaQR7WAMdx4ejUBbocdwrfX9BaSMiywVX9bcYtB6iyyyjA==",
-      "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/storage": "^0.54.0",
-        "@deephaven/utils": "^0.54.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.0.0"
-      }
-    },
-    "plugins/ui/src/js/node_modules/@deephaven/filters": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.54.0.tgz",
-      "integrity": "sha512-1bCjuKCct06mQOTtoCdln0avwTLVfuwPk4WoOTzwzH0BEEV+QH7M76HqyDH2VLC5Lg0gCLdjz1P+RxWc/6EHAQ==",
-      "engines": {
-        "node": ">=16"
-      }
-    },
     "plugins/ui/src/js/node_modules/@deephaven/golden-layout": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.54.0.tgz",
-      "integrity": "sha512-Ey1KDdpNsrnoehpiWEcUDvocyT35uEjClmmHd/dES/oq+j5Mo57jcJIrsrzOrLsc6aHS/R3aTkPvGzWZ5m04+Q==",
+      "version": "0.55.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.55.0.tgz",
+      "integrity": "sha512-5B4Jm23oR+T5Yd2sq371a/MrIsga5FAPRK4dn/ERMadKT06RmkBZTe9ZeqPhw4Aqk76Thd5NRI8sb7fUIwCL4Q==",
       "dependencies": {
-        "@deephaven/components": "^0.54.0",
+        "@deephaven/components": "^0.55.0",
         "jquery": "^3.6.0"
       },
       "peerDependencies": {
@@ -24660,115 +24503,15 @@
         "react-dom": "^17.x"
       }
     },
-    "plugins/ui/src/js/node_modules/@deephaven/grid": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.54.0.tgz",
-      "integrity": "sha512-VlLTUuuhmDql38vkw7ovVFPiRUB554I+RJtmwzeVIrTnw2mBoquIN8DcSQkVryk2m5l0ggtJiZO4EQvo9L0oLg==",
-      "dependencies": {
-        "@deephaven/utils": "^0.54.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": {
-        "react": "^17.x"
-      }
-    },
-    "plugins/ui/src/js/node_modules/@deephaven/icons": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.54.0.tgz",
-      "integrity": "sha512-vPiuhE53nU33ZCn/Icm28ywmBQT6Tk00EAN/IHjk/fTjhUQRfblG6jV4KLvo9Ktd442aRm6ISqLEzIaZMryMPA==",
-      "dependencies": {
-        "@fortawesome/fontawesome-common-types": "^6.1.1"
-      },
-      "peerDependencies": {
-        "@fortawesome/fontawesome-svg-core": "^6.2.1",
-        "@fortawesome/react-fontawesome": "^0.2.0"
-      }
-    },
-    "plugins/ui/src/js/node_modules/@deephaven/iris-grid": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.54.0.tgz",
-      "integrity": "sha512-/OCn9XSfToXU3Ni6a8pnXxMULHGcnPinFsSWCeWU9deTu1ngf+na5c5v43vLi6URjWW/FWg4eZOasZlMXjyoLQ==",
-      "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/console": "^0.54.0",
-        "@deephaven/filters": "^0.54.0",
-        "@deephaven/grid": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/jsapi-utils": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/storage": "^0.54.0",
-        "@deephaven/utils": "^0.54.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/ui/src/js/node_modules/@deephaven/jsapi-bootstrap": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.54.0.tgz",
-      "integrity": "sha512-UWGRyFUpCcGzXnMLlNXQ10wZmCVVqfmxlhW7+9PIYqYho2dIs/WcDPI6m1jkpGbcUrIeMNQNccRUAcPkM36yGA==",
-      "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "peerDependencies": {
-        "react": "^17.x"
-      }
-    },
-    "plugins/ui/src/js/node_modules/@deephaven/jsapi-components": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.54.0.tgz",
-      "integrity": "sha512-xrPnaSzIgW7a3dcf904lO7JzdJQny+Wb1ez0xFPmvXBQLAKSVRQ4IrxNaU/nqDbyx75pTo5CGgg4tnbv1syhFg==",
+      "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==",
       "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/jsapi-bootstrap": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/jsapi-utils": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/utils": "^0.54.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/components": "^0.55.0",
+        "@deephaven/jsapi-types": "^0.55.0",
+        "@deephaven/log": "^0.55.0",
+        "@deephaven/react-hooks": "^0.55.0"
       },
       "engines": {
         "node": ">=16"
@@ -24778,22 +24521,22 @@
       }
     },
     "plugins/ui/src/js/node_modules/@deephaven/jsapi-types": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.54.0.tgz",
-      "integrity": "sha512-/gDoKamIiMI2DtUaTth/RWBegvkhbhtEbGKsM+h8xejGMESbcWmHLsk+Rae+GK0tQeSajH7YealUwg63MQfK2A==",
+      "version": "0.55.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
+      "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA==",
       "engines": {
         "node": ">=16"
       }
     },
     "plugins/ui/src/js/node_modules/@deephaven/jsapi-utils": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.54.0.tgz",
-      "integrity": "sha512-aUYhfyOL5ewjDRS05pUh6Fnq3BkaO0ApIOZjdIqNrgSxhdW9+ZWASojC9zdzjIa2zUjGTT3PVAGMtTSNhdgPTw==",
-      "dependencies": {
-        "@deephaven/filters": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/utils": "^0.54.0",
+      "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",
         "lodash.clamp": "^4.0.3",
         "shortid": "^2.2.16"
       },
@@ -24802,9 +24545,9 @@
       }
     },
     "plugins/ui/src/js/node_modules/@deephaven/log": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.54.0.tgz",
-      "integrity": "sha512-5w1HcKMq6mBXlch6zCsP+Sx9z0EXJ+HBzeHwHvA2RX5dkVas8HGt2GRxz3/LCt5BdYwKAjsoUW3q/xBSsJ8ZeQ==",
+      "version": "0.55.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
+      "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
       "dependencies": {
         "event-target-shim": "^6.0.2"
       },
@@ -24812,35 +24555,14 @@
         "node": ">=16"
       }
     },
-    "plugins/ui/src/js/node_modules/@deephaven/plugin": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.54.0.tgz",
-      "integrity": "sha512-et6SCCM9hescojL2bLkRzH9ovrNhjaDjSlJ8zxD3RCiQPoTMKj1zRErUe//ghCJXElomnpwwBoVeJ8iBtelP2Q==",
-      "dependencies": {
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/golden-layout": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/iris-grid": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@fortawesome/fontawesome-common-types": "^6.1.1",
-        "@fortawesome/react-fontawesome": "^0.2.0"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "peerDependencies": {
-        "react": "^17.x"
-      }
-    },
     "plugins/ui/src/js/node_modules/@deephaven/react-hooks": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.54.0.tgz",
-      "integrity": "sha512-tQ6qdZHkUFDBnUJBpOKJtUV6ugegFAp31tuk5h7i1Gnc1UMOAiT/3yX1DMu3UbTCumu9yCHh/tdUJlhfNhb8iA==",
+      "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==",
       "dependencies": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/utils": "^0.54.0",
+        "@deephaven/log": "^0.55.0",
+        "@deephaven/utils": "^0.55.0",
         "lodash.debounce": "^4.0.8",
         "shortid": "^2.2.16"
       },
@@ -24852,14 +24574,14 @@
       }
     },
     "plugins/ui/src/js/node_modules/@deephaven/redux": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.54.0.tgz",
-      "integrity": "sha512-hGhDc4/Fu7/vNWDc5Z/1OBU90Upv+MGBmR2JdD/DCrR+1O+nckR+Cfb/bgLQg4j+nkhaaX1fkffSO1g9858qtg==",
-      "dependencies": {
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/jsapi-utils": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/plugin": "^0.54.0",
+      "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",
         "deep-equal": "^2.0.5",
         "redux-thunk": "2.4.1"
       },
@@ -24870,33 +24592,18 @@
         "redux": "^4.2.0"
       }
     },
-    "plugins/ui/src/js/node_modules/@deephaven/storage": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.54.0.tgz",
-      "integrity": "sha512-r54RqEmtUMP31u+p+m63RaZKSW2/m01QBmQaqDZ/8diLj3vJFS9r1FgIpJ8Lja3mMQNc2PoW7XhpbYkeFZm+0w==",
-      "dependencies": {
-        "@deephaven/filters": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "lodash.throttle": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "peerDependencies": {
-        "react": "^17.x"
-      }
-    },
     "plugins/ui/src/js/node_modules/@deephaven/utils": {
-      "version": "0.54.0",
-      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.54.0.tgz",
-      "integrity": "sha512-k52rZZvflfL+RCwjx+CzIfBu6zym4WdDAtq2ddYYrv6IZSpKxXy1fSgecvtNwP3e6kGkARSNZk/iQiP2FNTLVA==",
+      "version": "0.55.0",
+      "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
+      "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q==",
       "engines": {
         "node": ">=16"
       }
     },
     "plugins/ui/src/js/node_modules/react-is": {
       "version": "17.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
       "peer": true
     },
     "plugins/ui/src/js/node_modules/typescript": {
@@ -25045,24 +24752,24 @@
       "dev": true
     },
     "@babel/core": {
-      "version": "7.22.15",
+      "version": "7.20.12",
       "dev": true,
       "requires": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.13",
-        "@babel/generator": "^7.22.15",
-        "@babel/helper-compilation-targets": "^7.22.15",
-        "@babel/helper-module-transforms": "^7.22.15",
-        "@babel/helpers": "^7.22.15",
-        "@babel/parser": "^7.22.15",
-        "@babel/template": "^7.22.15",
-        "@babel/traverse": "^7.22.15",
-        "@babel/types": "^7.22.15",
+        "@ampproject/remapping": "^2.1.0",
+        "@babel/code-frame": "^7.18.6",
+        "@babel/generator": "^7.20.7",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helpers": "^7.20.7",
+        "@babel/parser": "^7.20.7",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.20.12",
+        "@babel/types": "^7.20.7",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.3",
-        "semver": "^6.3.1"
+        "json5": "^2.2.2",
+        "semver": "^6.3.0"
       },
       "dependencies": {
         "semver": {
@@ -27250,17 +26957,18 @@
       "version": "file:plugins/ui/src/js",
       "requires": {
         "@adobe/react-spectrum": "^3.29.0",
-        "@deephaven/chart": "^0.54.0",
-        "@deephaven/components": "^0.54.0",
-        "@deephaven/dashboard": "^0.54.0",
-        "@deephaven/dashboard-core-plugins": "^0.54.0",
-        "@deephaven/icons": "^0.54.0",
-        "@deephaven/iris-grid": "^0.54.0",
-        "@deephaven/jsapi-bootstrap": "^0.54.0",
-        "@deephaven/jsapi-types": "^0.54.0",
-        "@deephaven/log": "^0.54.0",
-        "@deephaven/react-hooks": "^0.54.0",
-        "@deephaven/utils": "^0.54.0",
+        "@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/iris-grid": "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/react-hooks": "0.55.0",
+        "@deephaven/utils": "0.55.0",
         "@fortawesome/react-fontawesome": "^0.2.0",
         "@types/react": "^17.0.2",
         "@vitejs/plugin-react-swc": "^3.0.0",
@@ -27272,38 +26980,16 @@
         "vite": "~4.1.4"
       },
       "dependencies": {
-        "@deephaven/chart": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.54.0.tgz",
-          "integrity": "sha512-0IqI+3mqNIKNQt85z26uTrjYUyhCMh9GkMAPKsNI4UClP6HYPa4Z+X72MaduxaFEw7gg7yw2yJ0hoFyXlHJyLw==",
-          "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/jsapi-utils": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/utils": "^0.54.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.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.54.0.tgz",
-          "integrity": "sha512-TAwa2by1EPYT34Oju51LCQGp1w0N9zRBA40DIXh9d7H3mx2YN5SLK1idBWjkrTyR3YIhfAvcZnTvaQpUJM2jIw==",
+          "version": "0.55.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.55.0.tgz",
+          "integrity": "sha512-S3+Wp586vl7FN5DTDfR9hwiclTHuOzPKnCtF3najC2Qa0e9LK5BTPG8KCZnTuyOmKphLKgXTNQfZhnMkb9tjnw==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/utils": "^0.54.0",
+            "@deephaven/icons": "^0.55.0",
+            "@deephaven/log": "^0.55.0",
+            "@deephaven/react-hooks": "^0.55.0",
+            "@deephaven/utils": "^0.55.0",
             "@fortawesome/fontawesome-svg-core": "^6.2.1",
             "@fortawesome/react-fontawesome": "^0.2.0",
             "@react-spectrum/theme-default": "^3.5.1",
@@ -27323,47 +27009,18 @@
             "shortid": "^2.2.16"
           }
         },
-        "@deephaven/console": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.54.0.tgz",
-          "integrity": "sha512-AulFa0NAToNoPexlSFYrloIrkB0lytePsoxbLQbvdq+upBVGhkvQbaBwj4N2mWwfsamy8aWN7q88sflcYYmHIg==",
-          "requires": {
-            "@deephaven/chart": "^0.54.0",
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/jsapi-bootstrap": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/storage": "^0.54.0",
-            "@deephaven/utils": "^0.54.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.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.54.0.tgz",
-          "integrity": "sha512-Qk4/Mcrmh2xBvYgR8S/u2F3rwnrmbi5OiQu8DZdzri2T2jSmOQHq/s4ShY6C5h7Kcc/4kObI2BLpzfDjCFVpgg==",
-          "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/golden-layout": "^0.54.0",
-            "@deephaven/jsapi-bootstrap": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/redux": "^0.54.0",
-            "@deephaven/utils": "^0.54.0",
+          "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",
             "deep-equal": "^2.0.5",
             "lodash.ismatch": "^4.1.1",
             "lodash.throttle": "^4.1.1",
@@ -27371,250 +27028,86 @@
             "shortid": "^2.2.16"
           }
         },
-        "@deephaven/dashboard-core-plugins": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.54.0.tgz",
-          "integrity": "sha512-q/iZIXJG8q4xRt3dkAwbuiknPUWZWs6dToa7xaEt3R0J3029Dh70u4b+VmLvrw2MxvIwgqIqg+lJdGdrAABzow==",
-          "requires": {
-            "@deephaven/chart": "^0.54.0",
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/console": "^0.54.0",
-            "@deephaven/dashboard": "^0.54.0",
-            "@deephaven/file-explorer": "^0.54.0",
-            "@deephaven/filters": "^0.54.0",
-            "@deephaven/golden-layout": "^0.54.0",
-            "@deephaven/grid": "^0.54.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/iris-grid": "^0.54.0",
-            "@deephaven/jsapi-bootstrap": "^0.54.0",
-            "@deephaven/jsapi-components": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/jsapi-utils": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/plugin": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/redux": "^0.54.0",
-            "@deephaven/storage": "^0.54.0",
-            "@deephaven/utils": "^0.54.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.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.54.0.tgz",
-          "integrity": "sha512-iAEPhyd/WLXEZKCJHI4ztbsvJAQZPgzLu2uZbRIlmaQR7WAMdx4ejUBbocdwrfX9BaSMiywVX9bcYtB6iyyyjA==",
-          "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/storage": "^0.54.0",
-            "@deephaven/utils": "^0.54.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.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.54.0.tgz",
-          "integrity": "sha512-1bCjuKCct06mQOTtoCdln0avwTLVfuwPk4WoOTzwzH0BEEV+QH7M76HqyDH2VLC5Lg0gCLdjz1P+RxWc/6EHAQ=="
-        },
         "@deephaven/golden-layout": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.54.0.tgz",
-          "integrity": "sha512-Ey1KDdpNsrnoehpiWEcUDvocyT35uEjClmmHd/dES/oq+j5Mo57jcJIrsrzOrLsc6aHS/R3aTkPvGzWZ5m04+Q==",
+          "version": "0.55.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.55.0.tgz",
+          "integrity": "sha512-5B4Jm23oR+T5Yd2sq371a/MrIsga5FAPRK4dn/ERMadKT06RmkBZTe9ZeqPhw4Aqk76Thd5NRI8sb7fUIwCL4Q==",
           "requires": {
-            "@deephaven/components": "^0.54.0",
+            "@deephaven/components": "^0.55.0",
             "jquery": "^3.6.0"
           }
         },
-        "@deephaven/grid": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.54.0.tgz",
-          "integrity": "sha512-VlLTUuuhmDql38vkw7ovVFPiRUB554I+RJtmwzeVIrTnw2mBoquIN8DcSQkVryk2m5l0ggtJiZO4EQvo9L0oLg==",
-          "requires": {
-            "@deephaven/utils": "^0.54.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.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.54.0.tgz",
-          "integrity": "sha512-vPiuhE53nU33ZCn/Icm28ywmBQT6Tk00EAN/IHjk/fTjhUQRfblG6jV4KLvo9Ktd442aRm6ISqLEzIaZMryMPA==",
-          "requires": {
-            "@fortawesome/fontawesome-common-types": "^6.1.1"
-          }
-        },
-        "@deephaven/iris-grid": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.54.0.tgz",
-          "integrity": "sha512-/OCn9XSfToXU3Ni6a8pnXxMULHGcnPinFsSWCeWU9deTu1ngf+na5c5v43vLi6URjWW/FWg4eZOasZlMXjyoLQ==",
-          "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/console": "^0.54.0",
-            "@deephaven/filters": "^0.54.0",
-            "@deephaven/grid": "^0.54.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/jsapi-utils": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/storage": "^0.54.0",
-            "@deephaven/utils": "^0.54.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.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.54.0.tgz",
-          "integrity": "sha512-UWGRyFUpCcGzXnMLlNXQ10wZmCVVqfmxlhW7+9PIYqYho2dIs/WcDPI6m1jkpGbcUrIeMNQNccRUAcPkM36yGA==",
+          "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==",
           "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0"
-          }
-        },
-        "@deephaven/jsapi-components": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.54.0.tgz",
-          "integrity": "sha512-xrPnaSzIgW7a3dcf904lO7JzdJQny+Wb1ez0xFPmvXBQLAKSVRQ4IrxNaU/nqDbyx75pTo5CGgg4tnbv1syhFg==",
-          "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/jsapi-bootstrap": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/jsapi-utils": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@deephaven/utils": "^0.54.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/components": "^0.55.0",
+            "@deephaven/jsapi-types": "^0.55.0",
+            "@deephaven/log": "^0.55.0",
+            "@deephaven/react-hooks": "^0.55.0"
           }
         },
         "@deephaven/jsapi-types": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.54.0.tgz",
-          "integrity": "sha512-/gDoKamIiMI2DtUaTth/RWBegvkhbhtEbGKsM+h8xejGMESbcWmHLsk+Rae+GK0tQeSajH7YealUwg63MQfK2A=="
+          "version": "0.55.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-0.55.0.tgz",
+          "integrity": "sha512-ABarKambyZf1ToqQabnc7Bjd0ZY6SgwuUcCl+EAid8C0Ue3ncQnBrKkahs5fu4S+q8dsfxEyC9zz7f2sF1BdzA=="
         },
         "@deephaven/jsapi-utils": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.54.0.tgz",
-          "integrity": "sha512-aUYhfyOL5ewjDRS05pUh6Fnq3BkaO0ApIOZjdIqNrgSxhdW9+ZWASojC9zdzjIa2zUjGTT3PVAGMtTSNhdgPTw==",
-          "requires": {
-            "@deephaven/filters": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/utils": "^0.54.0",
+          "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",
             "lodash.clamp": "^4.0.3",
             "shortid": "^2.2.16"
           }
         },
         "@deephaven/log": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.54.0.tgz",
-          "integrity": "sha512-5w1HcKMq6mBXlch6zCsP+Sx9z0EXJ+HBzeHwHvA2RX5dkVas8HGt2GRxz3/LCt5BdYwKAjsoUW3q/xBSsJ8ZeQ==",
+          "version": "0.55.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.55.0.tgz",
+          "integrity": "sha512-7rY+GmUM2gCQ99Rm2AmqmY3ixVekb70DbLI13UsAiRUxeBO98D473yiL2hUWnANkjMHGgSfAVjNcgwAOwhXgww==",
           "requires": {
             "event-target-shim": "^6.0.2"
           }
         },
-        "@deephaven/plugin": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.54.0.tgz",
-          "integrity": "sha512-et6SCCM9hescojL2bLkRzH9ovrNhjaDjSlJ8zxD3RCiQPoTMKj1zRErUe//ghCJXElomnpwwBoVeJ8iBtelP2Q==",
-          "requires": {
-            "@deephaven/components": "^0.54.0",
-            "@deephaven/golden-layout": "^0.54.0",
-            "@deephaven/icons": "^0.54.0",
-            "@deephaven/iris-grid": "^0.54.0",
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/react-hooks": "^0.54.0",
-            "@fortawesome/fontawesome-common-types": "^6.1.1",
-            "@fortawesome/react-fontawesome": "^0.2.0"
-          }
-        },
         "@deephaven/react-hooks": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.54.0.tgz",
-          "integrity": "sha512-tQ6qdZHkUFDBnUJBpOKJtUV6ugegFAp31tuk5h7i1Gnc1UMOAiT/3yX1DMu3UbTCumu9yCHh/tdUJlhfNhb8iA==",
+          "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==",
           "requires": {
             "@adobe/react-spectrum": "^3.29.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/utils": "^0.54.0",
+            "@deephaven/log": "^0.55.0",
+            "@deephaven/utils": "^0.55.0",
             "lodash.debounce": "^4.0.8",
             "shortid": "^2.2.16"
           }
         },
         "@deephaven/redux": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.54.0.tgz",
-          "integrity": "sha512-hGhDc4/Fu7/vNWDc5Z/1OBU90Upv+MGBmR2JdD/DCrR+1O+nckR+Cfb/bgLQg4j+nkhaaX1fkffSO1g9858qtg==",
-          "requires": {
-            "@deephaven/jsapi-types": "^0.54.0",
-            "@deephaven/jsapi-utils": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "@deephaven/plugin": "^0.54.0",
+          "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",
             "deep-equal": "^2.0.5",
             "redux-thunk": "2.4.1"
           }
         },
-        "@deephaven/storage": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.54.0.tgz",
-          "integrity": "sha512-r54RqEmtUMP31u+p+m63RaZKSW2/m01QBmQaqDZ/8diLj3vJFS9r1FgIpJ8Lja3mMQNc2PoW7XhpbYkeFZm+0w==",
-          "requires": {
-            "@deephaven/filters": "^0.54.0",
-            "@deephaven/log": "^0.54.0",
-            "lodash.throttle": "^4.1.1"
-          }
-        },
         "@deephaven/utils": {
-          "version": "0.54.0",
-          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.54.0.tgz",
-          "integrity": "sha512-k52rZZvflfL+RCwjx+CzIfBu6zym4WdDAtq2ddYYrv6IZSpKxXy1fSgecvtNwP3e6kGkARSNZk/iQiP2FNTLVA=="
+          "version": "0.55.0",
+          "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.55.0.tgz",
+          "integrity": "sha512-+gOiM1WG1iIIAYPJXd7dlN1fGErW7iheQm3d48hR5XwuaipH6Fok7MQ0rf44zyvQkXZJq6QbI8TQbMWOxNcH1Q=="
         },
         "react-is": {
           "version": "17.0.2",
+          "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+          "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
           "peer": true
         },
         "typescript": {
@@ -27812,28 +27305,36 @@
       "version": "0.40.1"
     },
     "@dnd-kit/accessibility": {
-      "version": "3.0.1",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz",
+      "integrity": "sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==",
       "requires": {
         "tslib": "^2.0.0"
       }
     },
     "@dnd-kit/core": {
-      "version": "6.0.8",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.1.0.tgz",
+      "integrity": "sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==",
       "requires": {
-        "@dnd-kit/accessibility": "^3.0.0",
-        "@dnd-kit/utilities": "^3.2.1",
+        "@dnd-kit/accessibility": "^3.1.0",
+        "@dnd-kit/utilities": "^3.2.2",
         "tslib": "^2.0.0"
       }
     },
     "@dnd-kit/sortable": {
       "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.2.tgz",
+      "integrity": "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==",
       "requires": {
         "@dnd-kit/utilities": "^3.2.0",
         "tslib": "^2.0.0"
       }
     },
     "@dnd-kit/utilities": {
-      "version": "3.2.1",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
+      "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
       "requires": {
         "tslib": "^2.0.0"
       }
@@ -31390,11 +30891,11 @@
       }
     },
     "@types/aria-query": {
-      "version": "5.0.4",
+      "version": "5.0.3",
       "dev": true
     },
     "@types/babel__core": {
-      "version": "7.20.4",
+      "version": "7.20.3",
       "dev": true,
       "requires": {
         "@babel/parser": "^7.20.7",
@@ -31405,14 +30906,14 @@
       }
     },
     "@types/babel__generator": {
-      "version": "7.6.7",
+      "version": "7.6.6",
       "dev": true,
       "requires": {
         "@babel/types": "^7.0.0"
       }
     },
     "@types/babel__template": {
-      "version": "7.4.4",
+      "version": "7.4.3",
       "dev": true,
       "requires": {
         "@babel/parser": "^7.1.0",
@@ -31420,7 +30921,7 @@
       }
     },
     "@types/babel__traverse": {
-      "version": "7.20.4",
+      "version": "7.20.3",
       "dev": true,
       "requires": {
         "@babel/types": "^7.20.7"
@@ -31431,7 +30932,7 @@
       "dev": true
     },
     "@types/graceful-fs": {
-      "version": "4.1.9",
+      "version": "4.1.8",
       "dev": true,
       "requires": {
         "@types/node": "*"
@@ -31451,25 +30952,25 @@
       }
     },
     "@types/istanbul-lib-coverage": {
-      "version": "2.0.6",
+      "version": "2.0.5",
       "dev": true
     },
     "@types/istanbul-lib-report": {
-      "version": "3.0.3",
+      "version": "3.0.2",
       "dev": true,
       "requires": {
         "@types/istanbul-lib-coverage": "*"
       }
     },
     "@types/istanbul-reports": {
-      "version": "3.0.4",
+      "version": "3.0.3",
       "dev": true,
       "requires": {
         "@types/istanbul-lib-report": "*"
       }
     },
     "@types/jest": {
-      "version": "29.5.8",
+      "version": "29.5.6",
       "dev": true,
       "requires": {
         "expect": "^29.0.0",
@@ -31511,10 +31012,10 @@
       "dev": true
     },
     "@types/node": {
-      "version": "20.9.0",
+      "version": "20.8.8",
       "dev": true,
       "requires": {
-        "undici-types": "~5.26.4"
+        "undici-types": "~5.25.1"
       }
     },
     "@types/normalize-package-data": {
@@ -31537,9 +31038,7 @@
       }
     },
     "@types/prop-types": {
-      "version": "15.7.10",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz",
-      "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A=="
+      "version": "15.7.10"
     },
     "@types/react": {
       "version": "17.0.65",
@@ -31585,7 +31084,7 @@
       "dev": true
     },
     "@types/stack-utils": {
-      "version": "2.0.3",
+      "version": "2.0.2",
       "dev": true
     },
     "@types/testing-library__jest-dom": {
@@ -31596,21 +31095,21 @@
       }
     },
     "@types/tough-cookie": {
-      "version": "4.0.5",
+      "version": "4.0.4",
       "dev": true
     },
     "@types/unist": {
       "version": "2.0.8"
     },
     "@types/yargs": {
-      "version": "17.0.31",
+      "version": "17.0.29",
       "dev": true,
       "requires": {
         "@types/yargs-parser": "*"
       }
     },
     "@types/yargs-parser": {
-      "version": "21.0.3",
+      "version": "21.0.2",
       "dev": true
     },
     "@typescript-eslint/eslint-plugin": {
@@ -31788,7 +31287,7 @@
       "requires": {}
     },
     "acorn-walk": {
-      "version": "8.3.0",
+      "version": "8.2.0",
       "dev": true
     },
     "add-stream": {
@@ -34270,7 +33769,7 @@
       "dev": true
     },
     "flat-cache": {
-      "version": "3.2.0",
+      "version": "3.1.1",
       "dev": true,
       "requires": {
         "flatted": "^3.2.9",
@@ -35550,7 +35049,7 @@
       "dev": true
     },
     "istanbul-lib-coverage": {
-      "version": "3.2.2",
+      "version": "3.2.0",
       "dev": true
     },
     "istanbul-lib-instrument": {
@@ -36984,7 +36483,9 @@
       "dev": true
     },
     "linkifyjs": {
-      "version": "4.1.1"
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz",
+      "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg=="
     },
     "load-json-file": {
       "version": "6.2.0",
@@ -37317,8 +36818,6 @@
     },
     "memorystream": {
       "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
-      "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
       "dev": true
     },
     "meow": {
@@ -37703,7 +37202,9 @@
       "dev": true
     },
     "monaco-editor": {
-      "version": "0.41.0"
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.41.0.tgz",
+      "integrity": "sha512-1o4olnZJsiLmv5pwLEAmzHTE/5geLKQ07BrGxlF4Ri/AXAc2yyDGZwHjiTqD8D/ROKUZmwMA28A+yEowLNOEcA=="
     },
     "moo-color": {
       "version": "1.0.3",
@@ -37808,8 +37309,6 @@
     },
     "nice-try": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "dev": true
     },
     "node-addon-api": {
@@ -38074,8 +37573,6 @@
     },
     "npm-run-all": {
       "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
-      "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
       "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
@@ -38091,8 +37588,6 @@
       "dependencies": {
         "ansi-styles": {
           "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
           "dev": true,
           "requires": {
             "color-convert": "^1.9.0"
@@ -38100,8 +37595,6 @@
         },
         "chalk": {
           "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "dev": true,
           "requires": {
             "ansi-styles": "^3.2.1",
@@ -38111,8 +37604,6 @@
         },
         "color-convert": {
           "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
           "dev": true,
           "requires": {
             "color-name": "1.1.3"
@@ -38120,14 +37611,10 @@
         },
         "color-name": {
           "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
           "dev": true
         },
         "cross-spawn": {
           "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
           "dev": true,
           "requires": {
             "nice-try": "^1.0.4",
@@ -38139,32 +37626,22 @@
         },
         "escape-string-regexp": {
           "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
           "dev": true
         },
         "has-flag": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
           "dev": true
         },
         "path-key": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-          "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
           "dev": true
         },
         "semver": {
           "version": "5.7.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-          "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
           "dev": true
         },
         "shebang-command": {
           "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-          "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
           "dev": true,
           "requires": {
             "shebang-regex": "^1.0.0"
@@ -38172,14 +37649,10 @@
         },
         "shebang-regex": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-          "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
           "dev": true
         },
         "supports-color": {
           "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
           "dev": true,
           "requires": {
             "has-flag": "^3.0.0"
@@ -38187,8 +37660,6 @@
         },
         "which": {
           "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
           "dev": true,
           "requires": {
             "isexe": "^2.0.0"
@@ -38692,7 +38163,9 @@
       }
     },
     "papaparse": {
-      "version": "5.3.2"
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz",
+      "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw=="
     },
     "parent-module": {
       "version": "1.0.1",
@@ -38833,8 +38306,6 @@
     },
     "pidtree": {
       "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
-      "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
       "dev": true
     },
     "pify": {
@@ -40179,8 +39650,6 @@
     },
     "string.prototype.padend": {
       "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
-      "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==",
       "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
@@ -40936,7 +40405,7 @@
       }
     },
     "undici-types": {
-      "version": "5.26.5",
+      "version": "5.25.3",
       "dev": true
     },
     "unicode-canonical-property-names-ecmascript": {
diff --git a/plugins/ui/src/js/package.json b/plugins/ui/src/js/package.json
index cb5a5df40..7d7c748a5 100644
--- a/plugins/ui/src/js/package.json
+++ b/plugins/ui/src/js/package.json
@@ -41,17 +41,18 @@
   },
   "dependencies": {
     "@adobe/react-spectrum": "^3.29.0",
-    "@deephaven/chart": "^0.54.0",
-    "@deephaven/components": "^0.54.0",
-    "@deephaven/dashboard": "^0.54.0",
-    "@deephaven/dashboard-core-plugins": "^0.54.0",
-    "@deephaven/icons": "^0.54.0",
-    "@deephaven/iris-grid": "^0.54.0",
-    "@deephaven/jsapi-bootstrap": "^0.54.0",
-    "@deephaven/jsapi-types": "^0.54.0",
-    "@deephaven/log": "^0.54.0",
-    "@deephaven/react-hooks": "^0.54.0",
-    "@deephaven/utils": "^0.54.0",
+    "@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/iris-grid": "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/react-hooks": "0.55.0",
+    "@deephaven/utils": "0.55.0",
     "@fortawesome/react-fontawesome": "^0.2.0",
     "shortid": "^2.2.16",
     "json-rpc-2.0": "^1.6.0"
diff --git a/plugins/ui/src/js/src/DashboardPlugin.tsx b/plugins/ui/src/js/src/DashboardPlugin.tsx
index 88de75dc9..b65d7d21e 100644
--- a/plugins/ui/src/js/src/DashboardPlugin.tsx
+++ b/plugins/ui/src/js/src/DashboardPlugin.tsx
@@ -7,7 +7,7 @@ import {
   useListener,
 } from '@deephaven/dashboard';
 import Log from '@deephaven/log';
-import { JsWidget } from '@deephaven/jsapi-types';
+import { Widget } from '@deephaven/jsapi-types';
 import type { VariableDefinition } from '@deephaven/jsapi-types';
 import styles from './styles.scss?inline';
 import { WidgetWrapper } from './WidgetTypes';
@@ -36,7 +36,7 @@ export function DashboardPlugin({
       widget,
     }: {
       dragEvent?: React.DragEvent;
-      fetch: () => Promise<JsWidget>;
+      fetch: () => Promise<Widget>;
       metadata?: Record<string, unknown>;
       panelId?: string;
       widget: VariableDefinition;
diff --git a/plugins/ui/src/js/src/ElementUtils.ts b/plugins/ui/src/js/src/ElementUtils.ts
index f44ae1c12..01d69bfff 100644
--- a/plugins/ui/src/js/src/ElementUtils.ts
+++ b/plugins/ui/src/js/src/ElementUtils.ts
@@ -1,4 +1,4 @@
-import { WidgetExportedObject } from '@deephaven/jsapi-types';
+import type { WidgetExportedObject } from '@deephaven/jsapi-types';
 
 export const CALLABLE_KEY = '__dhCbid';
 export const OBJECT_KEY = '__dhObid';
diff --git a/plugins/ui/src/js/src/FigureObject.tsx b/plugins/ui/src/js/src/FigureObject.tsx
deleted file mode 100644
index 079f25834..000000000
--- a/plugins/ui/src/js/src/FigureObject.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import {
-  Chart,
-  ChartModel,
-  ChartModelFactory,
-  useChartTheme,
-} from '@deephaven/chart';
-import { useApi } from '@deephaven/jsapi-bootstrap';
-import type { Figure } from '@deephaven/jsapi-types';
-import { View } from '@adobe/react-spectrum';
-
-export interface FigureObjectProps {
-  object: Figure;
-}
-
-function FigureObject({ object }: FigureObjectProps) {
-  const dh = useApi();
-  const [model, setModel] = useState<ChartModel>();
-  const chartTheme = useChartTheme();
-
-  useEffect(() => {
-    async function loadModel() {
-      const newModel = await ChartModelFactory.makeModel(
-        dh,
-        undefined,
-        object,
-        chartTheme
-      );
-      setModel(newModel);
-    }
-    loadModel();
-  }, [chartTheme, dh, object]);
-
-  return (
-    <View flexGrow={1} flexShrink={1} overflow="hidden" position="relative">
-      {model && <Chart model={model} />}
-    </View>
-  );
-}
-
-FigureObject.displayName = 'FigureObject';
-
-export default FigureObject;
diff --git a/plugins/ui/src/js/src/ObjectView.tsx b/plugins/ui/src/js/src/ObjectView.tsx
index c6896aa63..987068ef5 100644
--- a/plugins/ui/src/js/src/ObjectView.tsx
+++ b/plugins/ui/src/js/src/ObjectView.tsx
@@ -1,47 +1,43 @@
-import React, { useEffect, useState } from 'react';
-import type { Figure, Table } from '@deephaven/jsapi-types';
+import React, { useCallback, useMemo } from 'react';
 import Log from '@deephaven/log';
-import TableObject from './TableObject';
-import FigureObject from './FigureObject';
-import { ExportedObject } from './ElementUtils';
+import { isWidgetPlugin, usePlugins } from '@deephaven/plugin';
+import type { Widget, WidgetExportedObject } from '@deephaven/jsapi-types';
 
 const log = Log.module('@deephaven/js-plugin-ui/ObjectView');
 
 export interface ObjectViewProps {
-  object: ExportedObject;
+  object: WidgetExportedObject;
 }
 
 function ObjectView(props: ObjectViewProps) {
   const { object } = props;
-  const [widget, setWidget] = useState<unknown>();
   log.info('Object is', object);
 
-  // Just load the object on mount
-  useEffect(() => {
-    async function loadWidget() {
-      const newWidget = await object.fetch();
-      setWidget(newWidget);
-    }
-    loadWidget();
-  }, [object]);
+  const fetch = useCallback(() => object.fetch() as Promise<Widget>, [object]);
 
-  if (widget == null) {
+  const plugins = usePlugins();
+
+  const plugin = useMemo(
+    () =>
+      [...plugins.values()]
+        .filter(isWidgetPlugin)
+        .find(p => [p.supportedTypes].flat().includes(object.type)),
+    [plugins, object.type]
+  );
+
+  if (object == null) {
     // Still loading
     return null;
   }
 
-  switch (object.type) {
-    case 'Table':
-    case 'TreeTable':
-    case 'HierarchicalTable':
-      return <TableObject object={widget as Table} />;
-    case 'Figure':
-      return <FigureObject object={widget as Figure} />;
-    default:
-      // TODO: Need to handle other types of objects registered by other plugins (e.g. Deephaven Express)
-      log.warn('Unknown object type', object.type);
-      return <div>Unknown object type: {object.type}</div>;
+  if (plugin != null) {
+    const Component = plugin.component;
+    // eslint-disable-next-line react/jsx-props-no-spreading
+    return <Component {...props} fetch={fetch} />;
   }
+
+  log.warn('Unknown object type', object.type);
+  return <div>Unknown object type: {object.type}</div>;
 }
 
 ObjectView.displayName = 'ObjectView';
diff --git a/plugins/ui/src/js/src/UITable.tsx b/plugins/ui/src/js/src/UITable.tsx
index 8893eb878..7106650b8 100644
--- a/plugins/ui/src/js/src/UITable.tsx
+++ b/plugins/ui/src/js/src/UITable.tsx
@@ -21,7 +21,7 @@ function UITable({ element }: UITableProps) {
   useEffect(() => {
     async function loadModel() {
       log.debug('Loading table from props', element.props);
-      const newTable = await element.props.table.fetch();
+      const newTable = (await element.props.table.fetch()) as Table;
       setTable(newTable);
     }
     loadModel();
diff --git a/plugins/ui/src/js/src/UITableUtils.tsx b/plugins/ui/src/js/src/UITableUtils.tsx
index 555b2b7f6..a7992b45a 100644
--- a/plugins/ui/src/js/src/UITableUtils.tsx
+++ b/plugins/ui/src/js/src/UITableUtils.tsx
@@ -1,10 +1,5 @@
-import type { Table } from '@deephaven/jsapi-types';
-import {
-  ELEMENT_KEY,
-  ElementNode,
-  ExportedObject,
-  isElementNode,
-} from './ElementUtils';
+import type { WidgetExportedObject } from '@deephaven/jsapi-types';
+import { ELEMENT_KEY, ElementNode, isElementNode } from './ElementUtils';
 
 export const UITABLE_ELEMENT_TYPE = 'deephaven.ui.elements.UITable';
 
@@ -13,7 +8,7 @@ export type UITableElementName = `${typeof UITABLE_ELEMENT_TYPE}`;
 export type UITableNode = ElementNode & {
   [ELEMENT_KEY]: UITableElementName;
   props: {
-    table: ExportedObject<Table>;
+    table: WidgetExportedObject;
     onRowDoublePress?: (
       rowIndex: number,
       rowData: Record<string, unknown>
diff --git a/plugins/ui/src/js/src/WidgetHandler.tsx b/plugins/ui/src/js/src/WidgetHandler.tsx
index 190e00fce..ffdc64fa3 100644
--- a/plugins/ui/src/js/src/WidgetHandler.tsx
+++ b/plugins/ui/src/js/src/WidgetHandler.tsx
@@ -8,7 +8,7 @@ import {
   JSONRPCServerAndClient,
 } from 'json-rpc-2.0';
 import { useApi } from '@deephaven/jsapi-bootstrap';
-import { Widget, WidgetExportedObject } from '@deephaven/jsapi-types';
+import type { Widget, WidgetExportedObject } from '@deephaven/jsapi-types';
 import Log from '@deephaven/log';
 import {
   CALLABLE_KEY,
diff --git a/plugins/ui/src/js/src/WidgetTestUtils.ts b/plugins/ui/src/js/src/WidgetTestUtils.ts
index 910c4116a..1db3930f0 100644
--- a/plugins/ui/src/js/src/WidgetTestUtils.ts
+++ b/plugins/ui/src/js/src/WidgetTestUtils.ts
@@ -1,6 +1,7 @@
 import { WidgetDefinition } from '@deephaven/dashboard';
 import { TestUtils } from '@deephaven/utils';
-import { JsWidget, WidgetWrapper } from './WidgetTypes';
+import type { Widget } from '@deephaven/jsapi-types';
+import { WidgetWrapper } from './WidgetTypes';
 
 export function makeDocumentUpdatedJsonRpc(
   document: Record<string, unknown> = {}
@@ -33,8 +34,8 @@ export function makeWidgetDefinition({
 export function makeWidget({
   addEventListener = jest.fn(() => jest.fn()),
   getDataAsString = () => makeDocumentUpdatedJsonRpcString(),
-}: Partial<JsWidget> = {}): JsWidget {
-  return TestUtils.createMockProxy<JsWidget>({
+}: Partial<Widget> = {}): Widget {
+  return TestUtils.createMockProxy<Widget>({
     addEventListener,
     getDataAsString,
   });
diff --git a/plugins/ui/src/js/src/WidgetTypes.ts b/plugins/ui/src/js/src/WidgetTypes.ts
index ce08d8958..f0ca0ca3c 100644
--- a/plugins/ui/src/js/src/WidgetTypes.ts
+++ b/plugins/ui/src/js/src/WidgetTypes.ts
@@ -1,5 +1,5 @@
 import { WidgetDefinition } from '@deephaven/dashboard';
-import { JsWidget, WidgetExportedObject } from '@deephaven/jsapi-types';
+import { Widget, WidgetExportedObject } from '@deephaven/jsapi-types';
 
 export interface WidgetMessageDetails {
   getDataAsBase64(): string;
@@ -9,7 +9,7 @@ export interface WidgetMessageDetails {
 
 export type WidgetMessageEvent = CustomEvent<WidgetMessageDetails>;
 
-export type WidgetFetch = () => Promise<JsWidget>;
+export type WidgetFetch = () => Promise<Widget>;
 
 export type WidgetWrapper = {
   definition: WidgetDefinition;
diff --git a/plugins/ui/src/js/vite.config.ts b/plugins/ui/src/js/vite.config.ts
index cbb5e49d0..8a8fd9d9c 100644
--- a/plugins/ui/src/js/vite.config.ts
+++ b/plugins/ui/src/js/vite.config.ts
@@ -25,6 +25,7 @@ export default defineConfig(({ mode }) => ({
         '@deephaven/iris-grid',
         '@deephaven/jsapi-bootstrap',
         '@deephaven/log',
+        '@deephaven/plugin',
       ],
     },
   },


Test patch:
diff --git a/plugins/ui/src/js/src/WidgetHandler.test.tsx b/plugins/ui/src/js/src/WidgetHandler.test.tsx
index 3f6b7e96b..910e09287 100644
--- a/plugins/ui/src/js/src/WidgetHandler.test.tsx
+++ b/plugins/ui/src/js/src/WidgetHandler.test.tsx
@@ -1,6 +1,6 @@
 import React from 'react';
 import { act, render } from '@testing-library/react';
-import { JsWidget } from '@deephaven/jsapi-types';
+import type { Widget } from '@deephaven/jsapi-types';
 import WidgetHandler, { WidgetHandlerProps } from './WidgetHandler';
 import { DocumentHandlerProps } from './DocumentHandler';
 import {
@@ -40,8 +40,8 @@ it('mounts and unmounts', async () => {
 });
 
 it('updates the document when event is received', async () => {
-  let fetchResolve: (value: JsWidget | PromiseLike<JsWidget>) => void;
-  const fetchPromise = new Promise<JsWidget>(resolve => {
+  let fetchResolve: (value: Widget | PromiseLike<Widget>) => void;
+  const fetchPromise = new Promise<Widget>(resolve => {
     fetchResolve = resolve;
   });
   const fetch = jest.fn(() => fetchPromise);