From 238ec43117aa3bdb674a6ba3796c77641a763f13 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Tue, 4 Aug 2026 01:58:01 +0000 Subject: [PATCH 1/2] fix(devtools): prevent StateEditor from freezing the page on live state The State/Payload and App Config editors deep-synced the live reactive state back into itself under a { deep: true } watcher. For any state containing an array (or nested object), each sync produced a fresh identity that re-triggered the watcher, causing an unbounded reactivity loop that froze the whole page whenever those tabs were shown. Snapshot the state into a detached proxy instead of mutating it, and drive updates off the existing revision signal rather than a deep watcher over the (potentially huge) state object. Closes #972 --- .../client/components/StateEditor.vue | 60 ++++++++----------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/packages/devtools/client/components/StateEditor.vue b/packages/devtools/client/components/StateEditor.vue index be37a99730..a2f10512e4 100644 --- a/packages/devtools/client/components/StateEditor.vue +++ b/packages/devtools/client/components/StateEditor.vue @@ -1,8 +1,7 @@ From c0feb3fed04ccdbcbc45d512df8d815dcf4d4852 Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Tue, 4 Aug 2026 03:04:30 +0000 Subject: [PATCH 2/2] refactor(devtools): use structured-clone-es for StateEditor snapshots Replace JSON.parse(JSON.stringify()) with structured-clone-es, which tolerates circular references, preserves richer types (Map/Set/Date), and drops functions/symbols via { lossy: true } instead of throwing. --- packages/devtools/client/components/StateEditor.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/devtools/client/components/StateEditor.vue b/packages/devtools/client/components/StateEditor.vue index a2f10512e4..c0af5ffbe7 100644 --- a/packages/devtools/client/components/StateEditor.vue +++ b/packages/devtools/client/components/StateEditor.vue @@ -1,6 +1,7 @@