@osdk/react-devtools 0.12.0 → 0.12.1-main-e3a6fa4fb529f640175ebec3bec4c55bc8854f9c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @osdk/react-devtools
2
2
 
3
+ ## 0.12.1-main-e3a6fa4fb529f640175ebec3bec4c55bc8854f9c
4
+
5
+ ### Patch Changes
6
+
7
+ - e3a6fa4: add client metrics (cache, latency, and optimistic-update effectiveness) that the redesigned performance tab reads
8
+ - 7449f91: Restyle the MonitoringPanel devtools tab bar to use Blueprint Tabs
9
+
3
10
  ## 0.12.0
4
11
 
5
12
  ### Minor Changes
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { Button, Classes, PortalProvider, Tooltip } from "@blueprintjs/core";
17
+ import { Button, Classes, PortalProvider, Tab, Tabs, Tooltip } from "@blueprintjs/core";
18
18
  import classNames from "classnames";
19
19
  import React, { useCallback, useMemo, useRef, useState } from "react";
20
20
  import { createPortal } from "react-dom";
@@ -75,6 +75,7 @@ const UI_CONSTANTS = {
75
75
  MAX_DOCKED_BOTTOM_HEIGHT: 800,
76
76
  MAX_DOCKED_RIGHT_WIDTH: 800
77
77
  };
78
+ const DEVTOOLS_TAB_IDS = ["performance", "compute", "intercept", "debugging"];
78
79
  export const MonitoringPanel = ({
79
80
  monitorStore
80
81
  }) => {
@@ -82,7 +83,12 @@ export const MonitoringPanel = ({
82
83
  const computeStore = monitorStore.getComputeStore();
83
84
  const fiberCapabilities = useFiberCapabilities();
84
85
  const [activeTab, setActiveTab] = useState("performance");
85
- const [position, setPosition] = usePersistedState("osdk-monitor-position", {
86
+ const onActiveTabChange = useCallback(newTabId => {
87
+ if (isDevtoolsTabId(newTabId)) {
88
+ setActiveTab(newTabId);
89
+ }
90
+ }, []);
91
+ const [position, setPosition] = usePersistedState(`monitor-position`, {
86
92
  x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,
87
93
  y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,
88
94
  width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,
@@ -90,7 +96,7 @@ export const MonitoringPanel = ({
90
96
  collapsed: false,
91
97
  dockMode: "floating"
92
98
  });
93
- const [themePreference, setThemePreference] = usePersistedState("osdk-devtools-theme", "dark");
99
+ const [themePreference, setThemePreference] = usePersistedState("devtools-theme", "dark");
94
100
  const systemPrefersDark = React.useSyncExternalStore(subscribeDarkMode, getDarkModeSnapshot);
95
101
  const resolvedTheme = useMemo(() => themePreference === "auto" ? systemPrefersDark ? "dark" : "light" : themePreference, [themePreference, systemPrefersDark]);
96
102
 
@@ -303,6 +309,7 @@ export const MonitoringPanel = ({
303
309
  }, /*#__PURE__*/React.createElement("div", {
304
310
  className: styles.minimized,
305
311
  "data-dt-theme": resolvedTheme,
312
+ "aria-label": "View OSDK Devtools",
306
313
  onClick: () => setPosition(prev => ({
307
314
  ...prev,
308
315
  collapsed: false
@@ -311,7 +318,9 @@ export const MonitoringPanel = ({
311
318
  className: styles.minimizedIcon
312
319
  }, "</>")))), shadowMount);
313
320
  }
314
- const panelClassName = classNames(styles.panel, resolvedTheme === "dark" ? Classes.DARK : undefined, {
321
+ const panelClassName = classNames(styles.panel,
322
+ // Class needed to remove the useless outline added on tabs/buttons
323
+ Classes.FOCUS_DISABLED, resolvedTheme === "dark" ? Classes.DARK : undefined, {
315
324
  [styles.floating]: position.dockMode === "floating",
316
325
  [styles.dockedBottom]: position.dockMode === "docked-bottom",
317
326
  [styles.dockedRight]: position.dockMode === "docked-right"
@@ -408,39 +417,48 @@ export const MonitoringPanel = ({
408
417
  title: "Minimize",
409
418
  "aria-label": "Minimize devtools panel"
410
419
  }))), /*#__PURE__*/React.createElement("div", {
411
- className: styles.tabs,
412
- role: "tablist",
413
- "aria-label": "Devtools tabs"
414
- }, ["performance", "compute", "intercept", "debugging"].map(tab => /*#__PURE__*/React.createElement("button", {
415
- key: tab,
416
- type: "button",
417
- role: "tab",
418
- "aria-selected": activeTab === tab,
419
- className: classNames(styles.tabButton, activeTab === tab && styles.tabButtonActive),
420
- onClick: () => setActiveTab(tab)
421
- }, tab.charAt(0).toUpperCase() + tab.slice(1)))), /*#__PURE__*/React.createElement("div", {
422
420
  className: styles.content
423
421
  }, (!fiberCapabilities.hookInstalled || !fiberCapabilities.fiberAccessWorking) && /*#__PURE__*/React.createElement(DegradationNotice, {
422
+ className: styles.notice,
424
423
  onRetry: () => validateFiberAccess()
425
- }), /*#__PURE__*/React.createElement("div", {
426
- className: activeTab === "performance" ? styles.tabContentVisible : styles.tabContentHidden
427
- }, /*#__PURE__*/React.createElement(PerformanceTab, {
428
- metricsStore: metricsStore,
429
- monitorStore: monitorStore
430
- })), /*#__PURE__*/React.createElement("div", {
431
- className: activeTab === "compute" ? styles.tabContentVisible : styles.tabContentHidden
432
- }, /*#__PURE__*/React.createElement(ComputeTab, {
433
- computeStore: computeStore
434
- })), /*#__PURE__*/React.createElement("div", {
435
- className: activeTab === "intercept" ? styles.tabContentVisible : styles.tabContentHidden
436
- }, /*#__PURE__*/React.createElement(InterceptTab, {
437
- monitorStore: monitorStore,
438
- theme: resolvedTheme
439
- })), /*#__PURE__*/React.createElement("div", {
440
- className: activeTab === "debugging" ? styles.tabContentVisible : styles.tabContentHidden
441
- }, /*#__PURE__*/React.createElement(DebuggingTab, {
442
- monitorStore: monitorStore
424
+ }), /*#__PURE__*/React.createElement(Tabs, {
425
+ className: styles.tabs,
426
+ selectedTabId: activeTab,
427
+ onChange: onActiveTabChange
428
+ }, /*#__PURE__*/React.createElement(Tab, {
429
+ id: "performance",
430
+ title: "Performance",
431
+ panelClassName: styles.tabPanel,
432
+ panel: /*#__PURE__*/React.createElement(PerformanceTab, {
433
+ metricsStore: metricsStore,
434
+ monitorStore: monitorStore
435
+ })
436
+ }), /*#__PURE__*/React.createElement(Tab, {
437
+ id: "compute",
438
+ title: "Compute",
439
+ panelClassName: styles.tabPanel,
440
+ panel: /*#__PURE__*/React.createElement(ComputeTab, {
441
+ computeStore: computeStore
442
+ })
443
+ }), /*#__PURE__*/React.createElement(Tab, {
444
+ id: "intercept",
445
+ title: "Intercept",
446
+ panelClassName: styles.tabPanel,
447
+ panel: /*#__PURE__*/React.createElement(InterceptTab, {
448
+ monitorStore: monitorStore,
449
+ theme: resolvedTheme
450
+ })
451
+ }), /*#__PURE__*/React.createElement(Tab, {
452
+ id: "debugging",
453
+ title: "Debugging",
454
+ panelClassName: styles.tabPanel,
455
+ panel: /*#__PURE__*/React.createElement(DebuggingTab, {
456
+ monitorStore: monitorStore
457
+ })
443
458
  }))))), shadowMount);
444
459
  };
445
460
  export const SafeMonitoringPanel = props => /*#__PURE__*/React.createElement(MonitorErrorBoundary, null, /*#__PURE__*/React.createElement(MonitoringPanel, props));
461
+ function isDevtoolsTabId(id) {
462
+ return DEVTOOLS_TAB_IDS.some(tabId => tabId === id);
463
+ }
446
464
  //# sourceMappingURL=MonitoringPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MonitoringPanel.js","names":["Button","Classes","PortalProvider","Tooltip","classNames","React","useCallback","useMemo","useRef","useState","createPortal","DegradationNotice","useFiberCapabilities","validateFiberAccess","usePersistedState","getDevtoolsShadowMount","ComputeTab","DebuggingTab","InterceptTab","MonitorErrorBoundary","PerformanceTab","styles","darkModeMql","window","matchMedia","undefined","subscribeDarkMode","callback","addEventListener","removeEventListener","getDarkModeSnapshot","matches","subscribeWindowSize","windowSizeSnapshot","width","innerWidth","height","innerHeight","getWindowSizeSnapshot","current","UI_CONSTANTS","DEFAULT_PANEL_WIDTH","DEFAULT_PANEL_HEIGHT","DEFAULT_PANEL_RIGHT_OFFSET","DEFAULT_PANEL_TOP_OFFSET","MIN_PANEL_WIDTH","MIN_PANEL_HEIGHT","TOOLTIP_HOVER_DELAY","DOCKED_BOTTOM_HEIGHT","DOCKED_RIGHT_WIDTH","MIN_DOCKED_BOTTOM_HEIGHT","MIN_DOCKED_RIGHT_WIDTH","MAX_DOCKED_BOTTOM_HEIGHT","MAX_DOCKED_RIGHT_WIDTH","MonitoringPanel","monitorStore","metricsStore","getMetricsStore","computeStore","getComputeStore","fiberCapabilities","activeTab","setActiveTab","position","setPosition","x","y","collapsed","dockMode","themePreference","setThemePreference","systemPrefersDark","useSyncExternalStore","resolvedTheme","shadowMount","panelEl","setPanelEl","isDragging","isResizing","dragStart","elemX","elemY","resizeStart","setPositionRef","dragAbortRef","attachDragListeners","abort","controller","AbortController","signal","document","e","deltaX","clientX","deltaY","clientY","prev","Math","max","min","handle","newHeight","newWidth","newX","newY","includes","handleMouseDown","target","closest","controls","preventDefault","handleResizeMouseDown","stopPropagation","handleDockToggle","nextMode","windowSize","effectivePosition","maxX","maxY","createElement","portalContainer","content","placement","hoverOpenDelay","className","minimized","onClick","minimizedIcon","panelClassName","panel","DARK","floating","dockedBottom","dockedRight","ref","style","left","top","right","bottom","cls","horizontal","vertical","corner","topLeft","topRight","bottomLeft","bottomRight","map","key","resizeHandle","onMouseDown","header","title","badge","variant","size","icon","reset","tabs","role","tab","type","tabButton","tabButtonActive","charAt","toUpperCase","slice","hookInstalled","fiberAccessWorking","onRetry","tabContentVisible","tabContentHidden","theme","SafeMonitoringPanel","props"],"sources":["MonitoringPanel.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, Classes, PortalProvider, Tooltip } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n DegradationNotice,\n useFiberCapabilities,\n} from \"../fiber/DegradationNotice.js\";\nimport { validateFiberAccess } from \"../fiber/validation.js\";\nimport { usePersistedState } from \"../hooks/usePersistedState.js\";\nimport { getDevtoolsShadowMount } from \"../shadow/ShadowHost.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\nimport type { PanelPosition } from \"../types/index.js\";\nimport { ComputeTab } from \"./ComputeTab.js\";\nimport { DebuggingTab } from \"./DebuggingTab.js\";\nimport { InterceptTab } from \"./InterceptTab.js\";\nimport { MonitorErrorBoundary } from \"./MonitorErrorBoundary.js\";\nimport { PerformanceTab } from \"./PerformanceTab.js\";\n\nimport styles from \"./MonitoringPanel.module.scss\";\n\nconst darkModeMql =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : undefined;\n\nfunction subscribeDarkMode(callback: () => void): () => void {\n if (darkModeMql) {\n darkModeMql.addEventListener(\"change\", callback);\n return () => darkModeMql.removeEventListener(\"change\", callback);\n }\n return () => {};\n}\n\nfunction getDarkModeSnapshot(): boolean {\n return darkModeMql ? darkModeMql.matches : true;\n}\n\nfunction subscribeWindowSize(callback: () => void): () => void {\n window.addEventListener(\"resize\", callback);\n return () => window.removeEventListener(\"resize\", callback);\n}\n\nlet windowSizeSnapshot =\n typeof window !== \"undefined\"\n ? { width: window.innerWidth, height: window.innerHeight }\n : { width: 0, height: 0 };\n\nfunction getWindowSizeSnapshot(): { width: number; height: number } {\n const current = { width: window.innerWidth, height: window.innerHeight };\n if (\n current.width !== windowSizeSnapshot.width ||\n current.height !== windowSizeSnapshot.height\n ) {\n windowSizeSnapshot = current;\n }\n return windowSizeSnapshot;\n}\n\nconst UI_CONSTANTS = {\n DEFAULT_PANEL_WIDTH: 400,\n DEFAULT_PANEL_HEIGHT: 600,\n DEFAULT_PANEL_RIGHT_OFFSET: 420,\n DEFAULT_PANEL_TOP_OFFSET: 20,\n MIN_PANEL_WIDTH: 320,\n MIN_PANEL_HEIGHT: 200,\n TOOLTIP_HOVER_DELAY: 500,\n DOCKED_BOTTOM_HEIGHT: 400,\n DOCKED_RIGHT_WIDTH: 500,\n MIN_DOCKED_BOTTOM_HEIGHT: 200,\n MIN_DOCKED_RIGHT_WIDTH: 320,\n MAX_DOCKED_BOTTOM_HEIGHT: 800,\n MAX_DOCKED_RIGHT_WIDTH: 800,\n};\n\nexport interface MonitoringPanelProps {\n /** The MonitorStore instance that provides all metrics, compute, and component tracking data. */\n monitorStore: MonitorStore;\n}\n\nexport const MonitoringPanel: React.FC<MonitoringPanelProps> = ({\n monitorStore,\n}) => {\n const metricsStore = monitorStore.getMetricsStore();\n const computeStore = monitorStore.getComputeStore();\n const fiberCapabilities = useFiberCapabilities();\n const [activeTab, setActiveTab] = useState<\n \"performance\" | \"compute\" | \"intercept\" | \"debugging\"\n >(\"performance\");\n const [position, setPosition] = usePersistedState<PanelPosition>(\n \"osdk-monitor-position\",\n {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: \"floating\",\n }\n );\n\n const [themePreference, setThemePreference] = usePersistedState<\n \"light\" | \"dark\" | \"auto\"\n >(\"osdk-devtools-theme\", \"dark\");\n\n const systemPrefersDark = React.useSyncExternalStore(\n subscribeDarkMode,\n getDarkModeSnapshot\n );\n\n const resolvedTheme = useMemo(\n () =>\n themePreference === \"auto\"\n ? systemPrefersDark\n ? \"dark\"\n : \"light\"\n : themePreference,\n [themePreference, systemPrefersDark]\n );\n\n // Renders inside a shadow root so the bundled Blueprint + devtools CSS can't\n // leak into the page, and the page's CSS can't leak in.\n const [shadowMount] = useState(getDevtoolsShadowMount);\n\n // Callback-ref state so a re-render fires once the panel mounts; overlays\n // portal into it (see PortalProvider below) so the panel-scoped styles apply.\n const [panelEl, setPanelEl] = useState<HTMLDivElement | null>(null);\n const isDragging = useRef(false);\n const isResizing = useRef<string | null>(null);\n const dragStart = useRef({ x: 0, y: 0, elemX: 0, elemY: 0 });\n const resizeStart = useRef({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n elemX: 0,\n elemY: 0,\n });\n\n const setPositionRef = useRef(setPosition);\n setPositionRef.current = setPosition;\n\n const dragAbortRef = useRef<AbortController | null>(null);\n\n const attachDragListeners = useCallback(() => {\n dragAbortRef.current?.abort();\n const controller = new AbortController();\n dragAbortRef.current = controller;\n const { signal } = controller;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) {\n const deltaX = e.clientX - dragStart.current.x;\n const deltaY = e.clientY - dragStart.current.y;\n setPositionRef.current((prev) => ({\n ...prev,\n x: Math.max(\n 0,\n Math.min(\n window.innerWidth - prev.width,\n dragStart.current.elemX + deltaX\n )\n ),\n y: Math.max(\n 0,\n Math.min(\n window.innerHeight - prev.height,\n dragStart.current.elemY + deltaY\n )\n ),\n }));\n } else if (isResizing.current) {\n const deltaX = e.clientX - resizeStart.current.x;\n const deltaY = e.clientY - resizeStart.current.y;\n const handle = isResizing.current;\n\n setPositionRef.current((prev) => {\n if (prev.dockMode === \"docked-bottom\") {\n const newHeight = Math.max(\n UI_CONSTANTS.MIN_DOCKED_BOTTOM_HEIGHT,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_BOTTOM_HEIGHT,\n resizeStart.current.height - deltaY\n )\n );\n return {\n ...prev,\n height: newHeight,\n y: window.innerHeight - newHeight,\n };\n }\n\n if (prev.dockMode === \"docked-right\") {\n const newWidth = Math.max(\n UI_CONSTANTS.MIN_DOCKED_RIGHT_WIDTH,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_RIGHT_WIDTH,\n resizeStart.current.width - deltaX\n )\n );\n return {\n ...prev,\n width: newWidth,\n x: window.innerWidth - newWidth,\n };\n }\n\n let newX = prev.x;\n let newY = prev.y;\n let newWidth = prev.width;\n let newHeight = prev.height;\n\n if (handle.includes(\"right\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width + deltaX\n );\n }\n if (handle.includes(\"left\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width - deltaX\n );\n newX = resizeStart.current.elemX + deltaX;\n if (newWidth === UI_CONSTANTS.MIN_PANEL_WIDTH) {\n newX =\n resizeStart.current.elemX +\n resizeStart.current.width -\n UI_CONSTANTS.MIN_PANEL_WIDTH;\n }\n }\n if (handle.includes(\"bottom\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height + deltaY\n );\n }\n if (handle.includes(\"top\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height - deltaY\n );\n newY = resizeStart.current.elemY + deltaY;\n if (newHeight === UI_CONSTANTS.MIN_PANEL_HEIGHT) {\n newY =\n resizeStart.current.elemY +\n resizeStart.current.height -\n UI_CONSTANTS.MIN_PANEL_HEIGHT;\n }\n }\n\n return {\n ...prev,\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight,\n };\n });\n }\n };\n\n const handleMouseUp = () => {\n isDragging.current = false;\n isResizing.current = null;\n controller.abort();\n dragAbortRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove, { signal });\n document.addEventListener(\"mouseup\", handleMouseUp, { signal });\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest(`.${styles.controls}`)) {\n return;\n }\n if (position.dockMode !== \"floating\") {\n return;\n }\n isDragging.current = true;\n dragStart.current = {\n x: e.clientX,\n y: e.clientY,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleResizeMouseDown = useCallback(\n (e: React.MouseEvent, handle: string) => {\n isResizing.current = handle;\n resizeStart.current = {\n x: e.clientX,\n y: e.clientY,\n width: position.width,\n height: position.height,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n e.stopPropagation();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleDockToggle = useCallback(() => {\n setPosition((prev) => {\n const nextMode =\n prev.dockMode === \"floating\"\n ? \"docked-bottom\"\n : prev.dockMode === \"docked-bottom\"\n ? \"docked-right\"\n : \"floating\";\n\n if (nextMode === \"docked-bottom\") {\n return {\n x: 0,\n y: window.innerHeight - UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n width: window.innerWidth,\n height: UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n } else if (nextMode === \"docked-right\") {\n return {\n x: window.innerWidth - UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n y: 0,\n width: UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n height: window.innerHeight,\n collapsed: false,\n dockMode: nextMode,\n };\n } else {\n return {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n }\n });\n }, [setPosition]);\n\n const windowSize = React.useSyncExternalStore(\n subscribeWindowSize,\n getWindowSizeSnapshot\n );\n\n const effectivePosition = useMemo(() => {\n if (position.dockMode === \"floating\") {\n const maxX = windowSize.width - position.width;\n const maxY = windowSize.height - position.height;\n return {\n ...position,\n x: Math.max(0, Math.min(position.x, maxX)),\n y: Math.max(0, Math.min(position.y, maxY)),\n };\n }\n if (position.dockMode === \"docked-bottom\") {\n return {\n ...position,\n width: windowSize.width,\n y: windowSize.height - position.height,\n };\n }\n if (position.dockMode === \"docked-right\") {\n return {\n ...position,\n height: windowSize.height,\n x: windowSize.width - position.width,\n };\n }\n return position;\n }, [position, windowSize]);\n\n if (position.collapsed) {\n return createPortal(\n <PortalProvider portalContainer={shadowMount}>\n <Tooltip\n content=\"View OSDK Devtools\"\n placement=\"left\"\n hoverOpenDelay={UI_CONSTANTS.TOOLTIP_HOVER_DELAY}\n >\n <div\n className={styles.minimized}\n data-dt-theme={resolvedTheme}\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: false }))\n }\n >\n <span className={styles.minimizedIcon}>&lt;/&gt;</span>\n </div>\n </Tooltip>\n </PortalProvider>,\n shadowMount\n );\n }\n\n const panelClassName = classNames(\n styles.panel,\n resolvedTheme === \"dark\" ? Classes.DARK : undefined,\n {\n [styles.floating]: position.dockMode === \"floating\",\n [styles.dockedBottom]: position.dockMode === \"docked-bottom\",\n [styles.dockedRight]: position.dockMode === \"docked-right\",\n }\n );\n return createPortal(\n <PortalProvider portalContainer={panelEl ?? shadowMount}>\n <div\n ref={setPanelEl}\n className={panelClassName}\n data-dt-theme={resolvedTheme}\n style={{\n left:\n effectivePosition.dockMode === \"docked-bottom\"\n ? 0\n : effectivePosition.x,\n top:\n effectivePosition.dockMode === \"docked-right\"\n ? 0\n : effectivePosition.y,\n width: effectivePosition.width,\n height: effectivePosition.height,\n right: effectivePosition.dockMode === \"docked-right\" ? 0 : undefined,\n bottom:\n effectivePosition.dockMode === \"docked-bottom\" ? 0 : undefined,\n }}\n >\n {(position.dockMode === \"floating\"\n ? [\n { cls: [styles.horizontal, styles.top], handle: \"top\" },\n { cls: [styles.horizontal, styles.bottom], handle: \"bottom\" },\n { cls: [styles.vertical, styles.left], handle: \"left\" },\n { cls: [styles.vertical, styles.right], handle: \"right\" },\n { cls: [styles.corner, styles.topLeft], handle: \"topLeft\" },\n { cls: [styles.corner, styles.topRight], handle: \"topRight\" },\n {\n cls: [styles.corner, styles.bottomLeft],\n handle: \"bottomLeft\",\n },\n {\n cls: [styles.corner, styles.bottomRight],\n handle: \"bottomRight\",\n },\n ]\n : position.dockMode === \"docked-bottom\"\n ? [{ cls: [styles.horizontal, styles.top], handle: \"top\" }]\n : position.dockMode === \"docked-right\"\n ? [{ cls: [styles.vertical, styles.left], handle: \"left\" }]\n : []\n ).map(({ cls, handle }) => (\n <div\n key={handle}\n className={classNames(styles.resizeHandle, ...cls)}\n onMouseDown={(e) => handleResizeMouseDown(e, handle)}\n />\n ))}\n\n <div className={styles.header} onMouseDown={handleMouseDown}>\n <h3 className={styles.title}>\n OSDK Devtools\n <span className={styles.badge}>Beta</span>\n </h3>\n <div className={styles.controls}>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n themePreference === \"dark\"\n ? \"moon\"\n : themePreference === \"light\"\n ? \"flash\"\n : \"automatic-updates\"\n }\n onClick={() =>\n setThemePreference(\n themePreference === \"dark\"\n ? \"light\"\n : themePreference === \"light\"\n ? \"auto\"\n : \"dark\"\n )\n }\n title={`Theme: ${themePreference} (click to cycle)`}\n aria-label={`Theme: ${themePreference}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n position.dockMode === \"floating\"\n ? \"widget\"\n : position.dockMode === \"docked-bottom\"\n ? \"layout-sorted-clusters\"\n : \"layout-hierarchy\"\n }\n onClick={handleDockToggle}\n title={`Dock mode: ${position.dockMode} (click to cycle)`}\n aria-label={`Dock mode: ${position.dockMode}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"reset\"\n onClick={() => metricsStore.reset()}\n title=\"Reset metrics\"\n aria-label=\"Reset metrics\"\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"minimize\"\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: true }))\n }\n title=\"Minimize\"\n aria-label=\"Minimize devtools panel\"\n />\n </div>\n </div>\n\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Devtools tabs\">\n {([\"performance\", \"compute\", \"intercept\", \"debugging\"] as const).map(\n (tab) => (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === tab}\n className={classNames(\n styles.tabButton,\n activeTab === tab && styles.tabButtonActive\n )}\n onClick={() => setActiveTab(tab)}\n >\n {tab.charAt(0).toUpperCase() + tab.slice(1)}\n </button>\n )\n )}\n </div>\n\n <div className={styles.content}>\n {(!fiberCapabilities.hookInstalled ||\n !fiberCapabilities.fiberAccessWorking) && (\n <DegradationNotice onRetry={() => validateFiberAccess()} />\n )}\n\n <div\n className={\n activeTab === \"performance\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <PerformanceTab\n metricsStore={metricsStore}\n monitorStore={monitorStore}\n />\n </div>\n <div\n className={\n activeTab === \"compute\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <ComputeTab computeStore={computeStore} />\n </div>\n <div\n className={\n activeTab === \"intercept\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <InterceptTab monitorStore={monitorStore} theme={resolvedTheme} />\n </div>\n <div\n className={\n activeTab === \"debugging\"\n ? styles.tabContentVisible\n : styles.tabContentHidden\n }\n >\n <DebuggingTab monitorStore={monitorStore} />\n </div>\n </div>\n </div>\n </PortalProvider>,\n shadowMount\n );\n};\n\nexport const SafeMonitoringPanel: React.FC<MonitoringPanelProps> = (props) => (\n <MonitorErrorBoundary>\n <MonitoringPanel {...props} />\n </MonitorErrorBoundary>\n);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MonitoringPanel.js","names":["Button","Classes","PortalProvider","Tab","Tabs","Tooltip","classNames","React","useCallback","useMemo","useRef","useState","createPortal","DegradationNotice","useFiberCapabilities","validateFiberAccess","usePersistedState","getDevtoolsShadowMount","ComputeTab","DebuggingTab","InterceptTab","MonitorErrorBoundary","PerformanceTab","styles","darkModeMql","window","matchMedia","undefined","subscribeDarkMode","callback","addEventListener","removeEventListener","getDarkModeSnapshot","matches","subscribeWindowSize","windowSizeSnapshot","width","innerWidth","height","innerHeight","getWindowSizeSnapshot","current","UI_CONSTANTS","DEFAULT_PANEL_WIDTH","DEFAULT_PANEL_HEIGHT","DEFAULT_PANEL_RIGHT_OFFSET","DEFAULT_PANEL_TOP_OFFSET","MIN_PANEL_WIDTH","MIN_PANEL_HEIGHT","TOOLTIP_HOVER_DELAY","DOCKED_BOTTOM_HEIGHT","DOCKED_RIGHT_WIDTH","MIN_DOCKED_BOTTOM_HEIGHT","MIN_DOCKED_RIGHT_WIDTH","MAX_DOCKED_BOTTOM_HEIGHT","MAX_DOCKED_RIGHT_WIDTH","DEVTOOLS_TAB_IDS","MonitoringPanel","monitorStore","metricsStore","getMetricsStore","computeStore","getComputeStore","fiberCapabilities","activeTab","setActiveTab","onActiveTabChange","newTabId","isDevtoolsTabId","position","setPosition","x","y","collapsed","dockMode","themePreference","setThemePreference","systemPrefersDark","useSyncExternalStore","resolvedTheme","shadowMount","panelEl","setPanelEl","isDragging","isResizing","dragStart","elemX","elemY","resizeStart","setPositionRef","dragAbortRef","attachDragListeners","abort","controller","AbortController","signal","document","e","deltaX","clientX","deltaY","clientY","prev","Math","max","min","handle","newHeight","newWidth","newX","newY","includes","handleMouseDown","target","closest","controls","preventDefault","handleResizeMouseDown","stopPropagation","handleDockToggle","nextMode","windowSize","effectivePosition","maxX","maxY","createElement","portalContainer","content","placement","hoverOpenDelay","className","minimized","onClick","minimizedIcon","panelClassName","panel","FOCUS_DISABLED","DARK","floating","dockedBottom","dockedRight","ref","style","left","top","right","bottom","cls","horizontal","vertical","corner","topLeft","topRight","bottomLeft","bottomRight","map","key","resizeHandle","onMouseDown","header","title","badge","variant","size","icon","reset","hookInstalled","fiberAccessWorking","notice","onRetry","tabs","selectedTabId","onChange","id","tabPanel","theme","SafeMonitoringPanel","props","some","tabId"],"sources":["MonitoringPanel.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { TabId } from \"@blueprintjs/core\";\nimport {\n Button,\n Classes,\n PortalProvider,\n Tab,\n Tabs,\n Tooltip,\n} from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n DegradationNotice,\n useFiberCapabilities,\n} from \"../fiber/DegradationNotice.js\";\nimport { validateFiberAccess } from \"../fiber/validation.js\";\nimport { usePersistedState } from \"../hooks/usePersistedState.js\";\nimport { getDevtoolsShadowMount } from \"../shadow/ShadowHost.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\nimport type { PanelPosition } from \"../types/index.js\";\nimport { ComputeTab } from \"./ComputeTab.js\";\nimport { DebuggingTab } from \"./DebuggingTab.js\";\nimport { InterceptTab } from \"./InterceptTab.js\";\nimport { MonitorErrorBoundary } from \"./MonitorErrorBoundary.js\";\nimport { PerformanceTab } from \"./PerformanceTab.js\";\n\nimport styles from \"./MonitoringPanel.module.scss\";\n\nconst darkModeMql =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : undefined;\n\nfunction subscribeDarkMode(callback: () => void): () => void {\n if (darkModeMql) {\n darkModeMql.addEventListener(\"change\", callback);\n return () => darkModeMql.removeEventListener(\"change\", callback);\n }\n return () => {};\n}\n\nfunction getDarkModeSnapshot(): boolean {\n return darkModeMql ? darkModeMql.matches : true;\n}\n\nfunction subscribeWindowSize(callback: () => void): () => void {\n window.addEventListener(\"resize\", callback);\n return () => window.removeEventListener(\"resize\", callback);\n}\n\nlet windowSizeSnapshot =\n typeof window !== \"undefined\"\n ? { width: window.innerWidth, height: window.innerHeight }\n : { width: 0, height: 0 };\n\nfunction getWindowSizeSnapshot(): { width: number; height: number } {\n const current = { width: window.innerWidth, height: window.innerHeight };\n if (\n current.width !== windowSizeSnapshot.width ||\n current.height !== windowSizeSnapshot.height\n ) {\n windowSizeSnapshot = current;\n }\n return windowSizeSnapshot;\n}\n\nconst UI_CONSTANTS = {\n DEFAULT_PANEL_WIDTH: 400,\n DEFAULT_PANEL_HEIGHT: 600,\n DEFAULT_PANEL_RIGHT_OFFSET: 420,\n DEFAULT_PANEL_TOP_OFFSET: 20,\n MIN_PANEL_WIDTH: 320,\n MIN_PANEL_HEIGHT: 200,\n TOOLTIP_HOVER_DELAY: 500,\n DOCKED_BOTTOM_HEIGHT: 400,\n DOCKED_RIGHT_WIDTH: 500,\n MIN_DOCKED_BOTTOM_HEIGHT: 200,\n MIN_DOCKED_RIGHT_WIDTH: 320,\n MAX_DOCKED_BOTTOM_HEIGHT: 800,\n MAX_DOCKED_RIGHT_WIDTH: 800,\n};\n\nconst DEVTOOLS_TAB_IDS = [\n \"performance\",\n \"compute\",\n \"intercept\",\n \"debugging\",\n] as const;\n\ntype DevtoolsTabId = (typeof DEVTOOLS_TAB_IDS)[number];\n\nexport interface MonitoringPanelProps {\n /** The MonitorStore instance that provides all metrics, compute, and component tracking data. */\n monitorStore: MonitorStore;\n}\n\nexport const MonitoringPanel: React.FC<MonitoringPanelProps> = ({\n monitorStore,\n}) => {\n const metricsStore = monitorStore.getMetricsStore();\n const computeStore = monitorStore.getComputeStore();\n const fiberCapabilities = useFiberCapabilities();\n const [activeTab, setActiveTab] = useState<DevtoolsTabId>(\"performance\");\n const onActiveTabChange = useCallback((newTabId: TabId) => {\n if (isDevtoolsTabId(newTabId)) {\n setActiveTab(newTabId);\n }\n }, []);\n const [position, setPosition] = usePersistedState<PanelPosition>(\n `monitor-position`,\n {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: \"floating\",\n }\n );\n\n const [themePreference, setThemePreference] = usePersistedState<\n \"light\" | \"dark\" | \"auto\"\n >(\"devtools-theme\", \"dark\");\n\n const systemPrefersDark = React.useSyncExternalStore(\n subscribeDarkMode,\n getDarkModeSnapshot\n );\n\n const resolvedTheme = useMemo(\n () =>\n themePreference === \"auto\"\n ? systemPrefersDark\n ? \"dark\"\n : \"light\"\n : themePreference,\n [themePreference, systemPrefersDark]\n );\n\n // Renders inside a shadow root so the bundled Blueprint + devtools CSS can't\n // leak into the page, and the page's CSS can't leak in.\n const [shadowMount] = useState(getDevtoolsShadowMount);\n\n // Callback-ref state so a re-render fires once the panel mounts; overlays\n // portal into it (see PortalProvider below) so the panel-scoped styles apply.\n const [panelEl, setPanelEl] = useState<HTMLDivElement | null>(null);\n const isDragging = useRef(false);\n const isResizing = useRef<string | null>(null);\n const dragStart = useRef({ x: 0, y: 0, elemX: 0, elemY: 0 });\n const resizeStart = useRef({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n elemX: 0,\n elemY: 0,\n });\n\n const setPositionRef = useRef(setPosition);\n setPositionRef.current = setPosition;\n\n const dragAbortRef = useRef<AbortController | null>(null);\n\n const attachDragListeners = useCallback(() => {\n dragAbortRef.current?.abort();\n const controller = new AbortController();\n dragAbortRef.current = controller;\n const { signal } = controller;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (isDragging.current) {\n const deltaX = e.clientX - dragStart.current.x;\n const deltaY = e.clientY - dragStart.current.y;\n setPositionRef.current((prev) => ({\n ...prev,\n x: Math.max(\n 0,\n Math.min(\n window.innerWidth - prev.width,\n dragStart.current.elemX + deltaX\n )\n ),\n y: Math.max(\n 0,\n Math.min(\n window.innerHeight - prev.height,\n dragStart.current.elemY + deltaY\n )\n ),\n }));\n } else if (isResizing.current) {\n const deltaX = e.clientX - resizeStart.current.x;\n const deltaY = e.clientY - resizeStart.current.y;\n const handle = isResizing.current;\n\n setPositionRef.current((prev) => {\n if (prev.dockMode === \"docked-bottom\") {\n const newHeight = Math.max(\n UI_CONSTANTS.MIN_DOCKED_BOTTOM_HEIGHT,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_BOTTOM_HEIGHT,\n resizeStart.current.height - deltaY\n )\n );\n return {\n ...prev,\n height: newHeight,\n y: window.innerHeight - newHeight,\n };\n }\n\n if (prev.dockMode === \"docked-right\") {\n const newWidth = Math.max(\n UI_CONSTANTS.MIN_DOCKED_RIGHT_WIDTH,\n Math.min(\n UI_CONSTANTS.MAX_DOCKED_RIGHT_WIDTH,\n resizeStart.current.width - deltaX\n )\n );\n return {\n ...prev,\n width: newWidth,\n x: window.innerWidth - newWidth,\n };\n }\n\n let newX = prev.x;\n let newY = prev.y;\n let newWidth = prev.width;\n let newHeight = prev.height;\n\n if (handle.includes(\"right\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width + deltaX\n );\n }\n if (handle.includes(\"left\")) {\n newWidth = Math.max(\n UI_CONSTANTS.MIN_PANEL_WIDTH,\n resizeStart.current.width - deltaX\n );\n newX = resizeStart.current.elemX + deltaX;\n if (newWidth === UI_CONSTANTS.MIN_PANEL_WIDTH) {\n newX =\n resizeStart.current.elemX +\n resizeStart.current.width -\n UI_CONSTANTS.MIN_PANEL_WIDTH;\n }\n }\n if (handle.includes(\"bottom\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height + deltaY\n );\n }\n if (handle.includes(\"top\")) {\n newHeight = Math.max(\n UI_CONSTANTS.MIN_PANEL_HEIGHT,\n resizeStart.current.height - deltaY\n );\n newY = resizeStart.current.elemY + deltaY;\n if (newHeight === UI_CONSTANTS.MIN_PANEL_HEIGHT) {\n newY =\n resizeStart.current.elemY +\n resizeStart.current.height -\n UI_CONSTANTS.MIN_PANEL_HEIGHT;\n }\n }\n\n return {\n ...prev,\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight,\n };\n });\n }\n };\n\n const handleMouseUp = () => {\n isDragging.current = false;\n isResizing.current = null;\n controller.abort();\n dragAbortRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove, { signal });\n document.addEventListener(\"mouseup\", handleMouseUp, { signal });\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest(`.${styles.controls}`)) {\n return;\n }\n if (position.dockMode !== \"floating\") {\n return;\n }\n isDragging.current = true;\n dragStart.current = {\n x: e.clientX,\n y: e.clientY,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleResizeMouseDown = useCallback(\n (e: React.MouseEvent, handle: string) => {\n isResizing.current = handle;\n resizeStart.current = {\n x: e.clientX,\n y: e.clientY,\n width: position.width,\n height: position.height,\n elemX: position.x,\n elemY: position.y,\n };\n e.preventDefault();\n e.stopPropagation();\n attachDragListeners();\n },\n [position, attachDragListeners]\n );\n\n const handleDockToggle = useCallback(() => {\n setPosition((prev) => {\n const nextMode =\n prev.dockMode === \"floating\"\n ? \"docked-bottom\"\n : prev.dockMode === \"docked-bottom\"\n ? \"docked-right\"\n : \"floating\";\n\n if (nextMode === \"docked-bottom\") {\n return {\n x: 0,\n y: window.innerHeight - UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n width: window.innerWidth,\n height: UI_CONSTANTS.DOCKED_BOTTOM_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n } else if (nextMode === \"docked-right\") {\n return {\n x: window.innerWidth - UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n y: 0,\n width: UI_CONSTANTS.DOCKED_RIGHT_WIDTH,\n height: window.innerHeight,\n collapsed: false,\n dockMode: nextMode,\n };\n } else {\n return {\n x: window.innerWidth - UI_CONSTANTS.DEFAULT_PANEL_RIGHT_OFFSET,\n y: UI_CONSTANTS.DEFAULT_PANEL_TOP_OFFSET,\n width: UI_CONSTANTS.DEFAULT_PANEL_WIDTH,\n height: UI_CONSTANTS.DEFAULT_PANEL_HEIGHT,\n collapsed: false,\n dockMode: nextMode,\n };\n }\n });\n }, [setPosition]);\n\n const windowSize = React.useSyncExternalStore(\n subscribeWindowSize,\n getWindowSizeSnapshot\n );\n\n const effectivePosition = useMemo(() => {\n if (position.dockMode === \"floating\") {\n const maxX = windowSize.width - position.width;\n const maxY = windowSize.height - position.height;\n return {\n ...position,\n x: Math.max(0, Math.min(position.x, maxX)),\n y: Math.max(0, Math.min(position.y, maxY)),\n };\n }\n if (position.dockMode === \"docked-bottom\") {\n return {\n ...position,\n width: windowSize.width,\n y: windowSize.height - position.height,\n };\n }\n if (position.dockMode === \"docked-right\") {\n return {\n ...position,\n height: windowSize.height,\n x: windowSize.width - position.width,\n };\n }\n return position;\n }, [position, windowSize]);\n\n if (position.collapsed) {\n return createPortal(\n <PortalProvider portalContainer={shadowMount}>\n <Tooltip\n content=\"View OSDK Devtools\"\n placement=\"left\"\n hoverOpenDelay={UI_CONSTANTS.TOOLTIP_HOVER_DELAY}\n >\n <div\n className={styles.minimized}\n data-dt-theme={resolvedTheme}\n aria-label=\"View OSDK Devtools\"\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: false }))\n }\n >\n <span className={styles.minimizedIcon}>&lt;/&gt;</span>\n </div>\n </Tooltip>\n </PortalProvider>,\n shadowMount\n );\n }\n\n const panelClassName = classNames(\n styles.panel,\n // Class needed to remove the useless outline added on tabs/buttons\n Classes.FOCUS_DISABLED,\n resolvedTheme === \"dark\" ? Classes.DARK : undefined,\n {\n [styles.floating]: position.dockMode === \"floating\",\n [styles.dockedBottom]: position.dockMode === \"docked-bottom\",\n [styles.dockedRight]: position.dockMode === \"docked-right\",\n }\n );\n return createPortal(\n <PortalProvider portalContainer={panelEl ?? shadowMount}>\n <div\n ref={setPanelEl}\n className={panelClassName}\n data-dt-theme={resolvedTheme}\n style={{\n left:\n effectivePosition.dockMode === \"docked-bottom\"\n ? 0\n : effectivePosition.x,\n top:\n effectivePosition.dockMode === \"docked-right\"\n ? 0\n : effectivePosition.y,\n width: effectivePosition.width,\n height: effectivePosition.height,\n right: effectivePosition.dockMode === \"docked-right\" ? 0 : undefined,\n bottom:\n effectivePosition.dockMode === \"docked-bottom\" ? 0 : undefined,\n }}\n >\n {(position.dockMode === \"floating\"\n ? [\n { cls: [styles.horizontal, styles.top], handle: \"top\" },\n { cls: [styles.horizontal, styles.bottom], handle: \"bottom\" },\n { cls: [styles.vertical, styles.left], handle: \"left\" },\n { cls: [styles.vertical, styles.right], handle: \"right\" },\n { cls: [styles.corner, styles.topLeft], handle: \"topLeft\" },\n { cls: [styles.corner, styles.topRight], handle: \"topRight\" },\n {\n cls: [styles.corner, styles.bottomLeft],\n handle: \"bottomLeft\",\n },\n {\n cls: [styles.corner, styles.bottomRight],\n handle: \"bottomRight\",\n },\n ]\n : position.dockMode === \"docked-bottom\"\n ? [{ cls: [styles.horizontal, styles.top], handle: \"top\" }]\n : position.dockMode === \"docked-right\"\n ? [{ cls: [styles.vertical, styles.left], handle: \"left\" }]\n : []\n ).map(({ cls, handle }) => (\n <div\n key={handle}\n className={classNames(styles.resizeHandle, ...cls)}\n onMouseDown={(e) => handleResizeMouseDown(e, handle)}\n />\n ))}\n\n <div className={styles.header} onMouseDown={handleMouseDown}>\n <h3 className={styles.title}>\n OSDK Devtools\n <span className={styles.badge}>Beta</span>\n </h3>\n <div className={styles.controls}>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n themePreference === \"dark\"\n ? \"moon\"\n : themePreference === \"light\"\n ? \"flash\"\n : \"automatic-updates\"\n }\n onClick={() =>\n setThemePreference(\n themePreference === \"dark\"\n ? \"light\"\n : themePreference === \"light\"\n ? \"auto\"\n : \"dark\"\n )\n }\n title={`Theme: ${themePreference} (click to cycle)`}\n aria-label={`Theme: ${themePreference}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={\n position.dockMode === \"floating\"\n ? \"widget\"\n : position.dockMode === \"docked-bottom\"\n ? \"layout-sorted-clusters\"\n : \"layout-hierarchy\"\n }\n onClick={handleDockToggle}\n title={`Dock mode: ${position.dockMode} (click to cycle)`}\n aria-label={`Dock mode: ${position.dockMode}. Click to cycle.`}\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"reset\"\n onClick={() => metricsStore.reset()}\n title=\"Reset metrics\"\n aria-label=\"Reset metrics\"\n />\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon=\"minimize\"\n onClick={() =>\n setPosition((prev) => ({ ...prev, collapsed: true }))\n }\n title=\"Minimize\"\n aria-label=\"Minimize devtools panel\"\n />\n </div>\n </div>\n\n <div className={styles.content}>\n {(!fiberCapabilities.hookInstalled ||\n !fiberCapabilities.fiberAccessWorking) && (\n <DegradationNotice\n className={styles.notice}\n onRetry={() => validateFiberAccess()}\n />\n )}\n\n <Tabs\n className={styles.tabs}\n selectedTabId={activeTab}\n onChange={onActiveTabChange}\n >\n <Tab\n id=\"performance\"\n title=\"Performance\"\n panelClassName={styles.tabPanel}\n panel={\n <PerformanceTab\n metricsStore={metricsStore}\n monitorStore={monitorStore}\n />\n }\n />\n <Tab\n id=\"compute\"\n title=\"Compute\"\n panelClassName={styles.tabPanel}\n panel={<ComputeTab computeStore={computeStore} />}\n />\n <Tab\n id=\"intercept\"\n title=\"Intercept\"\n panelClassName={styles.tabPanel}\n panel={\n <InterceptTab\n monitorStore={monitorStore}\n theme={resolvedTheme}\n />\n }\n />\n <Tab\n id=\"debugging\"\n title=\"Debugging\"\n panelClassName={styles.tabPanel}\n panel={<DebuggingTab monitorStore={monitorStore} />}\n />\n </Tabs>\n </div>\n </div>\n </PortalProvider>,\n shadowMount\n );\n};\n\nexport const SafeMonitoringPanel: React.FC<MonitoringPanelProps> = (props) => (\n <MonitorErrorBoundary>\n <MonitoringPanel {...props} />\n </MonitorErrorBoundary>\n);\n\nfunction isDevtoolsTabId(id: string | number): id is DevtoolsTabId {\n return DEVTOOLS_TAB_IDS.some((tabId) => tabId === id);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -23,11 +23,9 @@ const styles = {
23
23
  "controls": "MonitoringPanel-module__controls___0x-Xb00n",
24
24
  "iconButton": "MonitoringPanel-module__iconButton___Ofs4kVaT",
25
25
  "content": "MonitoringPanel-module__content___ZVPMCH4O",
26
+ "notice": "MonitoringPanel-module__notice___W3C3JBnI",
26
27
  "tabs": "MonitoringPanel-module__tabs___bqn6HDbz",
27
- "tabButton": "MonitoringPanel-module__tabButton___cjPGg0FS",
28
- "tabButtonActive": "MonitoringPanel-module__tabButtonActive___gEhlfE4y",
29
- "tabContentVisible": "MonitoringPanel-module__tabContentVisible___llXLpVeb",
30
- "tabContentHidden": "MonitoringPanel-module__tabContentHidden___Hm4ckAQm",
28
+ "tabPanel": "MonitoringPanel-module__tabPanel___fRtsspWk",
31
29
  "metricsGrid": "MonitoringPanel-module__metricsGrid___Ui5kYWKE",
32
30
  "computeMetricsGrid": "MonitoringPanel-module__computeMetricsGrid___7yTv8eKM",
33
31
  "metricCell": "MonitoringPanel-module__metricCell___5zQ-5e-x",
@@ -54,7 +54,8 @@ function getCapabilitiesSnapshot() {
54
54
  }
55
55
  export const DegradationNotice = ({
56
56
  onRetry,
57
- showWhenHealthy = false
57
+ showWhenHealthy = false,
58
+ className
58
59
  }) => {
59
60
  const capabilities = React.useSyncExternalStore(subscribeToCapabilities, getCapabilitiesSnapshot, getCapabilitiesSnapshot);
60
61
  const disabledFeatures = [...capabilities.disabledFeatures];
@@ -64,6 +65,7 @@ export const DegradationNotice = ({
64
65
  }
65
66
  if (!hasIssues && showWhenHealthy) {
66
67
  return /*#__PURE__*/React.createElement(Callout, {
68
+ className: className,
67
69
  intent: Intent.SUCCESS,
68
70
  icon: "tick-circle",
69
71
  title: "Fiber Access Healthy",
@@ -78,6 +80,7 @@ export const DegradationNotice = ({
78
80
  }
79
81
  if (!capabilities.hookInstalled) {
80
82
  return /*#__PURE__*/React.createElement(Callout, {
83
+ className: className,
81
84
  intent: Intent.WARNING,
82
85
  icon: "warning-sign",
83
86
  title: "DevTools Hook Not Installed",
@@ -98,6 +101,7 @@ export const DegradationNotice = ({
98
101
  }
99
102
  if (!capabilities.rendererDetected) {
100
103
  return /*#__PURE__*/React.createElement(Callout, {
104
+ className: className,
101
105
  intent: Intent.PRIMARY,
102
106
  icon: "time",
103
107
  title: "Waiting for React",
@@ -120,6 +124,7 @@ export const DegradationNotice = ({
120
124
  }
121
125
  if (!capabilities.fiberAccessWorking) {
122
126
  return /*#__PURE__*/React.createElement(Callout, {
127
+ className: className,
123
128
  intent: Intent.DANGER,
124
129
  icon: "error",
125
130
  title: "Fiber Access Unavailable",
@@ -143,6 +148,7 @@ export const DegradationNotice = ({
143
148
  }, "Retry"));
144
149
  }
145
150
  return /*#__PURE__*/React.createElement(Callout, {
151
+ className: className,
146
152
  intent: Intent.WARNING,
147
153
  icon: "warning-sign",
148
154
  title: "Some Features Disabled",
@@ -1 +1 @@
1
- {"version":3,"file":"DegradationNotice.js","names":["Button","Callout","Intent","Tag","React","getCapabilitiesManager","onReactDetected","validateFiberAccess","FEATURE_LABELS","FEATURE_DESCRIPTIONS","subscribeToCapabilities","onStoreChange","manager","unsubscribe","onCapabilitiesChange","unsubscribeReactDetected","getCapabilitiesSnapshot","getCapabilities","DegradationNotice","onRetry","showWhenHealthy","capabilities","useSyncExternalStore","disabledFeatures","hasIssues","fiberAccessWorking","length","createElement","intent","SUCCESS","icon","title","style","margin","detectedReactVersion","Fragment","hookInstalled","WARNING","fontSize","color","rendererDetected","PRIMARY","size","variant","onClick","marginTop","DANGER","display","flexWrap","gap","marginBottom","map","feature","key","minimal","errorCount","resetAll","subscribeToCapabilitiesSimple","useFiberCapabilities"],"sources":["DegradationNotice.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, Callout, Intent, Tag } from \"@blueprintjs/core\";\nimport React from \"react\";\n\nimport {\n type FiberCapabilities,\n type FiberFeature,\n getCapabilitiesManager,\n} from \"./capabilities.js\";\nimport { onReactDetected } from \"./DevtoolsHook.js\";\nimport { validateFiberAccess } from \"./validation.js\";\n\nconst FEATURE_LABELS: Record<FiberFeature, string> = {\n \"component-inspection\": \"Component Inspection\",\n \"hook-discovery\": \"Hook Discovery\",\n \"render-tracking\": \"Render Tracking\",\n \"state-inspection\": \"State Inspection\",\n \"metadata-extraction\": \"Metadata Extraction\",\n \"fiber-discovery\": \"Fiber Discovery\",\n};\n\nconst FEATURE_DESCRIPTIONS: Record<FiberFeature, string> = {\n \"component-inspection\": \"View component hierarchy and props\",\n \"hook-discovery\": \"Detect OSDK hooks in components\",\n \"render-tracking\": \"Track component re-renders\",\n \"state-inspection\": \"Inspect component state and hooks\",\n \"metadata-extraction\": \"Extract OSDK hook metadata from fibers\",\n \"fiber-discovery\": \"Discover OSDK components from fiber tree\",\n};\n\nexport interface DegradationNoticeProps {\n onRetry?: () => void;\n showWhenHealthy?: boolean;\n}\n\nfunction subscribeToCapabilities(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n\n validateFiberAccess();\n\n const unsubscribe = manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n\n const unsubscribeReactDetected = onReactDetected(() => {\n validateFiberAccess();\n });\n\n return () => {\n unsubscribe();\n unsubscribeReactDetected();\n };\n}\n\nfunction getCapabilitiesSnapshot(): FiberCapabilities {\n return getCapabilitiesManager().getCapabilities();\n}\n\nexport const DegradationNotice: React.FC<DegradationNoticeProps> = ({\n onRetry,\n showWhenHealthy = false,\n}) => {\n const capabilities = React.useSyncExternalStore(\n subscribeToCapabilities,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n\n const disabledFeatures = [...capabilities.disabledFeatures];\n const hasIssues =\n !capabilities.fiberAccessWorking || disabledFeatures.length > 0;\n\n if (!hasIssues && !showWhenHealthy) {\n return null;\n }\n\n if (!hasIssues && showWhenHealthy) {\n return (\n <Callout\n intent={Intent.SUCCESS}\n icon=\"tick-circle\"\n title=\"Fiber Access Healthy\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n All fiber features are working correctly.\n {capabilities.detectedReactVersion && (\n <>React {capabilities.detectedReactVersion} detected.</>\n )}\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.hookInstalled) {\n return (\n <Callout\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"DevTools Hook Not Installed\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The React DevTools hook was not installed before React loaded. Some\n features may be unavailable.\n </p>\n <p style={{ margin: 0, fontSize: \"12px\", color: \"#5c7080\" }}>\n Ensure the devtools are imported before React in your entry point.\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.rendererDetected) {\n return (\n <Callout\n intent={Intent.PRIMARY}\n icon=\"time\"\n title=\"Waiting for React\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n No React renderer detected yet. React may still be loading.\n </p>\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.PRIMARY}\n onClick={onRetry}\n style={{ marginTop: \"8px\" }}\n >\n Check Again\n </Button>\n )}\n </Callout>\n );\n }\n\n if (!capabilities.fiberAccessWorking) {\n return (\n <Callout\n intent={Intent.DANGER}\n icon=\"error\"\n title=\"Fiber Access Unavailable\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n Unable to access React&apos;s internal fiber tree. Component\n inspection and related features are disabled.\n </p>\n {capabilities.detectedReactVersion && (\n <p\n style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}\n >\n React {capabilities.detectedReactVersion} detected\n </p>\n )}\n {onRetry && (\n <Button size=\"small\" intent={Intent.PRIMARY} onClick={onRetry}>\n Retry\n </Button>\n )}\n </Callout>\n );\n }\n\n return (\n <Callout\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"Some Features Disabled\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The following features have been temporarily disabled due to errors:\n </p>\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"4px\",\n marginBottom: \"8px\",\n }}\n >\n {disabledFeatures.map((feature) => (\n <Tag\n key={feature}\n intent={Intent.WARNING}\n minimal\n title={FEATURE_DESCRIPTIONS[feature]}\n >\n {FEATURE_LABELS[feature]}\n </Tag>\n ))}\n </div>\n {capabilities.errorCount > 0 && (\n <p style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}>\n {capabilities.errorCount} error\n {capabilities.errorCount > 1 ? \"s\" : \"\"} recorded. Features will\n auto-recover after 30 seconds of successful operation.\n </p>\n )}\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.WARNING}\n onClick={() => {\n getCapabilitiesManager().resetAll();\n onRetry();\n }}\n >\n Reset &amp; Retry\n </Button>\n )}\n </Callout>\n );\n};\n\nfunction subscribeToCapabilitiesSimple(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n return manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n}\n\nexport function useFiberCapabilities(): FiberCapabilities {\n return React.useSyncExternalStore(\n subscribeToCapabilitiesSimple,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DegradationNotice.js","names":["Button","Callout","Intent","Tag","React","getCapabilitiesManager","onReactDetected","validateFiberAccess","FEATURE_LABELS","FEATURE_DESCRIPTIONS","subscribeToCapabilities","onStoreChange","manager","unsubscribe","onCapabilitiesChange","unsubscribeReactDetected","getCapabilitiesSnapshot","getCapabilities","DegradationNotice","onRetry","showWhenHealthy","className","capabilities","useSyncExternalStore","disabledFeatures","hasIssues","fiberAccessWorking","length","createElement","intent","SUCCESS","icon","title","style","margin","detectedReactVersion","Fragment","hookInstalled","WARNING","fontSize","color","rendererDetected","PRIMARY","size","variant","onClick","marginTop","DANGER","display","flexWrap","gap","marginBottom","map","feature","key","minimal","errorCount","resetAll","subscribeToCapabilitiesSimple","useFiberCapabilities"],"sources":["DegradationNotice.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, Callout, Intent, Tag } from \"@blueprintjs/core\";\nimport React from \"react\";\n\nimport {\n type FiberCapabilities,\n type FiberFeature,\n getCapabilitiesManager,\n} from \"./capabilities.js\";\nimport { onReactDetected } from \"./DevtoolsHook.js\";\nimport { validateFiberAccess } from \"./validation.js\";\n\nconst FEATURE_LABELS: Record<FiberFeature, string> = {\n \"component-inspection\": \"Component Inspection\",\n \"hook-discovery\": \"Hook Discovery\",\n \"render-tracking\": \"Render Tracking\",\n \"state-inspection\": \"State Inspection\",\n \"metadata-extraction\": \"Metadata Extraction\",\n \"fiber-discovery\": \"Fiber Discovery\",\n};\n\nconst FEATURE_DESCRIPTIONS: Record<FiberFeature, string> = {\n \"component-inspection\": \"View component hierarchy and props\",\n \"hook-discovery\": \"Detect OSDK hooks in components\",\n \"render-tracking\": \"Track component re-renders\",\n \"state-inspection\": \"Inspect component state and hooks\",\n \"metadata-extraction\": \"Extract OSDK hook metadata from fibers\",\n \"fiber-discovery\": \"Discover OSDK components from fiber tree\",\n};\n\nexport interface DegradationNoticeProps {\n onRetry?: () => void;\n showWhenHealthy?: boolean;\n className?: string;\n}\n\nfunction subscribeToCapabilities(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n\n validateFiberAccess();\n\n const unsubscribe = manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n\n const unsubscribeReactDetected = onReactDetected(() => {\n validateFiberAccess();\n });\n\n return () => {\n unsubscribe();\n unsubscribeReactDetected();\n };\n}\n\nfunction getCapabilitiesSnapshot(): FiberCapabilities {\n return getCapabilitiesManager().getCapabilities();\n}\n\nexport const DegradationNotice: React.FC<DegradationNoticeProps> = ({\n onRetry,\n showWhenHealthy = false,\n className,\n}) => {\n const capabilities = React.useSyncExternalStore(\n subscribeToCapabilities,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n\n const disabledFeatures = [...capabilities.disabledFeatures];\n const hasIssues =\n !capabilities.fiberAccessWorking || disabledFeatures.length > 0;\n\n if (!hasIssues && !showWhenHealthy) {\n return null;\n }\n\n if (!hasIssues && showWhenHealthy) {\n return (\n <Callout\n className={className}\n intent={Intent.SUCCESS}\n icon=\"tick-circle\"\n title=\"Fiber Access Healthy\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n All fiber features are working correctly.\n {capabilities.detectedReactVersion && (\n <>React {capabilities.detectedReactVersion} detected.</>\n )}\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.hookInstalled) {\n return (\n <Callout\n className={className}\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"DevTools Hook Not Installed\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The React DevTools hook was not installed before React loaded. Some\n features may be unavailable.\n </p>\n <p style={{ margin: 0, fontSize: \"12px\", color: \"#5c7080\" }}>\n Ensure the devtools are imported before React in your entry point.\n </p>\n </Callout>\n );\n }\n\n if (!capabilities.rendererDetected) {\n return (\n <Callout\n className={className}\n intent={Intent.PRIMARY}\n icon=\"time\"\n title=\"Waiting for React\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: 0 }}>\n No React renderer detected yet. React may still be loading.\n </p>\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.PRIMARY}\n onClick={onRetry}\n style={{ marginTop: \"8px\" }}\n >\n Check Again\n </Button>\n )}\n </Callout>\n );\n }\n\n if (!capabilities.fiberAccessWorking) {\n return (\n <Callout\n className={className}\n intent={Intent.DANGER}\n icon=\"error\"\n title=\"Fiber Access Unavailable\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n Unable to access React&apos;s internal fiber tree. Component\n inspection and related features are disabled.\n </p>\n {capabilities.detectedReactVersion && (\n <p\n style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}\n >\n React {capabilities.detectedReactVersion} detected\n </p>\n )}\n {onRetry && (\n <Button size=\"small\" intent={Intent.PRIMARY} onClick={onRetry}>\n Retry\n </Button>\n )}\n </Callout>\n );\n }\n\n return (\n <Callout\n className={className}\n intent={Intent.WARNING}\n icon=\"warning-sign\"\n title=\"Some Features Disabled\"\n style={{ margin: \"8px\" }}\n >\n <p style={{ margin: \"0 0 8px 0\" }}>\n The following features have been temporarily disabled due to errors:\n </p>\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"4px\",\n marginBottom: \"8px\",\n }}\n >\n {disabledFeatures.map((feature) => (\n <Tag\n key={feature}\n intent={Intent.WARNING}\n minimal={true}\n title={FEATURE_DESCRIPTIONS[feature]}\n >\n {FEATURE_LABELS[feature]}\n </Tag>\n ))}\n </div>\n {capabilities.errorCount > 0 && (\n <p style={{ margin: \"0 0 8px 0\", fontSize: \"12px\", color: \"#5c7080\" }}>\n {capabilities.errorCount} error\n {capabilities.errorCount > 1 ? \"s\" : \"\"} recorded. Features will\n auto-recover after 30 seconds of successful operation.\n </p>\n )}\n {onRetry && (\n <Button\n size=\"small\"\n variant=\"minimal\"\n intent={Intent.WARNING}\n onClick={() => {\n getCapabilitiesManager().resetAll();\n onRetry();\n }}\n >\n Reset &amp; Retry\n </Button>\n )}\n </Callout>\n );\n};\n\nfunction subscribeToCapabilitiesSimple(onStoreChange: () => void): () => void {\n const manager = getCapabilitiesManager();\n return manager.onCapabilitiesChange(() => {\n onStoreChange();\n });\n}\n\nexport function useFiberCapabilities(): FiberCapabilities {\n return React.useSyncExternalStore(\n subscribeToCapabilitiesSimple,\n getCapabilitiesSnapshot,\n getCapabilitiesSnapshot\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { useCallback, useMemo, useSyncExternalStore } from "react";
18
+ import { getClientMetrics } from "../metrics/clientMetrics.js";
19
+ /**
20
+ * Subscribes to the metrics store and returns the full {@link ClientMetrics}
21
+ * set, recomputed whenever any metric changes. It is meant for a single surface
22
+ * that renders these metrics together (the Overview tab), where re-rendering the
23
+ * whole group on any change is expected. If a consumer ever needs one metric in
24
+ * isolation (without re-rendering when unrelated metrics change), add a selector
25
+ * overload here rather than reading a single field off the full result.
26
+ */
27
+ export function useClientMetrics(monitorStore) {
28
+ const store = monitorStore.getMetricsStore();
29
+ const subscribe = useCallback(callback => store.subscribe(callback), [store]);
30
+ const getSnapshot = useCallback(() => store.getSnapshot(), [store]);
31
+ const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
32
+ return useMemo(() => getClientMetrics(snapshot), [snapshot]);
33
+ }
34
+ //# sourceMappingURL=useClientMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientMetrics.js","names":["useCallback","useMemo","useSyncExternalStore","getClientMetrics","useClientMetrics","monitorStore","store","getMetricsStore","subscribe","callback","getSnapshot","snapshot"],"sources":["useClientMetrics.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\n\nimport type { ClientMetrics } from \"../metrics/clientMetrics.js\";\nimport { getClientMetrics } from \"../metrics/clientMetrics.js\";\nimport type { MonitorStore } from \"../store/MonitorStore.js\";\n\n/**\n * Subscribes to the metrics store and returns the full {@link ClientMetrics}\n * set, recomputed whenever any metric changes. It is meant for a single surface\n * that renders these metrics together (the Overview tab), where re-rendering the\n * whole group on any change is expected. If a consumer ever needs one metric in\n * isolation (without re-rendering when unrelated metrics change), add a selector\n * overload here rather than reading a single field off the full result.\n */\nexport function useClientMetrics(monitorStore: MonitorStore): ClientMetrics {\n const store = monitorStore.getMetricsStore();\n const subscribe = useCallback(\n (callback: () => void) => store.subscribe(callback),\n [store]\n );\n const getSnapshot = useCallback(() => store.getSnapshot(), [store]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return useMemo(() => getClientMetrics(snapshot), [snapshot]);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,OAAO,EAAEC,oBAAoB,QAAQ,OAAO;AAGlE,SAASC,gBAAgB,QAAQ,6BAA6B;AAG9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,YAA0B,EAAiB;EAC1E,MAAMC,KAAK,GAAGD,YAAY,CAACE,eAAe,CAAC,CAAC;EAC5C,MAAMC,SAAS,GAAGR,WAAW,CAC1BS,QAAoB,IAAKH,KAAK,CAACE,SAAS,CAACC,QAAQ,CAAC,EACnD,CAACH,KAAK,CACR,CAAC;EACD,MAAMI,WAAW,GAAGV,WAAW,CAAC,MAAMM,KAAK,CAACI,WAAW,CAAC,CAAC,EAAE,CAACJ,KAAK,CAAC,CAAC;EACnE,MAAMK,QAAQ,GAAGT,oBAAoB,CAACM,SAAS,EAAEE,WAAW,EAAEA,WAAW,CAAC;EAC1E,OAAOT,OAAO,CAAC,MAAME,gBAAgB,CAACQ,QAAQ,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;AAC9D","ignoreList":[]}
@@ -15,6 +15,7 @@
15
15
  */
16
16
 
17
17
  import React from "react";
18
+ const OSDK_DEVTOOLS_KEY_PREFIX = "osdk-";
18
19
  function readFromStorage(key, defaultValue) {
19
20
  if (typeof window === "undefined") {
20
21
  return defaultValue;
@@ -26,8 +27,13 @@ function readFromStorage(key, defaultValue) {
26
27
  return defaultValue;
27
28
  }
28
29
  }
29
- export function usePersistedState(key, defaultValue) {
30
+ export function usePersistedState(
31
+ /**
32
+ * The key will be prefixed with `OSDK_DEVTOOLS_KEY_PREFIX`
33
+ */
34
+ initialKey, defaultValue) {
30
35
  const storeRef = React.useRef(null);
36
+ const key = `${OSDK_DEVTOOLS_KEY_PREFIX}${initialKey}`;
31
37
  if (storeRef.current == null || storeRef.current.key !== key) {
32
38
  storeRef.current = {
33
39
  key,
@@ -86,4 +92,24 @@ export function usePersistedState(key, defaultValue) {
86
92
  }, [key]);
87
93
  return [value, setPersistedValue];
88
94
  }
95
+
96
+ /**
97
+ * Function exported for testing.
98
+ * We don't want tests to use localStorage directly since the storage layer could change
99
+ */
100
+ export function clearPersistedState() {
101
+ if (typeof window === "undefined") {
102
+ return;
103
+ }
104
+ const keysToRemove = [];
105
+ for (let i = 0; i < localStorage.length; i++) {
106
+ const key = localStorage.key(i);
107
+ if (key != null && key.startsWith(OSDK_DEVTOOLS_KEY_PREFIX)) {
108
+ keysToRemove.push(key);
109
+ }
110
+ }
111
+ for (const key of keysToRemove) {
112
+ localStorage.removeItem(key);
113
+ }
114
+ }
89
115
  //# sourceMappingURL=usePersistedState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePersistedState.js","names":["React","readFromStorage","key","defaultValue","window","stored","localStorage","getItem","JSON","parse","usePersistedState","storeRef","useRef","current","value","listeners","Set","subscribe","useCallback","callback","store","add","handleStorageChange","e","newValue","listener","addEventListener","delete","removeEventListener","getSnapshot","useSyncExternalStore","setPersistedValue","resolvedValue","setItem","stringify"],"sources":["usePersistedState.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\n\nfunction readFromStorage<T>(key: string, defaultValue: T): T {\n if (typeof window === \"undefined\") {\n return defaultValue;\n }\n\n try {\n const stored = localStorage.getItem(key);\n return stored ? JSON.parse(stored) : defaultValue;\n } catch {\n return defaultValue;\n }\n}\n\nexport function usePersistedState<T>(\n key: string,\n defaultValue: T\n): [T, (value: T | ((prev: T) => T)) => void] {\n const storeRef = React.useRef<{\n key: string;\n value: T;\n listeners: Set<() => void>;\n } | null>(null);\n\n if (storeRef.current == null || storeRef.current.key !== key) {\n storeRef.current = {\n key,\n value: readFromStorage(key, defaultValue),\n listeners: storeRef.current?.listeners ?? new Set(),\n };\n }\n\n const subscribe = React.useCallback(\n (callback: () => void) => {\n const store = storeRef.current;\n if (store == null) {\n return () => {};\n }\n store.listeners.add(callback);\n\n const handleStorageChange = (e: StorageEvent) => {\n if (e.key === key && e.newValue && store != null) {\n try {\n store.value = JSON.parse(e.newValue);\n for (const listener of store.listeners) {\n listener();\n }\n } catch {}\n }\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n return () => {\n store.listeners.delete(callback);\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"storage\", handleStorageChange);\n }\n };\n },\n [key]\n );\n\n const getSnapshot = React.useCallback((): T => {\n if (storeRef.current == null) {\n return defaultValue;\n }\n return storeRef.current.value;\n }, [defaultValue]);\n\n const value = React.useSyncExternalStore(subscribe, getSnapshot);\n\n const setPersistedValue = React.useCallback(\n (newValue: T | ((prev: T) => T)) => {\n const store = storeRef.current;\n if (store == null) {\n return;\n }\n\n const resolvedValue =\n typeof newValue === \"function\"\n ? (newValue as (prev: T) => T)(store.value)\n : newValue;\n\n store.value = resolvedValue;\n\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(key, JSON.stringify(resolvedValue));\n } catch {}\n }\n\n for (const listener of store.listeners) {\n listener();\n }\n },\n [key]\n );\n\n return [value, setPersistedValue];\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"usePersistedState.js","names":["React","OSDK_DEVTOOLS_KEY_PREFIX","readFromStorage","key","defaultValue","window","stored","localStorage","getItem","JSON","parse","usePersistedState","initialKey","storeRef","useRef","current","value","listeners","Set","subscribe","useCallback","callback","store","add","handleStorageChange","e","newValue","listener","addEventListener","delete","removeEventListener","getSnapshot","useSyncExternalStore","setPersistedValue","resolvedValue","setItem","stringify","clearPersistedState","keysToRemove","i","length","startsWith","push","removeItem"],"sources":["usePersistedState.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from \"react\";\n\nconst OSDK_DEVTOOLS_KEY_PREFIX = \"osdk-\";\n\nfunction readFromStorage<T>(key: string, defaultValue: T): T {\n if (typeof window === \"undefined\") {\n return defaultValue;\n }\n\n try {\n const stored = localStorage.getItem(key);\n return stored ? JSON.parse(stored) : defaultValue;\n } catch {\n return defaultValue;\n }\n}\n\nexport function usePersistedState<T>(\n /**\n * The key will be prefixed with `OSDK_DEVTOOLS_KEY_PREFIX`\n */\n initialKey: string,\n defaultValue: T\n): [T, (value: T | ((prev: T) => T)) => void] {\n const storeRef = React.useRef<{\n key: string;\n value: T;\n listeners: Set<() => void>;\n } | null>(null);\n\n const key = `${OSDK_DEVTOOLS_KEY_PREFIX}${initialKey}`;\n\n if (storeRef.current == null || storeRef.current.key !== key) {\n storeRef.current = {\n key,\n value: readFromStorage(key, defaultValue),\n listeners: storeRef.current?.listeners ?? new Set(),\n };\n }\n\n const subscribe = React.useCallback(\n (callback: () => void) => {\n const store = storeRef.current;\n if (store == null) {\n return () => {};\n }\n store.listeners.add(callback);\n\n const handleStorageChange = (e: StorageEvent) => {\n if (e.key === key && e.newValue && store != null) {\n try {\n store.value = JSON.parse(e.newValue);\n for (const listener of store.listeners) {\n listener();\n }\n } catch {}\n }\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n return () => {\n store.listeners.delete(callback);\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"storage\", handleStorageChange);\n }\n };\n },\n [key]\n );\n\n const getSnapshot = React.useCallback((): T => {\n if (storeRef.current == null) {\n return defaultValue;\n }\n return storeRef.current.value;\n }, [defaultValue]);\n\n const value = React.useSyncExternalStore(subscribe, getSnapshot);\n\n const setPersistedValue = React.useCallback(\n (newValue: T | ((prev: T) => T)) => {\n const store = storeRef.current;\n if (store == null) {\n return;\n }\n\n const resolvedValue =\n typeof newValue === \"function\"\n ? (newValue as (prev: T) => T)(store.value)\n : newValue;\n\n store.value = resolvedValue;\n\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(key, JSON.stringify(resolvedValue));\n } catch {}\n }\n\n for (const listener of store.listeners) {\n listener();\n }\n },\n [key]\n );\n\n return [value, setPersistedValue];\n}\n\n/**\n * Function exported for testing.\n * We don't want tests to use localStorage directly since the storage layer could change\n */\nexport function clearPersistedState(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key != null && key.startsWith(OSDK_DEVTOOLS_KEY_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n localStorage.removeItem(key);\n }\n}\n"],"mappings":"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","ignoreList":[]}