dsh-bridge-gateway 0.1.5 → 0.1.6

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
@@ -2,6 +2,15 @@
2
2
 
3
3
  本项目 `dsh-bridge-gateway` 是基于 [dsh-bridge](https://github.com/wenbin-wb/dsh-bridge) 的移植增强分支,在保留原版能力之外,重点新增「公网直连网关」。
4
4
 
5
+ ## [0.1.6] - 2026-09-12
6
+
7
+ ### 修复(移动端第二批:布局密度与面板)
8
+ - 输入框贴底:收掉 scrollBody 的 16px 底部衬距,只保留 6px 呼吸位 + 安全区,底部统计药丸完整可见。
9
+ - workbuddy-connect 的 Reasoning levels 按钮收成纯图标(26px,结构锚点不依赖语言),不再把左侧按钮挤到上一行;工具栏恢复单行。
10
+ - 对话/轨迹/上下文标签行折叠为标题行下缘的悬浮胶囊(原生 tooltip 灰配色),不再独占一行,中间内容区净增约 33px。
11
+ - 底部面板(better-sidebar panel-host)不再被一刀切隐藏:展开时以底部面板形态显示内容(zsh 会话等),收起时隐藏;收掉展开时原生预留的 220px 空白。展开信号用语言无关的 aria-pressed 锚点(body.dsh-workbench-open 在收起后残留,不可用)。
12
+ - 抽屉化侧边栏顶部对齐到标签条之下(top: 38px),不再与最上面的栏重叠。
13
+
5
14
  ## [0.1.5] - 2026-09-12
6
15
 
7
16
  ### 变更
package/client/client.js CHANGED
@@ -3829,6 +3829,44 @@ function injectMobileStyles() {
3829
3829
  display: none !important;
3830
3830
  }
3831
3831
 
3832
+ /* ---- \u5BF9\u8BDD/\u8F68\u8FF9/\u4E0A\u4E0B\u6587 \u6807\u7B7E\u884C\u6298\u53E0\u8FDB\u6807\u9898\u884C ----
3833
+ \u539F\u672C tabs \u72EC\u5360\u4E00\u884C\uFF0825px + \u95F4\u8DDD\uFF09\uFF0C\u79FB\u52A8\u7AEF\u4E2D\u95F4\u7A7A\u95F4\u592A\u5C0F\u3002
3834
+ \u6539\u4E3A\u7EDD\u5BF9\u5B9A\u4F4D\u7684\u60AC\u6D6E\u80F6\u56CA\uFF1A\u9489\u5728\u6807\u9898\u884C\u4E0B\u7F18\u53F3\u4FA7\uFF0C\u4E0D\u518D\u5360\u636E\u5E03\u5C40\u9AD8\u5EA6\uFF0C
3835
+ \u4E2D\u95F4\u5185\u5BB9\u533A\u51C0\u589E\u7EA6 33px\uFF1B\u80CC\u666F\u7528\u539F\u751F tooltip \u7070\u4E0E\u5185\u5BB9\u5206\u5C42\u3002 */
3836
+ header[class*="wSkVaW_header"] {
3837
+ position: relative !important;
3838
+ }
3839
+ div[class*="wSkVaW_tabs"] {
3840
+ position: absolute !important;
3841
+ top: 38px !important;
3842
+ right: 6px !important;
3843
+ left: auto !important;
3844
+ width: auto !important;
3845
+ max-width: 62vw !important;
3846
+ height: 30px !important;
3847
+ display: inline-flex !important;
3848
+ align-items: center !important;
3849
+ gap: 2px !important;
3850
+ padding: 2px !important;
3851
+ border-radius: 999px !important;
3852
+ background: var(--dsw-alias-tooltip-bg, #43454a) !important;
3853
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.3) !important;
3854
+ overflow-x: auto !important;
3855
+ scrollbar-width: none !important;
3856
+ z-index: 30 !important;
3857
+ }
3858
+ div[class*="wSkVaW_tabs"]::-webkit-scrollbar {
3859
+ display: none !important;
3860
+ }
3861
+ div[class*="wSkVaW_tabs"] [role="tab"] {
3862
+ height: 24px !important;
3863
+ padding: 0 10px !important;
3864
+ border-radius: 999px !important;
3865
+ font-size: 12px !important;
3866
+ white-space: nowrap !important;
3867
+ flex: 0 0 auto !important;
3868
+ }
3869
+
3832
3870
  /* ---- \u9876\u680F\u300C\u6807\u51C6\u6A21\u5F0F\u300D\u4E0E\u300C\u5BF9\u8BDD\u7BA1\u7406\u300D\u91CD\u53E0\u4FEE\u590D ----
3833
3871
  \u5B9E\u6D4B\uFF08390px\uFF09\uFF1A\u6807\u51C6\u6A21\u5F0F(\u5728 titleCluster \u5185) \u53F3\u8FB9\u754C 102\uFF0C
3834
3872
  \u5BF9\u8BDD\u7BA1\u7406(\u5728 headerUtilities \u5185) \u5DE6\u8FB9\u754C 91 \u2192 \u6C34\u5E73\u91CD\u53E0 11px\u3002
@@ -4101,11 +4139,34 @@ function injectMobileStyles() {
4101
4139
  \u5E38\u9A7B\u5C4F\u5E55\u53F3\u4E0B\u89D2\uFF0C\u89C6\u89C9\u4E0A\u5C31\u662F\u90A3\u4E2A"\u5C0F\u65B9\u5757"\u3002
4102
4140
  \u4FEE\u590D\uFF1A\u79FB\u52A8\u7AEF\u9690\u85CF panel-host \u906E\u7F69\u4E0E glass \u6E10\u53D8\u88C5\u9970\u6761\uFF0C\u5E76\u9501\u5B9A\u8F93\u5165\u6846 sticky \u4E8E\u5E95\u90E8\u3002 */
4103
4141
 
4104
- /* \u9690\u85CF better-sidebar \u7684\u5168\u5C4F\u906E\u7F69\uFF08\u907F\u514D\u8986\u76D6\u8F93\u5165\u6846\u5E76\u62E6\u622A\u70B9\u51FB\uFF09 */
4142
+ /* better-sidebar \u9762\u677F\u5BBF\u4E3B\uFF1A\u9ED8\u8BA4\u9690\u85CF\uFF08\u65E7\u7684\u5168\u5C4F fixed \u906E\u7F69\u4F1A\u76D6\u4F4F\u8F93\u5165\u6846\u5E76\u62E6\u622A\u70B9\u51FB\uFF09\uFF1B
4143
+ \u5E95\u90E8\u9762\u677F\u5C55\u5F00\u65F6\uFF08\u5F00\u5173 aria-pressed=true / body.dsh-workbench-open\uFF09\u6539\u4E3A
4144
+ \u5E95\u90E8\u9762\u677F\u5F62\u6001\u663E\u793A\u2014\u2014\u4E0D\u906E\u8F93\u5165\u6846\u3001\u4E0D\u9876\u72B6\u6001\u680F\uFF0C\u5185\u5BB9\uFF08zsh \u4F1A\u8BDD\u7B49\uFF09\u53EF\u89C1\u3002
4145
+ aria-pressed \u4E0E data-active \u90FD\u662F\u8BED\u8A00\u65E0\u5173\u951A\u70B9\uFF0C\u4E2D\u82F1\u6587\u73AF\u5883\u901A\u7528\u3002 */
4105
4146
  div[data-dsh-panel-host],
4106
4147
  div[data-dsh-better-sidebar] {
4107
4148
  display: none !important;
4108
4149
  }
4150
+ body:has(button[data-dsh-bottom-toggle][aria-pressed='true']) div[data-dsh-panel-host],
4151
+ body:has(button[data-dsh-bottom-toggle][aria-pressed='true']) div[data-dsh-better-sidebar] {
4152
+ display: block !important;
4153
+ top: 42px !important;
4154
+ bottom: calc(var(--dsh-composer-height, 171px) + 34px) !important;
4155
+ left: 8px !important;
4156
+ right: 8px !important;
4157
+ width: auto !important;
4158
+ height: auto !important;
4159
+ z-index: 20 !important;
4160
+ border-radius: 12px !important;
4161
+ overflow: auto !important;
4162
+ background: var(--dsw-alias-bg-layer-2, #2c2c2e) !important;
4163
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35) !important;
4164
+ }
4165
+ /* \u5E95\u90E8\u9762\u677F\u5C55\u5F00\u65F6\u539F\u751F\u7ED9\u4E2D\u680F\u9884\u7559\u7684 220px \u5E95\u90E8\u7A7A\u767D\u6536\u6389\uFF0C\u8F93\u5165\u6846\u56DE\u5230\u5C4F\u5E55\u5E95\u3002
4166
+ \u6CE8\u610F body.dsh-workbench-open \u5728\u6536\u8D77\u540E\u4ECD\u6B8B\u7559\uFF0C\u4E0D\u80FD\u5F53\u5C55\u5F00\u4FE1\u53F7\u3002 */
4167
+ body:has(button[data-dsh-bottom-toggle][aria-pressed='true']) div[class*="pI_x6G_centerCol"] {
4168
+ margin-bottom: 0 !important;
4169
+ }
4109
4170
  /* \u9690\u85CF\u4E3B\u9898\u88C5\u9970\u6027\u6E10\u53D8\u6761\uFF08\u53F3\u4E0B\u89D2\u5C0F\u65B9\u5757\uFF09 */
4110
4171
  span[data-dsh-glass-fade] {
4111
4172
  display: none !important;
@@ -4122,12 +4183,39 @@ function injectMobileStyles() {
4122
4183
  display: flex !important;
4123
4184
  align-items: center !important;
4124
4185
  justify-content: space-between !important;
4186
+ flex-wrap: nowrap !important;
4125
4187
  gap: 6px !important;
4126
4188
  width: 100% !important;
4127
4189
  padding: 2px 2px 4px !important;
4128
4190
  box-sizing: border-box !important;
4129
4191
  }
4130
4192
 
4193
+ /* \u8F93\u5165\u6846\u8D34\u5E95\uFF1AscrollBody \u7684 16px \u5E95\u90E8\u886C\u8DDD\u662F\u7A7A\u9699\u6765\u6E90\uFF0C\u6536\u6389\u53EA\u7559\u5B89\u5168\u533A\uFF1B
4194
+ \u518D\u57AB 6px \u8BA9\u7EDF\u8BA1\u836F\u4E38\u5B8C\u6574\u53EF\u89C1 */
4195
+ div[class*="wSkVaW_scrollBody"] {
4196
+ padding-bottom: calc(6px + env(safe-area-inset-bottom, 0px)) !important;
4197
+ }
4198
+ div[class*="wSkVaW_composerStack"] {
4199
+ padding-bottom: env(safe-area-inset-bottom, 0px) !important;
4200
+ }
4201
+
4202
+ /* workbuddy-connect \u7684 Reasoning levels \u6309\u94AE\uFF08uV2eYG_trailing \u91CC\u552F\u4E00\u7684\u65E0 class
4203
+ \u6309\u94AE\uFF0C\u7ED3\u6784\u951A\u70B9 span>button\uFF09\uFF1A\u79FB\u52A8\u7AEF\u6536\u6210\u7EAF\u56FE\u6807\uFF0C\u6587\u5B57\u88AB\u88C1\u6389\uFF0C
4204
+ \u4E0D\u518D\u628A\u5DE6\u4FA7\u6309\u94AE\u6324\u5230\u4E0A\u4E00\u884C */
4205
+ div[class*="uV2eYG_trailing"] span > button:not([class]) {
4206
+ flex: 0 0 26px !important;
4207
+ width: 26px !important;
4208
+ min-width: 26px !important;
4209
+ padding: 0 2px !important;
4210
+ overflow: hidden !important;
4211
+ justify-content: center !important;
4212
+ gap: 0 !important;
4213
+ font-size: 0 !important;
4214
+ }
4215
+ div[class*="uV2eYG_trailing"] span > button:not([class]) svg {
4216
+ flex: 0 0 auto !important;
4217
+ }
4218
+
4131
4219
  div[class*="uV2eYG_tools"] {
4132
4220
  display: flex !important;
4133
4221
  align-items: center !important;
@@ -4210,7 +4298,8 @@ function injectMobileStyles() {
4210
4298
  div[class*="_sidebarCol"] {
4211
4299
  position: fixed !important;
4212
4300
  left: 0 !important;
4213
- top: 0 !important;
4301
+ /* \u9876\u5230\u9876\u90E8\u6807\u7B7E\u6761(38px)\u4E4B\u4E0B\uFF0C\u4E0D\u518D\u4E0E\u6700\u4E0A\u9762\u7684\u680F\u91CD\u53E0 */
4302
+ top: 38px !important;
4214
4303
  bottom: auto !important;
4215
4304
  /* \u4FA7\u8FB9\u680F\u5E95\u90E8\u6EA2\u51FA\u5C4F\u5E55\u4FEE\u590D\uFF1A
4216
4305
  \u5B9E\u6D4B 390x844 \u4E0B\uFF0C\u4FA7\u8FB9\u680F\u5B9E\u9645\u76D2\u5B50\u4E3A T=12 B=882\uFF08\u9AD8\u5EA6 870 > \u89C6\u53E3 844\uFF09\uFF0C\u5E95\u90E8\u6EA2\u51FA 38px\u3002
@@ -4218,8 +4307,8 @@ function injectMobileStyles() {
4218
4307
  \u4E8E\u662F padding(10px+14px) \u4E0E margin(12px) \u88AB\u52A0\u5728 height:100dvh \u4E4B\u5916\u3002
4219
4308
  \u6539\u4E3A border-box \u5E76\u7528 100dvh \u76F4\u63A5\u7EA6\u675F\u9AD8\u5EA6\uFF0Cpadding \u5373\u88AB\u5305\u542B\u5728\u9AD8\u5EA6\u5185\u3002 */
4220
4309
  box-sizing: border-box !important;
4221
- height: 100dvh !important;
4222
- max-height: 100dvh !important;
4310
+ height: calc(100dvh - 38px) !important;
4311
+ max-height: calc(100dvh - 38px) !important;
4223
4312
  margin: 0 !important;
4224
4313
  width: 290px !important;
4225
4314
  max-width: 82vw !important;
package/client/index.js CHANGED
@@ -3426,6 +3426,44 @@ function injectMobileStyles() {
3426
3426
  display: none !important;
3427
3427
  }
3428
3428
 
3429
+ /* ---- 对话/轨迹/上下文 标签行折叠进标题行 ----
3430
+ 原本 tabs 独占一行(25px + 间距),移动端中间空间太小。
3431
+ 改为绝对定位的悬浮胶囊:钉在标题行下缘右侧,不再占据布局高度,
3432
+ 中间内容区净增约 33px;背景用原生 tooltip 灰与内容分层。 */
3433
+ header[class*="wSkVaW_header"] {
3434
+ position: relative !important;
3435
+ }
3436
+ div[class*="wSkVaW_tabs"] {
3437
+ position: absolute !important;
3438
+ top: 38px !important;
3439
+ right: 6px !important;
3440
+ left: auto !important;
3441
+ width: auto !important;
3442
+ max-width: 62vw !important;
3443
+ height: 30px !important;
3444
+ display: inline-flex !important;
3445
+ align-items: center !important;
3446
+ gap: 2px !important;
3447
+ padding: 2px !important;
3448
+ border-radius: 999px !important;
3449
+ background: var(--dsw-alias-tooltip-bg, #43454a) !important;
3450
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.3) !important;
3451
+ overflow-x: auto !important;
3452
+ scrollbar-width: none !important;
3453
+ z-index: 30 !important;
3454
+ }
3455
+ div[class*="wSkVaW_tabs"]::-webkit-scrollbar {
3456
+ display: none !important;
3457
+ }
3458
+ div[class*="wSkVaW_tabs"] [role="tab"] {
3459
+ height: 24px !important;
3460
+ padding: 0 10px !important;
3461
+ border-radius: 999px !important;
3462
+ font-size: 12px !important;
3463
+ white-space: nowrap !important;
3464
+ flex: 0 0 auto !important;
3465
+ }
3466
+
3429
3467
  /* ---- 顶栏「标准模式」与「对话管理」重叠修复 ----
3430
3468
  实测(390px):标准模式(在 titleCluster 内) 右边界 102,
3431
3469
  对话管理(在 headerUtilities 内) 左边界 91 → 水平重叠 11px。
@@ -3698,11 +3736,34 @@ function injectMobileStyles() {
3698
3736
  常驻屏幕右下角,视觉上就是那个"小方块"。
3699
3737
  修复:移动端隐藏 panel-host 遮罩与 glass 渐变装饰条,并锁定输入框 sticky 于底部。 */
3700
3738
 
3701
- /* 隐藏 better-sidebar 的全屏遮罩(避免覆盖输入框并拦截点击) */
3739
+ /* better-sidebar 面板宿主:默认隐藏(旧的全屏 fixed 遮罩会盖住输入框并拦截点击);
3740
+ 底部面板展开时(开关 aria-pressed=true / body.dsh-workbench-open)改为
3741
+ 底部面板形态显示——不遮输入框、不顶状态栏,内容(zsh 会话等)可见。
3742
+ aria-pressed 与 data-active 都是语言无关锚点,中英文环境通用。 */
3702
3743
  div[data-dsh-panel-host],
3703
3744
  div[data-dsh-better-sidebar] {
3704
3745
  display: none !important;
3705
3746
  }
3747
+ body:has(button[data-dsh-bottom-toggle][aria-pressed='true']) div[data-dsh-panel-host],
3748
+ body:has(button[data-dsh-bottom-toggle][aria-pressed='true']) div[data-dsh-better-sidebar] {
3749
+ display: block !important;
3750
+ top: 42px !important;
3751
+ bottom: calc(var(--dsh-composer-height, 171px) + 34px) !important;
3752
+ left: 8px !important;
3753
+ right: 8px !important;
3754
+ width: auto !important;
3755
+ height: auto !important;
3756
+ z-index: 20 !important;
3757
+ border-radius: 12px !important;
3758
+ overflow: auto !important;
3759
+ background: var(--dsw-alias-bg-layer-2, #2c2c2e) !important;
3760
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35) !important;
3761
+ }
3762
+ /* 底部面板展开时原生给中栏预留的 220px 底部空白收掉,输入框回到屏幕底。
3763
+ 注意 body.dsh-workbench-open 在收起后仍残留,不能当展开信号。 */
3764
+ body:has(button[data-dsh-bottom-toggle][aria-pressed='true']) div[class*="pI_x6G_centerCol"] {
3765
+ margin-bottom: 0 !important;
3766
+ }
3706
3767
  /* 隐藏主题装饰性渐变条(右下角小方块) */
3707
3768
  span[data-dsh-glass-fade] {
3708
3769
  display: none !important;
@@ -3719,12 +3780,39 @@ function injectMobileStyles() {
3719
3780
  display: flex !important;
3720
3781
  align-items: center !important;
3721
3782
  justify-content: space-between !important;
3783
+ flex-wrap: nowrap !important;
3722
3784
  gap: 6px !important;
3723
3785
  width: 100% !important;
3724
3786
  padding: 2px 2px 4px !important;
3725
3787
  box-sizing: border-box !important;
3726
3788
  }
3727
3789
 
3790
+ /* 输入框贴底:scrollBody 的 16px 底部衬距是空隙来源,收掉只留安全区;
3791
+ 再垫 6px 让统计药丸完整可见 */
3792
+ div[class*="wSkVaW_scrollBody"] {
3793
+ padding-bottom: calc(6px + env(safe-area-inset-bottom, 0px)) !important;
3794
+ }
3795
+ div[class*="wSkVaW_composerStack"] {
3796
+ padding-bottom: env(safe-area-inset-bottom, 0px) !important;
3797
+ }
3798
+
3799
+ /* workbuddy-connect 的 Reasoning levels 按钮(uV2eYG_trailing 里唯一的无 class
3800
+ 按钮,结构锚点 span>button):移动端收成纯图标,文字被裁掉,
3801
+ 不再把左侧按钮挤到上一行 */
3802
+ div[class*="uV2eYG_trailing"] span > button:not([class]) {
3803
+ flex: 0 0 26px !important;
3804
+ width: 26px !important;
3805
+ min-width: 26px !important;
3806
+ padding: 0 2px !important;
3807
+ overflow: hidden !important;
3808
+ justify-content: center !important;
3809
+ gap: 0 !important;
3810
+ font-size: 0 !important;
3811
+ }
3812
+ div[class*="uV2eYG_trailing"] span > button:not([class]) svg {
3813
+ flex: 0 0 auto !important;
3814
+ }
3815
+
3728
3816
  div[class*="uV2eYG_tools"] {
3729
3817
  display: flex !important;
3730
3818
  align-items: center !important;
@@ -3807,7 +3895,8 @@ function injectMobileStyles() {
3807
3895
  div[class*="_sidebarCol"] {
3808
3896
  position: fixed !important;
3809
3897
  left: 0 !important;
3810
- top: 0 !important;
3898
+ /* 顶到顶部标签条(38px)之下,不再与最上面的栏重叠 */
3899
+ top: 38px !important;
3811
3900
  bottom: auto !important;
3812
3901
  /* 侧边栏底部溢出屏幕修复:
3813
3902
  实测 390x844 下,侧边栏实际盒子为 T=12 B=882(高度 870 > 视口 844),底部溢出 38px。
@@ -3815,8 +3904,8 @@ function injectMobileStyles() {
3815
3904
  于是 padding(10px+14px) 与 margin(12px) 被加在 height:100dvh 之外。
3816
3905
  改为 border-box 并用 100dvh 直接约束高度,padding 即被包含在高度内。 */
3817
3906
  box-sizing: border-box !important;
3818
- height: 100dvh !important;
3819
- max-height: 100dvh !important;
3907
+ height: calc(100dvh - 38px) !important;
3908
+ max-height: calc(100dvh - 38px) !important;
3820
3909
  margin: 0 !important;
3821
3910
  width: 290px !important;
3822
3911
  max-width: 82vw !important;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-bridge-gateway",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "以 dsh-bridge 为根基、融合 remote-gateway 能力的 DSH 远程访问网关:局域网 / Cloudflare 隧道 / 自建隧道之外,新增「公网直连网关」(0.0.0.0 监听 + 自带 HTTPS 自签证书 + 强制登录门禁),解决移动端外网直连操控电脑。",
5
5
  "releaseNotes": "【dsh-bridge-gateway 0.1.5】\n• 🔧 适配 DSH 0.1.5:RPC 通道迁移到 webServer 直注册 + requestRejection 鉴权\n• 📱 移动端深度适配:顶栏防重叠、分支 chip 不再裁切、输入框宽度对齐并 sticky 固定、44px 点击热区、侧边栏焦点陷阱消除\n• 默认不启用,安装后原有局域网/隧道/IM 行为完全不变",
6
6
  "type": "module",