dsh-ide-git 0.19.9 → 0.19.10

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/dsh.plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "dsh-external/dsh-ide-git",
3
- "version": "0.19.9",
3
+ "version": "0.19.10",
4
4
  "main": "./src/index.js",
5
5
  "description": "IDE 级 Git 操作面板:分支树 + 提交图谱 + 变更/暂存/提交 + 提交详情。装了 dsh-better-sidebar 时挂成它的原生 tab(右侧栏 + 底部工作台);没装时直接挂 DSH 原生右侧栏,单独安装即可用。JetBrains 风格 Git 工具窗口 for DeepSeek Harness.",
6
6
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-ide-git",
3
- "version": "0.19.9",
3
+ "version": "0.19.10",
4
4
  "description": "DSH plugin: an IDE-grade Git tool window as a native dsh-better-sidebar tab — branch tree, commit graph, changes, commit details, JetBrains-style actions, in the right sidebar and the bottom panel. | DSH 插件:IDE 级 Git 工具窗口,以 dsh-better-sidebar 原生 Tab 挂载——分支树 / 提交图谱 / 变更与提交详情 / JetBrains 风格操作,右侧栏与底部面板双布局自适应。",
5
5
  "type": "module",
6
6
  "repository": {
package/src/client.js CHANGED
@@ -12075,6 +12075,7 @@ window.__ModuleLoader__.load({
12075
12075
  useMeasureLayoutEffect(() => {
12076
12076
  const node = hostRef.current
12077
12077
  const holder = node === null || typeof node.closest !== 'function' ? null : node.closest('.dig-conversation-seat[data-immersive="1"]')
12078
+ if (gateNestedLoop() === false) return
12078
12079
  setImmersiveSeat(holder !== null)
12079
12080
  })
12080
12081
  const compact = size.width > 0 && size.width < COMPACT_MAX_WIDTH
@@ -12144,14 +12145,40 @@ window.__ModuleLoader__.load({
12144
12145
  apart read as a smooth resize in a low-fps screen recording. Later
12145
12146
  runs still track content arrival; the layout-phase cost is one
12146
12147
  querySelectorAll over the 3-4 panes the post-paint run already paid. */
12148
+ /* ---------- measurement loop fuse (issue #17) ---------- */
12149
+
12150
+ /* Every effect below runs on EVERY render and feeds a state update.
12151
+ In a steady UI the bail-out comparisons stop the chain, but when the
12152
+ realized layout disagrees with the just-measured one — a float pane
12153
+ being created/resized on the desktop client hit exactly this — each
12154
+ render re-measures a DIFFERENT box, the update nests synchronously
12155
+ and React aborts at depth 50 with #185, leaving the pane white
12156
+ behind the host's slot boundary. The gate detects that nesting
12157
+ directly: runs are counted in a 40 ms window and a nested render
12158
+ loop (50 commits inside one task) trips it long before React's
12159
+ limit, while legitimate per-event work (a pointermove drag renders
12160
+ at most twice in 40 ms) never comes close. Skipping a measurement
12161
+ during a pathological burst only freezes the affected number until
12162
+ the next window — degraded ratios for a frame, never a white pane. */
12163
+ const measureGate = useRef({ n: 0, at: 0 })
12164
+ const gateNestedLoop = () => {
12165
+ const slot = measureGate.current
12166
+ const now = Date.now()
12167
+ if (now - slot.at > 40) { slot.at = now; slot.n = 0 }
12168
+ slot.n += 1
12169
+ return slot.n <= 6
12170
+ }
12171
+
12147
12172
  useMeasureLayoutEffect(() => {
12148
12173
  const found = measurePanes()
12174
+ if (gateNestedLoop() === false) return
12149
12175
  setPaneSizes((current) => (samePaneSizes(current, found) ? current : found))
12150
12176
  })
12151
12177
  useEffect(() => {
12152
12178
  const node = hostRef.current
12153
12179
  const holder = node === null || typeof node.closest !== 'function' ? null : node.closest('[data-dockkit-float]')
12154
12180
  const next = holder === null ? null : holder.getAttribute('data-dockkit-float')
12181
+ if (gateNestedLoop() === false) return
12155
12182
  setFloatPaneId((current) => (current === next ? current : next))
12156
12183
  })
12157
12184
  const dock = props.dock === undefined ? null : props.dock