dsh-zen-remote 1.1.16 → 2.0.0
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/AGENTS.md +54 -9
- package/README.md +249 -190
- package/README.zh-CN.md +247 -201
- package/assets/home.png +0 -0
- package/assets/info.png +0 -0
- package/assets/pairing.png +0 -0
- package/assets/session.png +0 -0
- package/assets/sheet.png +0 -0
- package/cordis.patch.yml +12 -11
- package/cordis.patch.yml.example +24 -9
- package/docs/interface.md +57 -2
- package/docs/remote-access.en.md +99 -58
- package/docs/remote-access.md +99 -42
- package/dsh-push.mjs +67 -54
- package/lan-gate.mjs +88 -20
- package/lib/activity.js +168 -0
- package/lib/activity.js.map +1 -0
- package/lib/admin-routes.js +526 -0
- package/lib/admin-routes.js.map +1 -0
- package/lib/client-pairing.js +224 -0
- package/lib/client-pairing.js.map +1 -0
- package/lib/client-routes.js +674 -0
- package/lib/client-routes.js.map +1 -0
- package/lib/client.js +10051 -4777
- package/lib/config.js +346 -0
- package/lib/config.js.map +1 -0
- package/lib/fetch-route-intercept.js +418 -0
- package/lib/fetch-route-intercept.js.map +1 -0
- package/lib/fingerprint.js +363 -0
- package/lib/fingerprint.js.map +1 -0
- package/lib/http.js +69 -0
- package/lib/http.js.map +1 -0
- package/lib/index.js +675 -54
- package/lib/index.js.map +1 -1
- package/lib/intercept-shape.js +81 -0
- package/lib/intercept-shape.js.map +1 -0
- package/lib/intercept.js +3040 -0
- package/lib/intercept.js.map +1 -0
- package/lib/lan-gate-server.cjs +532 -121
- package/lib/merge-streams.js +1165 -0
- package/lib/merge-streams.js.map +1 -0
- package/lib/relay-access.js +496 -0
- package/lib/relay-access.js.map +1 -0
- package/lib/relay-client.js +1303 -0
- package/lib/relay-client.js.map +1 -0
- package/lib/relay-filter.js +282 -0
- package/lib/relay-filter.js.map +1 -0
- package/lib/relay-server.js +1792 -0
- package/lib/relay-server.js.map +1 -0
- package/lib/restart-fields.js +34 -0
- package/lib/restart-fields.js.map +1 -0
- package/lib/restart-watcher.js +106 -0
- package/lib/restart-watcher.js.map +1 -0
- package/lib/session-reference.js +157 -0
- package/lib/session-reference.js.map +1 -0
- package/lib/share-export.js +16 -1
- package/lib/share-export.js.map +1 -1
- package/lib/share-ops.js +86 -0
- package/lib/share-ops.js.map +1 -0
- package/lib/share-store.js +294 -0
- package/lib/share-store.js.map +1 -0
- package/lib/types/activity.d.ts +99 -0
- package/lib/types/activity.d.ts.map +1 -0
- package/lib/types/admin-routes.d.ts +129 -0
- package/lib/types/admin-routes.d.ts.map +1 -0
- package/lib/types/client/MobileDrawerFooter.d.ts.map +1 -1
- package/lib/types/client/MobileHome.d.ts +1 -1
- package/lib/types/client/MobileHome.d.ts.map +1 -1
- package/lib/types/client/MobileHomeChips.d.ts +1 -1
- package/lib/types/client/MobileHomeChips.d.ts.map +1 -1
- package/lib/types/client/MobileSessionHeader.d.ts +13 -2
- package/lib/types/client/MobileSessionHeader.d.ts.map +1 -1
- package/lib/types/client/MobileSessionInfo.d.ts +20 -3
- package/lib/types/client/MobileSessionInfo.d.ts.map +1 -1
- package/lib/types/client/RemoteComposerBanner.d.ts +42 -0
- package/lib/types/client/RemoteComposerBanner.d.ts.map +1 -0
- package/lib/types/client/RemoteHeaderIcon.d.ts +37 -0
- package/lib/types/client/RemoteHeaderIcon.d.ts.map +1 -0
- package/lib/types/client/RemoteShareMenu.d.ts +28 -0
- package/lib/types/client/RemoteShareMenu.d.ts.map +1 -0
- package/lib/types/client/RemoteStatusIcon.d.ts +36 -0
- package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -0
- package/lib/types/client/compat/desktop.d.ts +21 -0
- package/lib/types/client/compat/desktop.d.ts.map +1 -0
- package/lib/types/client/compat/types.d.ts +57 -0
- package/lib/types/client/compat/types.d.ts.map +1 -1
- package/lib/types/client/current-session-report.d.ts +37 -0
- package/lib/types/client/current-session-report.d.ts.map +1 -0
- package/lib/types/client/effects/header-status.d.ts.map +1 -1
- package/lib/types/client/effects/keyboard-guard.d.ts.map +1 -1
- package/lib/types/client/effects/permission-sheet.d.ts +39 -0
- package/lib/types/client/effects/permission-sheet.d.ts.map +1 -0
- package/lib/types/client/effects/remote-session.d.ts +25 -0
- package/lib/types/client/effects/remote-session.d.ts.map +1 -0
- package/lib/types/client/effects/turn-fold.d.ts +9 -0
- package/lib/types/client/effects/turn-fold.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +187 -2
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/remote-fetch.d.ts +51 -0
- package/lib/types/client/remote-fetch.d.ts.map +1 -0
- package/lib/types/client/remote-group-expansion.d.ts +41 -0
- package/lib/types/client/remote-group-expansion.d.ts.map +1 -0
- package/lib/types/client/remote-share-css.d.ts +19 -0
- package/lib/types/client/remote-share-css.d.ts.map +1 -0
- package/lib/types/client/remote-share-register.d.ts +113 -0
- package/lib/types/client/remote-share-register.d.ts.map +1 -0
- package/lib/types/client/remote-status-css.d.ts +15 -0
- package/lib/types/client/remote-status-css.d.ts.map +1 -0
- package/lib/types/client/remote-status-register.d.ts +46 -0
- package/lib/types/client/remote-status-register.d.ts.map +1 -0
- package/lib/types/client/settings/SettingsSection.d.ts +46 -0
- package/lib/types/client/settings/SettingsSection.d.ts.map +1 -0
- package/lib/types/client/settings/register-settings.d.ts +58 -0
- package/lib/types/client/settings/register-settings.d.ts.map +1 -0
- package/lib/types/client/settings/settings-css.d.ts +10 -0
- package/lib/types/client/settings/settings-css.d.ts.map +1 -0
- package/lib/types/client/share/share-preview.d.ts.map +1 -1
- package/lib/types/client/styles/composer.css.d.ts +1 -1
- package/lib/types/client/styles/composer.css.d.ts.map +1 -1
- package/lib/types/client/styles/header.css.d.ts +1 -1
- package/lib/types/client/styles/header.css.d.ts.map +1 -1
- package/lib/types/client/styles/info.css.d.ts +1 -1
- package/lib/types/client/styles/info.css.d.ts.map +1 -1
- package/lib/types/client/styles/remote-session.css.d.ts +2 -0
- package/lib/types/client/styles/remote-session.css.d.ts.map +1 -0
- package/lib/types/client-data/current-session.d.ts +41 -0
- package/lib/types/client-data/current-session.d.ts.map +1 -0
- package/lib/types/client-data/remote-group-expansion.d.ts +76 -0
- package/lib/types/client-data/remote-group-expansion.d.ts.map +1 -0
- package/lib/types/client-data/remote-status.d.ts +148 -0
- package/lib/types/client-data/remote-status.d.ts.map +1 -0
- package/lib/types/client-data/settings-form.d.ts +774 -0
- package/lib/types/client-data/settings-form.d.ts.map +1 -0
- package/lib/types/client-data/shares.d.ts +211 -0
- package/lib/types/client-data/shares.d.ts.map +1 -0
- package/lib/types/client-pairing.d.ts +114 -0
- package/lib/types/client-pairing.d.ts.map +1 -0
- package/lib/types/client-routes.d.ts +112 -0
- package/lib/types/client-routes.d.ts.map +1 -0
- package/lib/types/config.d.ts +200 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/fetch-route-intercept.d.ts +156 -0
- package/lib/types/fetch-route-intercept.d.ts.map +1 -0
- package/lib/types/fingerprint.d.ts +164 -0
- package/lib/types/fingerprint.d.ts.map +1 -0
- package/lib/types/http.d.ts +41 -0
- package/lib/types/http.d.ts.map +1 -0
- package/lib/types/index.d.ts +56 -24
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/intercept-shape.d.ts +32 -0
- package/lib/types/intercept-shape.d.ts.map +1 -0
- package/lib/types/intercept.d.ts +432 -0
- package/lib/types/intercept.d.ts.map +1 -0
- package/lib/types/merge-streams.d.ts +393 -0
- package/lib/types/merge-streams.d.ts.map +1 -0
- package/lib/types/relay-access.d.ts +310 -0
- package/lib/types/relay-access.d.ts.map +1 -0
- package/lib/types/relay-client.d.ts +274 -0
- package/lib/types/relay-client.d.ts.map +1 -0
- package/lib/types/relay-filter.d.ts +103 -0
- package/lib/types/relay-filter.d.ts.map +1 -0
- package/lib/types/relay-server.d.ts +208 -0
- package/lib/types/relay-server.d.ts.map +1 -0
- package/lib/types/restart-fields.d.ts +22 -0
- package/lib/types/restart-fields.d.ts.map +1 -0
- package/lib/types/restart-watcher.d.ts +83 -0
- package/lib/types/restart-watcher.d.ts.map +1 -0
- package/lib/types/session-reference.d.ts +66 -0
- package/lib/types/session-reference.d.ts.map +1 -0
- package/lib/types/share-export.d.ts +14 -1
- package/lib/types/share-export.d.ts.map +1 -1
- package/lib/types/share-ops.d.ts +79 -0
- package/lib/types/share-ops.d.ts.map +1 -0
- package/lib/types/share-store.d.ts +87 -0
- package/lib/types/share-store.d.ts.map +1 -0
- package/lib/types/virtual-id.d.ts +38 -0
- package/lib/types/virtual-id.d.ts.map +1 -0
- package/lib/virtual-id.js +52 -0
- package/lib/virtual-id.js.map +1 -0
- package/llms.txt +17 -14
- package/package.json +60 -50
- package/scripts/build-client.mjs +5 -3
- package/scripts/check-host-shadow.mjs +19 -2
- package/scripts/check-settings-form.mjs +933 -0
- package/scripts/check-shares.mjs +397 -0
- package/scripts/check-upload-endpoint.mjs +59 -3
- package/scripts/sync-doc-version.mjs +8 -15
- package/scripts/verify-fingerprint-live.mjs +111 -0
- package/src/activity.ts +218 -0
- package/src/admin-routes.ts +627 -0
- package/src/client/MobileAttachButton.tsx +2 -2
- package/src/client/MobileAttachChips.tsx +3 -3
- package/src/client/MobileDrawerFooter.tsx +7 -4
- package/src/client/MobileHome.tsx +20 -16
- package/src/client/MobileHomeChips.tsx +16 -16
- package/src/client/MobileNavOverlay.tsx +2 -2
- package/src/client/MobileNavToggle.tsx +3 -3
- package/src/client/MobileSessionHeader.tsx +63 -42
- package/src/client/MobileSessionInfo.tsx +118 -17
- package/src/client/RemoteComposerBanner.tsx +76 -0
- package/src/client/RemoteHeaderIcon.tsx +103 -0
- package/src/client/RemoteShareMenu.tsx +57 -0
- package/src/client/RemoteStatusIcon.tsx +91 -0
- package/src/client/compat/desktop.ts +22 -0
- package/src/client/compat/types.ts +62 -0
- package/src/client/current-session-report.ts +164 -0
- package/src/client/effects/header-status.ts +21 -17
- package/src/client/effects/keyboard-guard.ts +65 -1
- package/src/client/effects/permission-sheet.ts +149 -0
- package/src/client/effects/remote-session.ts +68 -0
- package/src/client/effects/turn-fold.ts +52 -0
- package/src/client/index.tsx +151 -36
- package/src/client/locales.ts +396 -2
- package/src/client/remote-fetch.ts +125 -0
- package/src/client/remote-group-expansion.ts +190 -0
- package/src/client/remote-share-css.ts +54 -0
- package/src/client/remote-share-register.ts +244 -0
- package/src/client/remote-status-css.ts +64 -0
- package/src/client/remote-status-register.ts +107 -0
- package/src/client/settings/SettingsSection.tsx +1229 -0
- package/src/client/settings/register-settings.ts +116 -0
- package/src/client/settings/settings-css.ts +236 -0
- package/src/client/share/share-preview.tsx +6 -3
- package/src/client/share/share-sheet.tsx +3 -3
- package/src/client/styles/composer.css.ts +119 -26
- package/src/client/styles/header.css.ts +7 -7
- package/src/client/styles/info.css.ts +74 -0
- package/src/client/styles/remote-session.css.ts +251 -0
- package/src/client-data/current-session.ts +57 -0
- package/src/client-data/remote-group-expansion.ts +145 -0
- package/src/client-data/remote-status.ts +374 -0
- package/src/client-data/settings-form.ts +1371 -0
- package/src/client-data/shares.ts +467 -0
- package/src/client-pairing.ts +244 -0
- package/src/client-routes.ts +732 -0
- package/src/config.ts +447 -0
- package/src/fetch-route-intercept.ts +510 -0
- package/src/fingerprint.ts +408 -0
- package/src/http.ts +68 -0
- package/src/index.ts +719 -62
- package/src/intercept-shape.ts +87 -0
- package/src/intercept.ts +3362 -0
- package/src/merge-streams.ts +1272 -0
- package/src/relay-access.ts +669 -0
- package/src/relay-client.ts +1514 -0
- package/src/relay-filter.ts +291 -0
- package/src/relay-server.ts +2025 -0
- package/src/restart-fields.ts +36 -0
- package/src/restart-watcher.ts +140 -0
- package/src/session-reference.ts +156 -0
- package/src/share-export.ts +26 -1
- package/src/share-ops.ts +114 -0
- package/src/share-store.ts +373 -0
- package/src/virtual-id.ts +59 -0
|
@@ -12,7 +12,7 @@ export declare const zh: {
|
|
|
12
12
|
readonly allWorkspaces: "全部";
|
|
13
13
|
readonly switchWorkspace: "切换工作区";
|
|
14
14
|
readonly newSession: "新建会话";
|
|
15
|
-
readonly noSessions: "
|
|
15
|
+
readonly noSessions: "暂无会话,点击右下角加号新建";
|
|
16
16
|
readonly homeStatusOngoing: "运行中";
|
|
17
17
|
readonly homeStatusWarning: "待处理";
|
|
18
18
|
readonly homeStatusDone: "已完成";
|
|
@@ -67,7 +67,7 @@ export declare const zh: {
|
|
|
67
67
|
readonly shareErrProbe: "当前浏览器无法生成分享图";
|
|
68
68
|
readonly shareErrRender: "生成分享图失败,请重试";
|
|
69
69
|
readonly shareErrSliceBudget: "分享图单段内容超出画布上限,请缩小分享范围后重试";
|
|
70
|
-
readonly shareErrEmpty: "
|
|
70
|
+
readonly shareErrEmpty: "会话暂无可分享的内容";
|
|
71
71
|
readonly shareStitchUnsupported: "当前浏览器暂不支持合成单张长图,已导出为多张图片";
|
|
72
72
|
readonly shareStitchFailed: "合成单张长图失败,已改为多张图片导出";
|
|
73
73
|
readonly settings: "设置";
|
|
@@ -75,6 +75,191 @@ export declare const zh: {
|
|
|
75
75
|
readonly chipSsh: "SSH";
|
|
76
76
|
readonly chipUsage: "用量";
|
|
77
77
|
readonly chipCustomize: "自定义入口";
|
|
78
|
+
readonly 'settings.summary': "远程访问的配对、设备、网关与推送设置";
|
|
79
|
+
readonly 'settings.unavailable': "当前部署未开放这项配置。";
|
|
80
|
+
readonly 'settings.readOnly': "当前部署的设置为只读。";
|
|
81
|
+
readonly 'settings.saveFailed': "保存未被接受;草稿已保留,可修改后重试。";
|
|
82
|
+
readonly 'settings.save': "保存";
|
|
83
|
+
readonly 'settings.saving': "保存中…";
|
|
84
|
+
readonly 'settings.overridden': "已覆盖";
|
|
85
|
+
readonly 'settings.reset': "重置";
|
|
86
|
+
readonly 'settings.roleTitle': "角色";
|
|
87
|
+
readonly 'settings.role': "运行角色";
|
|
88
|
+
readonly 'settings.roleHint': "本 DSH 进程在远程访问体系中的角色。";
|
|
89
|
+
readonly 'settings.roleHost': "主服务端(host)";
|
|
90
|
+
readonly 'settings.roleClient': "子客户端(client)";
|
|
91
|
+
readonly 'settings.reloadNote': "保存后插件会自动重载,网关短暂中断";
|
|
92
|
+
readonly 'settings.gatewayTitle': "网关与反代";
|
|
93
|
+
readonly 'settings.gatewayRunning': "运行中 · 端口 {port} · 转发到 {target}";
|
|
94
|
+
readonly 'settings.gatewayDown': "网关未运行";
|
|
95
|
+
readonly 'settings.gatewayAbnormal': "网关回应异常(HTTP {code})";
|
|
96
|
+
readonly 'settings.fieldHost': "监听地址";
|
|
97
|
+
readonly 'settings.fieldHostHint': "网关子进程绑定的地址,默认 127.0.0.1;反代部署保持本机回环。留空清除。";
|
|
98
|
+
readonly 'settings.fieldHostNote': "必须包含本机回环地址(填 127.0.0.1 或 0.0.0.0)。设置页通过回环地址管理网关,只填局域网 IP 会导致配对与设备管理不可用。";
|
|
99
|
+
readonly 'settings.fieldPort': "网关端口";
|
|
100
|
+
readonly 'settings.fieldPortHint': "网关子进程监听的端口,1–65535 的整数,默认 3088。";
|
|
101
|
+
readonly 'settings.fieldTrustedProxies': "可信代理";
|
|
102
|
+
readonly 'settings.fieldTrustedProxiesHint': "逗号分隔的反代 IP 列表,网关据此信任 X-Forwarded-* 头。留空清除。";
|
|
103
|
+
readonly 'settings.fieldRateLimit': "限流(次/分钟)";
|
|
104
|
+
readonly 'settings.fieldRateLimitHint': "尚未配对的请求每分钟允许的次数(按客户端 IP 计,已配对设备不受限),正整数。";
|
|
105
|
+
readonly 'settings.fieldVapidSubject': "推送联系人";
|
|
106
|
+
readonly 'settings.fieldVapidSubjectHint': "VAPID subject,mailto: 或 https: 地址。留空清除。";
|
|
107
|
+
readonly 'settings.invalidPort': "需要 1–65535 的整数";
|
|
108
|
+
readonly 'settings.invalidPositiveInt': "需要正整数";
|
|
109
|
+
readonly 'settings.pushTitle': "推送";
|
|
110
|
+
readonly 'settings.fieldPushSummary': "推送内容摘要";
|
|
111
|
+
readonly 'settings.fieldPushSummaryHint': "在推送正文中包含回合的最终文本或待回答的问题。";
|
|
112
|
+
readonly 'settings.fieldPushTurnEnd': "回合结束推送";
|
|
113
|
+
readonly 'settings.fieldPushTurnEndHint': "每个顶层回合结束时都推送;默认仅在需要处理时推送。";
|
|
114
|
+
readonly 'settings.fieldPushTool': "注册 push_notify 工具";
|
|
115
|
+
readonly 'settings.fieldPushToolHint': "允许模型主动发送通知。";
|
|
116
|
+
readonly 'settings.fieldPushDebounceMs': "防抖间隔(毫秒)";
|
|
117
|
+
readonly 'settings.fieldPushDebounceMsHint': "两次推送之间的最小间隔,不小于 0 的整数。";
|
|
118
|
+
readonly 'settings.fieldLang': "通知语言";
|
|
119
|
+
readonly 'settings.fieldLangHint': "推送与配对页文案的语言;auto 跟随请求方。";
|
|
120
|
+
readonly 'settings.langAuto': "自动(auto)";
|
|
121
|
+
readonly 'settings.langZh': "中文(zh)";
|
|
122
|
+
readonly 'settings.langEn': "English(en)";
|
|
123
|
+
readonly 'settings.invalidNonNegativeInt': "需要不小于 0 的整数";
|
|
124
|
+
readonly 'settings.pushTestLabel': "测试推送";
|
|
125
|
+
readonly 'settings.pushTestRun': "发送测试推送";
|
|
126
|
+
readonly 'settings.pushTestRunning': "发送中…";
|
|
127
|
+
readonly 'settings.pushTestOk': "已发送:成功 {sent} 条,失败 {failed} 条";
|
|
128
|
+
readonly 'settings.pushTestFail': "测试推送发送失败";
|
|
129
|
+
readonly 'settings.pairingTitle': "配对";
|
|
130
|
+
readonly 'settings.pairingWebGuide': "适用于手机、平板及各类浏览器。通过网关地址访问,可查看并操作服务端的全部会话。";
|
|
131
|
+
readonly 'settings.pairingDesktopGuide': "适用于已安装 DSH 桌面端、并启用 zen-remote 子客户端角色的计算机。配对后,服务端已开启远程连接的会话将显示在该计算机的侧边栏中,其余会话不可见。";
|
|
132
|
+
readonly 'settings.pairingGenerate': "生成配对码";
|
|
133
|
+
readonly 'settings.pairingGenerating': "生成中…";
|
|
134
|
+
readonly 'settings.pairingCodeLabel': "配对码";
|
|
135
|
+
readonly 'settings.pairingRemaining': "剩余 {count} 秒";
|
|
136
|
+
readonly 'settings.pairingFail': "配对码生成失败";
|
|
137
|
+
readonly 'settings.devicesTitle': "设备";
|
|
138
|
+
readonly 'settings.devicesEmpty': "暂无已配对的设备";
|
|
139
|
+
readonly 'settings.deviceRoleWeb': "Web 应用端";
|
|
140
|
+
readonly 'settings.deviceRoleDesktop': "桌面应用端";
|
|
141
|
+
readonly 'settings.kindAuto': "自动";
|
|
142
|
+
readonly 'settings.kindPhone': "手机";
|
|
143
|
+
readonly 'settings.kindDesktop': "电脑";
|
|
144
|
+
readonly 'settings.deviceLastSeen': "最近在线 {time}";
|
|
145
|
+
readonly 'settings.devicePushOn': "已订阅推送";
|
|
146
|
+
readonly 'settings.devicePushOff': "未订阅推送";
|
|
147
|
+
readonly 'settings.deviceRename': "重命名";
|
|
148
|
+
readonly 'settings.renamePrompt': "设备新名称";
|
|
149
|
+
readonly 'settings.renameSave': "确定";
|
|
150
|
+
readonly 'settings.renameCancel': "取消";
|
|
151
|
+
readonly 'settings.deviceRevoke': "吊销";
|
|
152
|
+
readonly 'settings.deviceRoleSelect': "{name} 的角色";
|
|
153
|
+
readonly 'settings.deviceKindSelect': "{name} 的界面布局";
|
|
154
|
+
readonly 'settings.revokeConfirm': "吊销后该设备需要重新配对,确定继续?";
|
|
155
|
+
readonly 'settings.revokeAll': "全部吊销";
|
|
156
|
+
readonly 'settings.revokeAllConfirm': "将吊销全部已配对设备,确定继续?";
|
|
157
|
+
readonly 'settings.actionFail': "操作失败";
|
|
158
|
+
readonly 'settings.shareTitle': "远程共享";
|
|
159
|
+
readonly 'settings.shareListTitle': "已开启远程的会话";
|
|
160
|
+
readonly 'settings.shareListEmpty': "当前没有已开启远程的会话";
|
|
161
|
+
readonly 'settings.shareViewers': "{count} 台设备正在查看";
|
|
162
|
+
readonly 'settings.shareClose': "关闭远程";
|
|
163
|
+
readonly 'settings.shareCloseAll': "全部关闭";
|
|
164
|
+
readonly 'settings.shareCloseAllConfirm': "将关闭全部已开启远程的会话,确定继续?";
|
|
165
|
+
readonly 'settings.shareActionFail': "操作失败";
|
|
166
|
+
readonly 'settings.fieldServerName': "设备名称";
|
|
167
|
+
readonly 'settings.fieldServerNameHint': "其他设备远程访问时显示的名称,1–40 个字符,留空恢复默认。";
|
|
168
|
+
readonly 'settings.fieldServerNameHintClient': "配对时注册到服务端的名称,1–40 个字符。";
|
|
169
|
+
readonly 'settings.fieldIdleHours': "闲置休眠(小时)";
|
|
170
|
+
readonly 'settings.fieldIdleHoursHint': "超过该时长无新活动时,自动关闭远程连接。运行中或等待中的会话不计时。默认 48,取值大于 0 且不超过 8760。";
|
|
171
|
+
readonly 'settings.fieldAutoShare': "自动共享新会话";
|
|
172
|
+
readonly 'settings.fieldAutoShareHint': "新建的会话自动共享给已配对的设备。";
|
|
173
|
+
readonly 'settings.invalidName': "名称需要 1–40 个字符";
|
|
174
|
+
readonly 'settings.invalidHours': "需要大于 0 且不超过 8760 的数字";
|
|
175
|
+
readonly 'settings.remoteNotice': "配对与设备管理只能在服务端本机操作";
|
|
176
|
+
readonly 'settings.savedInvalid': "已保存的值无效,当前生效的是 {source} 的值";
|
|
177
|
+
readonly 'settings.sourceEnvBadge': "由环境变量锁定";
|
|
178
|
+
readonly 'settings.sourceFileBadge': "来自旧配置文件 lan-gate.config.json";
|
|
179
|
+
readonly 'settings.sourceEnv': "环境变量";
|
|
180
|
+
readonly 'settings.sourceFile': "旧配置文件 lan-gate.config.json";
|
|
181
|
+
readonly 'settings.sourceDefault': "默认值";
|
|
182
|
+
readonly 'settings.statusUnavailable': "无法读取插件状态(HTTP {code})";
|
|
183
|
+
readonly 'settings.statusUnknown': "无法读取插件状态";
|
|
184
|
+
readonly 'settings.refreshFailed': "状态刷新失败,当前显示的是上一次成功的数据";
|
|
185
|
+
readonly 'settings.resetPreview': "保存后恢复为下一层的值";
|
|
186
|
+
readonly 'settings.client.connectTitle': "连接服务端";
|
|
187
|
+
readonly 'settings.client.serverUrl': "服务端地址";
|
|
188
|
+
readonly 'settings.client.serverUrlHint': "服务端网关地址,例如 http://192.168.1.10:3088 或 https://dsh.example.com。";
|
|
189
|
+
readonly 'settings.client.deviceNameDefault': "桌面应用端";
|
|
190
|
+
readonly 'settings.client.fixDeviceName': "请先修正设备名称";
|
|
191
|
+
readonly 'settings.client.pairingCode': "配对码";
|
|
192
|
+
readonly 'settings.client.pairingCodeHint': "在服务端设置页生成「桌面应用端」配对码后填入(8 位,自动转大写)。";
|
|
193
|
+
readonly 'settings.client.pair': "配对";
|
|
194
|
+
readonly 'settings.client.pairing': "配对中…";
|
|
195
|
+
readonly 'settings.client.failInvalid': "服务端地址不合法";
|
|
196
|
+
readonly 'settings.client.failInsecureHttp': "公网地址必须使用 https;http 只允许局域网或 Tailscale 地址";
|
|
197
|
+
readonly 'settings.client.failBadCode': "配对码错误或已过期";
|
|
198
|
+
readonly 'settings.client.failLocked': "尝试次数过多,请 {minutes} 分钟后再试";
|
|
199
|
+
readonly 'settings.client.failUnreachable': "无法连接服务端";
|
|
200
|
+
readonly 'settings.client.failRoleMismatch': "该配对码不适用于桌面应用端";
|
|
201
|
+
readonly 'settings.client.failUnexpected': "服务端回应无法识别,请确认服务端已安装 dsh-zen-remote 2.0.0";
|
|
202
|
+
readonly 'settings.client.failWrite': "配对成功,但本机保存令牌失败:设置存储不可用或只读";
|
|
203
|
+
readonly 'settings.client.statusTitle': "连接状态";
|
|
204
|
+
readonly 'settings.client.statusUnpaired': "未配对";
|
|
205
|
+
readonly 'settings.client.statusConnected': "已连接到 {serverUrl}";
|
|
206
|
+
readonly 'settings.client.statusRevoked': "令牌已被吊销,请重新配对";
|
|
207
|
+
readonly 'settings.client.statusUnreachable': "服务端当前不可达";
|
|
208
|
+
readonly 'settings.client.statusUnexpected': "服务端版本不支持远程会话(需要 dsh-zen-remote 2.0.0)";
|
|
209
|
+
readonly 'settings.client.statusInvalidUrl': "服务端地址无效或不安全,请重新配对";
|
|
210
|
+
readonly 'settings.client.statusRefresh': "刷新";
|
|
211
|
+
readonly 'settings.client.statusRefreshing': "刷新中…";
|
|
212
|
+
readonly 'settings.client.tokenSet': "设备令牌已保存";
|
|
213
|
+
readonly 'settings.client.unpair': "解除配对";
|
|
214
|
+
readonly 'settings.client.unpairBusy': "解除中…";
|
|
215
|
+
readonly 'settings.client.unpairConfirm': "本机将忘记已保存的服务端令牌(服务端的设备记录不受影响)。确定继续?";
|
|
216
|
+
readonly 'settings.client.unpairDone': "本机已忘记令牌;如需彻底失效,请在服务端设备列表中吊销该设备";
|
|
217
|
+
readonly shareRemoteOn: "开启远程";
|
|
218
|
+
readonly shareRemoteOff: "关闭远程";
|
|
219
|
+
readonly shareRemoteStateOff: "未开启远程";
|
|
220
|
+
readonly shareRemoteStateOn: "已开启远程";
|
|
221
|
+
readonly infoRemoteAccess: "远程访问";
|
|
222
|
+
readonly shareRemoteBusy: "运行中,不计时";
|
|
223
|
+
readonly shareRemoteRemainingHours: "剩余闲置时间 {count} 小时";
|
|
224
|
+
readonly shareRemoteRemainingMinutes: "剩余闲置时间 {count} 分钟";
|
|
225
|
+
readonly shareRemoteConfirmOn: "开启远程后,已配对的桌面应用端将可以查看并操作此会话。确定开启?";
|
|
226
|
+
readonly shareRemoteConfirmOff: "关闭后,桌面应用端将无法再访问此会话。确定关闭?";
|
|
227
|
+
readonly shareRemoteFailSubagent: "开启远程失败:子智能体会话不能单独开启";
|
|
228
|
+
readonly shareRemoteFailEmpty: "开启远程失败:会话暂无内容";
|
|
229
|
+
readonly shareRemoteFailGeneric: "操作失败,请稍后再试";
|
|
230
|
+
readonly 'settings.client.reconnect': "立即重连";
|
|
231
|
+
readonly 'settings.client.reconnectBusy': "重连中…";
|
|
232
|
+
readonly 'settings.client.statusConnectedName': "已连接到「{serverName}」";
|
|
233
|
+
readonly 'settings.client.statusOfflineRetry': "离线,将于 {seconds} 秒后重试";
|
|
234
|
+
readonly 'settings.client.statusOfflineRetrySoon': "离线,即将重试…";
|
|
235
|
+
readonly 'settings.client.statusIncompatible': "与服务端中继协议不兼容,请升级两端的 dsh-zen-remote";
|
|
236
|
+
readonly 'settings.client.diagTitle': "诊断";
|
|
237
|
+
readonly 'settings.client.diagLastError': "最近错误码:{code}";
|
|
238
|
+
readonly 'settings.client.diagInterceptInstalled': "请求拦截器已安装";
|
|
239
|
+
readonly 'settings.client.diagInterceptMissing': "请求拦截器未安装";
|
|
240
|
+
readonly 'settings.client.diagInterceptDisabled': "远程功能已停用:DSH 内部结构与预期不符";
|
|
241
|
+
readonly 'settings.client.diagRecentFailures': "最近的远程调用失败";
|
|
242
|
+
readonly 'settings.client.diagCompatGroups': "指纹有差异的组:{groups}";
|
|
243
|
+
readonly 'settings.client.diagCompatCalls': "最近的不兼容调用";
|
|
244
|
+
readonly remoteStatusOnline: "远程会话 · 已连接";
|
|
245
|
+
readonly remoteStatusOffline: "服务端离线,正在重连";
|
|
246
|
+
readonly remoteStatusMismatch: "与服务端版本不一致,部分功能可能不可用";
|
|
247
|
+
readonly remoteStatusRevoked: "令牌已吊销,请在设置页重新配对";
|
|
248
|
+
readonly remoteStatusUnpaired: "已解除配对";
|
|
249
|
+
readonly remoteBannerOffline: "服务端离线,远程会话暂时只读,恢复连接后自动可用";
|
|
250
|
+
readonly remoteBannerRevoked: "令牌已吊销,请在设置页重新配对";
|
|
251
|
+
readonly remoteBannerUnpaired: "已解除配对";
|
|
252
|
+
readonly remoteBannerClosedIdle: "远程已关闭:闲置超过设定时间,已自动休眠";
|
|
253
|
+
readonly remoteBannerClosedManual: "远程已关闭:服务端已关闭此会话的远程";
|
|
254
|
+
readonly remoteBannerClosedClient: "远程已关闭:已在本机关闭远程";
|
|
255
|
+
readonly remoteStatusUnshareConfirm: "关闭远程后,此会话将从本机的远程分组中移除,服务端上的会话不受影响。确定关闭?";
|
|
256
|
+
readonly remoteStatusOfflineClick: "服务端离线,无法操作";
|
|
257
|
+
readonly remoteStatusUnshareFail: "关闭远程失败,请稍后再试";
|
|
258
|
+
readonly remoteStatusUnshareFailCode: "关闭远程失败({code}),请稍后再试";
|
|
259
|
+
readonly remoteGroupOffline: "(离线)";
|
|
260
|
+
readonly remoteGroupRevoked: "(令牌已吊销)";
|
|
261
|
+
readonly remoteGroupUnpaired: "(已解除配对)";
|
|
262
|
+
readonly remoteGroupMismatch: "(版本有差异)";
|
|
78
263
|
};
|
|
79
264
|
/** English dictionary, key-identical to the Chinese source of truth. */
|
|
80
265
|
export declare const en: Record<MobileNavKey, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,EAAE,cAAc,CAAA;AAE7B,mEAAmE;AACnE,eAAO,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,EAAE,cAAc,CAAA;AAE7B,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiRL,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CA6Q3C,CAAA;AAED,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sub-client's plain-HTTP relay, browser half (T41b). The session page's
|
|
3
|
+
* changes / diff panel does not ride the typert gateway — it GETs
|
|
4
|
+
* `/api/changes.summary` and `/api/changes.diff` with the session id in the
|
|
5
|
+
* query (RT dsh-client-ui-deliverables/lib/client.js ~13-17, 90-109, 208:
|
|
6
|
+
* plain call-time `fetch(url, { signal })`, document-relative string URLs),
|
|
7
|
+
* so a remote session's virtual id would hit the LOCAL DSH and 404. This
|
|
8
|
+
* module wraps `window.fetch` ONCE: a same-origin GET whose path is exactly
|
|
9
|
+
* one of those two routes and whose `sessionId` parameter carries a virtual
|
|
10
|
+
* id (`zr~` prefix, virtual-id.ts's skeleton — the strict parse happens in
|
|
11
|
+
* the backend route) is rewritten to the sub-client relay route
|
|
12
|
+
* `/_dsh/zen-remote/client/http/<route>?<original query>`, `init` (the
|
|
13
|
+
* abort signal) passing through untouched. Every other request — local
|
|
14
|
+
* sessions, any other path, cross-origin, non-GET — reaches the original
|
|
15
|
+
* fetch unchanged, so a host-role deployment (whose session ids are never
|
|
16
|
+
* virtual) is bit-for-bit unintercepted.
|
|
17
|
+
*
|
|
18
|
+
* Not covered by THIS wrapper (each surface has its own channel since T51):
|
|
19
|
+
* the attachment upload's HTTP branch runs inside a Web Worker over XHR /
|
|
20
|
+
* Worker-scoped fetch — unreachable from `window.fetch`, so it is intercepted
|
|
21
|
+
* one layer down, at the host's exact-fetch-route table, by
|
|
22
|
+
* `src/fetch-route-intercept.ts` (which relays the bytes and likewise blocks
|
|
23
|
+
* the session export); `present.host` / `changes.open` / `present.open`
|
|
24
|
+
* belong to entries hidden on remote sessions rather than relayed. The
|
|
25
|
+
* complete not-relayed registry still lives beside the server's in
|
|
26
|
+
* src/relay-access.ts.
|
|
27
|
+
*/
|
|
28
|
+
/** Prefix of the sub-client backend route the rewritten calls land on. */
|
|
29
|
+
export declare const CLIENT_HTTP_ROUTE_PREFIX = "/_dsh/zen-remote/client/http/";
|
|
30
|
+
/** The fetch face this module wraps; injectable so tests drive a fake. */
|
|
31
|
+
export interface FetchHost {
|
|
32
|
+
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
33
|
+
location: {
|
|
34
|
+
href: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The rewrite decision, pure: the relay URL for one fetch call, or
|
|
39
|
+
* `undefined` to pass through untouched. Only a GET, same-origin against
|
|
40
|
+
* `baseHref`, on one of the two exact paths, with a `zr~`-prefixed
|
|
41
|
+
* `sessionId` rewrites — every other shape of the world returns undefined.
|
|
42
|
+
*/
|
|
43
|
+
export declare function rewriteRemoteApiUrl(input: unknown, method: string, baseHref: string): string | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Wrap the host's `fetch` exactly once and return the uninstaller. A call
|
|
46
|
+
* while a wrap is already live adopts it (no second layer, exactly one hop)
|
|
47
|
+
* and takes over its ownership. The wrapper reads `location.href` per call,
|
|
48
|
+
* not at install time.
|
|
49
|
+
*/
|
|
50
|
+
export declare function installRemoteApiFetch(host: FetchHost): () => void;
|
|
51
|
+
//# sourceMappingURL=remote-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-fetch.d.ts","sourceRoot":"","sources":["../../../src/client/remote-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,kCAAkC,CAAA;AAEvE,0EAA0E;AAC1E,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBxG;AAqBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,IAAI,CAiCjE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** The storage face used, narrowed to the two methods (structurally typed:
|
|
2
|
+
* this module compiles under the client tsconfig with DOM lib, but tests
|
|
3
|
+
* inject stubs). */
|
|
4
|
+
interface StorageLike {
|
|
5
|
+
getItem(key: string): string | null;
|
|
6
|
+
setItem(key: string, value: string): void;
|
|
7
|
+
}
|
|
8
|
+
/** One matched row: the group id, its current expansion, and the click. */
|
|
9
|
+
interface RowHandle {
|
|
10
|
+
key: string;
|
|
11
|
+
expanded: boolean;
|
|
12
|
+
click(): void;
|
|
13
|
+
}
|
|
14
|
+
export interface RemoteGroupExpansionKeeperOptions {
|
|
15
|
+
/** Both storage reads and writes. Default: the page's localStorage; a
|
|
16
|
+
* broken or absent one makes every tick a no-op. */
|
|
17
|
+
storage?: StorageLike;
|
|
18
|
+
/** The role probe. Default: the shared cached client-config probe. */
|
|
19
|
+
probeRole?: () => Promise<'host' | 'client' | undefined>;
|
|
20
|
+
/** The sidebar's server group rows. Default: the real DOM query — rows
|
|
21
|
+
* without a readable `aria-expanded` are skipped. Tests inject fake rows
|
|
22
|
+
* with click recorders. */
|
|
23
|
+
queryRows?: () => RowHandle[];
|
|
24
|
+
/** The re-check interval; default 1000ms. */
|
|
25
|
+
intervalMs?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Start the keeper loop. Returns the disposer (interval) the mounting
|
|
29
|
+
* effect calls on teardown.
|
|
30
|
+
*/
|
|
31
|
+
export declare function startRemoteGroupExpansionKeeper(options?: RemoteGroupExpansionKeeperOptions): () => void;
|
|
32
|
+
/**
|
|
33
|
+
* Mount the keeper as one page-lifetime effect, beside the current-session
|
|
34
|
+
* reporter (T62): before the desktop-shell gate in apply(), same client-role
|
|
35
|
+
* probe, same 1s cadence — its own timer, its own file.
|
|
36
|
+
*/
|
|
37
|
+
export declare function mountRemoteGroupExpansionKeeper(ctx: {
|
|
38
|
+
effect(fn: () => () => void, name: string): void;
|
|
39
|
+
}, options?: RemoteGroupExpansionKeeperOptions): void;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=remote-group-expansion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-group-expansion.d.ts","sourceRoot":"","sources":["../../../src/client/remote-group-expansion.ts"],"names":[],"mappings":"AAgDA;;oBAEoB;AACpB,UAAU,WAAW;IACnB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1C;AAMD,2EAA2E;AAC3E,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,iCAAiC;IAChD;wDACoD;IACpD,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAA;IACxD;;+BAE2B;IAC3B,SAAS,CAAC,EAAE,MAAM,SAAS,EAAE,CAAA;IAC7B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,GAAE,iCAAsC,GAAG,MAAM,IAAI,CA+F3G;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,EAAE,MAAM,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,OAAO,GAAE,iCAAsC,GAAG,IAAI,CAEhK"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styles for the T33b session-sharing parts — the title-row remote icon's
|
|
3
|
+
* three states and nothing else (the menu item is an official
|
|
4
|
+
* MenuItemButton and needs no CSS; the settings list draws on the settings
|
|
5
|
+
* block's own zr-settings-* sheet). Injected as one
|
|
6
|
+
* `<style data-plugin="dsh-zen-remote-remote-share">` tag BEFORE apply's
|
|
7
|
+
* desktop gate: the desktop app IS the main server and its title row is
|
|
8
|
+
* where the icon lives. Every selector is scoped under the button's own
|
|
9
|
+
* attribute, so nothing here can reach host elements (the title row's
|
|
10
|
+
* layout especially — this box is a fixed 28px grid item and shrinks for
|
|
11
|
+
* nobody).
|
|
12
|
+
*
|
|
13
|
+
* On the phone shell the icon needs no rules of its own: the mobile
|
|
14
|
+
* stylesheet blanket-hides every child of the
|
|
15
|
+
* `conversation.session.header.actions` slot wrapper (styles/header.css.ts),
|
|
16
|
+
* which this entry is.
|
|
17
|
+
*/
|
|
18
|
+
export declare const REMOTE_SHARE_CSS = "\nbutton.zr-remote-toggle[data-zen-remote=\"remote-toggle\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n position: relative;\n}\nbutton.zr-remote-toggle[data-zen-remote=\"remote-toggle\"]:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\nbutton.zr-remote-toggle[data-zen-remote=\"remote-toggle\"][data-state=\"on\"],\nbutton.zr-remote-toggle[data-zen-remote=\"remote-toggle\"][data-state=\"watched\"] {\n color: var(--dsw-alias-state-business-primary, #4f6ef7);\n}\n/* The \"a desktop client is watching\" dot: a live signal outside the glyph's\n box so it never collides with the 16px artwork. */\nbutton.zr-remote-toggle[data-zen-remote=\"remote-toggle\"][data-state=\"watched\"]::after {\n content: '';\n position: absolute;\n top: 3px;\n right: 3px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n";
|
|
19
|
+
//# sourceMappingURL=remote-share-css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-share-css.d.ts","sourceRoot":"","sources":["../../../src/client/remote-share-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,gBAAgB,onCAmC5B,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration for the T33b session-sharing parts — the work that must run
|
|
3
|
+
* BEFORE apply's desktop-shell gate (the desktop app IS the main server:
|
|
4
|
+
* its title row and session menus are exactly where these parts live),
|
|
5
|
+
* extracted so the Node-side desktop-gate test can drive it against a fake
|
|
6
|
+
* ctx (the components are .tsx; they arrive as parameters, keeping this
|
|
7
|
+
* module JSX-free and importable under Node's type stripping — the same
|
|
8
|
+
* trick register-settings.ts uses).
|
|
9
|
+
*
|
|
10
|
+
* Registers the title-row remote icon on
|
|
11
|
+
* `conversation.session.header.actions` (order 25, past the official jobs
|
|
12
|
+
* entry at 20 so the two never tie) and the remote toggle on
|
|
13
|
+
* `sidebar.workspaces.session.menu.item` (order 500, under the official
|
|
14
|
+
* archive row, behind a group hairline), plus the one stylesheet both
|
|
15
|
+
* surfaces need.
|
|
16
|
+
*
|
|
17
|
+
* The parts render and poll only on the HOST role (T33b-fix): this module
|
|
18
|
+
* wires the shares store's role from the SAME two-level decision the
|
|
19
|
+
* settings page makes (settings-form.ts's shared `settingsRoleOf`) — the
|
|
20
|
+
* configForms row document first, and while the row is silent the effective
|
|
21
|
+
* role probed from `/_dsh/mobile-nav/client-config` (T17: the route carries
|
|
22
|
+
* the merged role). The decision re-runs on every scope snapshot update, so
|
|
23
|
+
* a snapshot that resolves late — or a row whose role appears after the
|
|
24
|
+
* probe already answered — re-decides, and a deployment switched back to
|
|
25
|
+
* host recovers. The wiring hangs off a lazy `ctx.inject(['configForms'], …)`;
|
|
26
|
+
* where the settings service never arrives, one fallback probe wires the
|
|
27
|
+
* role on its own (guarded: a snapshot answer always wins over it).
|
|
28
|
+
*
|
|
29
|
+
* The `sidebar.workspaces.session.menu.item` SlotMap entry is declared here
|
|
30
|
+
* as a structural mirror: this package does not depend on
|
|
31
|
+
* dsh-client-ui-workspace (the slot's owner), whose type-only merges would
|
|
32
|
+
* normally provide it. The mirror records what the workspace browser
|
|
33
|
+
* actually hands its entries: the row props (`sessionId`, `displayTitle`),
|
|
34
|
+
* the `[open, setOpen]` pair it passes as the render occurrence's
|
|
35
|
+
* hookContext, and the list-level inject whose `menuOpenState` hook factory
|
|
36
|
+
* binds that pair — official rows call it `useMenuOpenState` and close the
|
|
37
|
+
* menu with it.
|
|
38
|
+
*/
|
|
39
|
+
import type { ReactNode } from 'react';
|
|
40
|
+
import type { SessionId } from './compat/types.ts';
|
|
41
|
+
import type { ClientContext } from './compat/types.ts';
|
|
42
|
+
import type { SharesStore } from '../client-data/shares.ts';
|
|
43
|
+
import type { RemoteHeaderIconProps } from './RemoteHeaderIcon.tsx';
|
|
44
|
+
import type { RemoteShareMenuProps } from './RemoteShareMenu.tsx';
|
|
45
|
+
/** The `[open, setOpen]` pair the workspace Menu hands every row entry. */
|
|
46
|
+
export type SessionMenuOpenState = readonly [boolean, (open: boolean) => void];
|
|
47
|
+
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
48
|
+
interface SlotMap {
|
|
49
|
+
'sidebar.workspaces.session.menu.item': {
|
|
50
|
+
kind: 'list';
|
|
51
|
+
scope: 'root';
|
|
52
|
+
owner: {
|
|
53
|
+
sessionId: SessionId;
|
|
54
|
+
displayTitle: string;
|
|
55
|
+
};
|
|
56
|
+
hookContext: SessionMenuOpenState;
|
|
57
|
+
inject: {
|
|
58
|
+
hooks: {
|
|
59
|
+
menuOpenState: (context: unknown) => () => SessionMenuOpenState;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** The header icon component (a .tsx factory result; parameter for Node). */
|
|
66
|
+
export type RemoteHeaderIconComponent = (props: RemoteHeaderIconProps) => ReactNode;
|
|
67
|
+
/** The menu-item component (a .tsx factory result; parameter for Node). */
|
|
68
|
+
export type RemoteShareMenuComponent = (props: RemoteShareMenuProps) => ReactNode;
|
|
69
|
+
export declare function probeClientConfigRole(refetch?: boolean): Promise<'host' | 'client' | undefined>;
|
|
70
|
+
/** How one probe is issued — the real route reader, or the check/test
|
|
71
|
+
* double. `refetch` mirrors {@link probeClientConfigRole}: true drops any
|
|
72
|
+
* cached answer and asks again. */
|
|
73
|
+
export type ClientConfigProbe = (refetch?: boolean) => Promise<'host' | 'client' | undefined>;
|
|
74
|
+
export interface WireSharesRoleOptions {
|
|
75
|
+
/** Called once a definite verdict was applied (the no-configForms
|
|
76
|
+
* fallback checks this before trusting its own probe). */
|
|
77
|
+
onVerdict?: () => void;
|
|
78
|
+
/** The probe to consult while the row document is silent. Defaults to
|
|
79
|
+
* the real client-config reader; tests inject a controllable double so
|
|
80
|
+
* they never depend on module-level probe state. */
|
|
81
|
+
probe?: ClientConfigProbe;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Wire a shares store's role off one configForms scope: the saved row role
|
|
85
|
+
* wins (settingsRoleOf), while the row is silent the client-config probe
|
|
86
|
+
* fills the gap, and every scope update re-decides. Verdicts of
|
|
87
|
+
* `'unknown'` — snapshot still loading, probe pending or FAILED — leave
|
|
88
|
+
* the store untouched: nothing polls and nothing renders (never a guessed
|
|
89
|
+
* host). A scope STATUS change (loading→ready, a mirror resync) drops the
|
|
90
|
+
* probe answer and probes again, the same two signals the settings page's
|
|
91
|
+
* probe effect re-runs on.
|
|
92
|
+
* @param scope - the plugin row's shared configuration form scope.
|
|
93
|
+
* @param store - the shares store whose role this wiring drives.
|
|
94
|
+
* @param options - verdict callback and probe injection.
|
|
95
|
+
* @returns disposer releasing the scope subscription.
|
|
96
|
+
*/
|
|
97
|
+
export declare function wireSharesRole(scope: {
|
|
98
|
+
getSnapshot(): {
|
|
99
|
+
status: 'loading' | 'ready' | 'unavailable';
|
|
100
|
+
value?: unknown;
|
|
101
|
+
user?: unknown;
|
|
102
|
+
};
|
|
103
|
+
subscribe(listener: () => void): () => void;
|
|
104
|
+
}, store: Pick<SharesStore, 'setRole'>, options?: WireSharesRoleOptions): () => void;
|
|
105
|
+
/**
|
|
106
|
+
* Register the stylesheet and the two sharing parts. Gate-independent by
|
|
107
|
+
* design — the caller (apply) places this before its desktop gate.
|
|
108
|
+
* @param ctx - client root context.
|
|
109
|
+
* @param headerIcon - the title-row icon component.
|
|
110
|
+
* @param menuItem - the session-menu toggle component.
|
|
111
|
+
*/
|
|
112
|
+
export declare function registerRemoteShareUi(ctx: ClientContext, headerIcon: RemoteHeaderIconComponent, menuItem: RemoteShareMenuComponent): void;
|
|
113
|
+
//# sourceMappingURL=remote-share-register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-share-register.d.ts","sourceRoot":"","sources":["../../../src/client/remote-share-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAM3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,2EAA2E;AAC3E,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAA;AAE9E,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf,sCAAsC,EAAE;YACtC,IAAI,EAAE,MAAM,CAAA;YACZ,KAAK,EAAE,MAAM,CAAA;YACb,KAAK,EAAE;gBAAE,SAAS,EAAE,SAAS,CAAC;gBAAC,YAAY,EAAE,MAAM,CAAA;aAAE,CAAA;YACrD,WAAW,EAAE,oBAAoB,CAAA;YACjC,MAAM,EAAE;gBAAE,KAAK,EAAE;oBAAE,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,oBAAoB,CAAA;iBAAE,CAAA;aAAE,CAAA;SACvF,CAAA;KACF;CACF;AAED,6EAA6E;AAC7E,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAA;AACnF,2EAA2E;AAC3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAA;AAiBjF,wBAAgB,qBAAqB,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAqB7F;AAED;;mCAEmC;AACnC,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAA;AAE7F,MAAM,WAAW,qBAAqB;IACpC;8DAC0D;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB;;wDAEoD;IACpD,KAAK,CAAC,EAAE,iBAAiB,CAAA;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE;IACL,WAAW,IAAI;QAAE,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IAC/F,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C,EACD,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EACnC,OAAO,GAAE,qBAA0B,GAClC,MAAM,IAAI,CA0CZ;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,yBAAyB,EACrC,QAAQ,EAAE,wBAAwB,GACjC,IAAI,CA2CN"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styles for the T34 sub-client status parts — the title-row connection
|
|
3
|
+
* icon's states and the composer's readonly banner. Injected as one
|
|
4
|
+
* `<style data-plugin="dsh-zen-remote-remote-status">` tag BEFORE apply's
|
|
5
|
+
* desktop gate (a desktop app in the client role has remote sessions too; on
|
|
6
|
+
* a host the parts render nothing for local sessions, so the desktop stays
|
|
7
|
+
* pixel-identical).
|
|
8
|
+
*
|
|
9
|
+
* T34-fix: the input itself is disabled through the HOST's component
|
|
10
|
+
* capability — `ctx.conversation.blocks.set(sessionId, { reason })`, the
|
|
11
|
+
* composer-block contract — not through any CSS override; what remains here
|
|
12
|
+
* is scoped under the parts' own attributes and can reach nothing but them.
|
|
13
|
+
*/
|
|
14
|
+
export declare const REMOTE_STATUS_CSS = "\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n padding: 0;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"]:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"][data-state=\"online\"] {\n color: var(--dsw-alias-state-business-primary, #4f6ef7);\n}\n/* offline / revoked / unpaired: the default grey is the state, dimmed a\n little so a dead or unpaired link reads instantly */\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"][data-state=\"offline\"],\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"][data-state=\"revoked\"],\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"][data-state=\"unpaired\"] {\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\nbutton.zr-remote-status[data-zen-remote=\"remote-status\"][data-state=\"mismatch\"] {\n color: var(--dsw-alias-state-warning-primary, #d97706);\n}\n\n/* The composer banner: a dock entry, so on desktop it is one full-width row\n of the composer column (the slot anchor is display:contents and the\n composer column is a flex column \u2014 the item stretches to the column\n width WITHOUT an explicit width, which would stack with the side margins\n and overflow the input column, T34-fix). Styled after the host's own\n composer notice, standalone. */\n.zr-remote-banner[data-zen-remote=\"remote-banner\"] {\n box-sizing: border-box;\n margin: 0 max(16px, var(--dsh-composer-side-clearance, 16px));\n border-radius: var(--dsw-radius-md, 8px);\n background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));\n color: var(--dsw-alias-label-secondary, inherit);\n padding: 6px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n";
|
|
15
|
+
//# sourceMappingURL=remote-status-css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-status-css.d.ts","sourceRoot":"","sources":["../../../src/client/remote-status-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,iBAAiB,y+DAiD7B,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration for the T34 sub-client status parts — the work that must run
|
|
3
|
+
* BEFORE apply's desktop gate (a desktop app in the client role has remote
|
|
4
|
+
* sessions too), extracted so the Node-side desktop-gate test can drive it
|
|
5
|
+
* against a fake ctx (the components are .tsx; they arrive as parameters,
|
|
6
|
+
* keeping this module JSX-free and importable under Node's type stripping —
|
|
7
|
+
* the same trick register-settings.ts / remote-share-register.ts use).
|
|
8
|
+
*
|
|
9
|
+
* Registers the title-row connection icon on
|
|
10
|
+
* `conversation.session.header.actions` (order 26, past the T33b share icon
|
|
11
|
+
* at 25 so the two never tie) and the composer banner on
|
|
12
|
+
* `conversation.input.dock` (order 15, between the official todo panel at 0
|
|
13
|
+
* and the queue dock at 20), plus the one stylesheet both surfaces need.
|
|
14
|
+
*
|
|
15
|
+
* The banner's disable rides the HOST's composer-block contract (T34-fix):
|
|
16
|
+
* the inject face hands the component a per-session `setComposerBlock`
|
|
17
|
+
* binding over `ctx.conversation.blocks` (dsh-client-ui-conversation's
|
|
18
|
+
* `ComposerBlocks`, resolved lazily at call time — the row context may still
|
|
19
|
+
* be assembling when this registration runs, and the composer that consumes
|
|
20
|
+
* the block is the conversation plugin's own UI, so the service is there by
|
|
21
|
+
* the time a banner can stand). A composition without the service degrades
|
|
22
|
+
* to a no-op binding: the banner still renders, the disable is simply absent.
|
|
23
|
+
*
|
|
24
|
+
* No role wiring here, unlike the T33b parts: the store only polls while a
|
|
25
|
+
* part is SUBSCRIBED, and both parts gate the subscription itself on the
|
|
26
|
+
* virtual id (remote-status.ts's subscribeIfVirtual — a local session never
|
|
27
|
+
* opens one) — so a host page never polls, without needing the settings
|
|
28
|
+
* role to tell it apart.
|
|
29
|
+
*/
|
|
30
|
+
import type { ReactNode } from 'react';
|
|
31
|
+
import type { ClientContext } from './compat/types.ts';
|
|
32
|
+
import type { RemoteStatusIconProps } from './RemoteStatusIcon.tsx';
|
|
33
|
+
import type { RemoteComposerBannerProps } from './RemoteComposerBanner.tsx';
|
|
34
|
+
/** The icon component (a .tsx factory result; parameter for Node). */
|
|
35
|
+
export type RemoteStatusIconComponent = (props: RemoteStatusIconProps) => ReactNode;
|
|
36
|
+
/** The composer banner component (a .tsx factory result; parameter for Node). */
|
|
37
|
+
export type RemoteComposerBannerComponent = (props: RemoteComposerBannerProps) => ReactNode;
|
|
38
|
+
/**
|
|
39
|
+
* Register the stylesheet and the two status parts. Gate-independent by
|
|
40
|
+
* design — the caller (apply) places this before its desktop gate.
|
|
41
|
+
* @param ctx - client root context.
|
|
42
|
+
* @param icon - the title-row connection icon component.
|
|
43
|
+
* @param banner - the composer banner component.
|
|
44
|
+
*/
|
|
45
|
+
export declare function registerRemoteStatusUi(ctx: ClientContext, icon: RemoteStatusIconComponent, banner: RemoteComposerBannerComponent): void;
|
|
46
|
+
//# sourceMappingURL=remote-status-register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-status-register.d.ts","sourceRoot":"","sources":["../../../src/client/remote-status-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,mBAAmB,CAAA;AAIjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAE3E,sEAAsE;AACtE,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAA;AACnF,iFAAiF;AACjF,MAAM,MAAM,6BAA6B,GAAG,CAAC,KAAK,EAAE,yBAAyB,KAAK,SAAS,CAAA;AAuB3F;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,6BAA6B,GACpC,IAAI,CAgCN"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The dsh-zen-remote plugin row's settings block on the Plugins manager
|
|
3
|
+
* (T15 + T15-fix + T16 + T17): the staged row fields inside the official
|
|
4
|
+
* settings-form frame ending in its one save control, and BELOW the form —
|
|
5
|
+
* outside it, so they still render when the configuration namespace is not
|
|
6
|
+
* served — the instant-operation areas. Which areas render follows the row's
|
|
7
|
+
* SAVED role, read from the configForms snapshot's row document — never from
|
|
8
|
+
* a status body (T16-fix 3); when that document carries no role at all (the
|
|
9
|
+
* value lives only in `lan-gate.config.json`), the page probes the
|
|
10
|
+
* lightweight client-config route (both roles register it) for the EFFECTIVE
|
|
11
|
+
* role (T17). A host shows gateway status, pairing, device list and the push
|
|
12
|
+
* probe (POSTing the same-origin admin routes and re-reading `admin/status`);
|
|
13
|
+
* a client shows the server connection form, the connection status line and
|
|
14
|
+
* unpairing (against `client/status`, T16) and NEVER polls `admin/*` — on a
|
|
15
|
+
* client deployment those routes do not exist, and a stale kept body would
|
|
16
|
+
* pin the page to the old role. The poll choice waits out the snapshot's
|
|
17
|
+
* loading state — and the probe, when the row cannot answer — for the same
|
|
18
|
+
* reason. Only field edits stage and save through `ZenRemoteSettingsForm`.
|
|
19
|
+
*
|
|
20
|
+
* Status refreshes never clear what is already on screen (T15-fix 1): a
|
|
21
|
+
* failed refresh keeps the last ready data and says so in a banner — only a
|
|
22
|
+
* failed FIRST load enters the error state, because saving a restart-required
|
|
23
|
+
* field reloads the plugin row (T17) and the first post-save refresh can land
|
|
24
|
+
* inside that reload window (further pulls follow at 1.5s, and for a
|
|
25
|
+
* row-reloading save at 3s and 6s, T17b). Every status request carries a
|
|
26
|
+
* latest-wins ticket (T15-fix 4), so an earlier request that answers late
|
|
27
|
+
* cannot overwrite newer data.
|
|
28
|
+
*
|
|
29
|
+
* Opened through the gateway (`viaGateway`, i.e. on a phone or another
|
|
30
|
+
* browser) the server-local buttons disable and a notice says so — and until
|
|
31
|
+
* one status load answers from the server itself, they count as remote. The
|
|
32
|
+
* summary view renders its one-liner alone and never fetches a thing.
|
|
33
|
+
*/
|
|
34
|
+
import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
35
|
+
import type { ZenRemoteSettingsForm } from '../../client-data/settings-form.ts';
|
|
36
|
+
import { NS } from '../locales.ts';
|
|
37
|
+
import type { SharesStore } from '../../client-data/shares.ts';
|
|
38
|
+
export interface SettingsSectionProps extends PropsRuntime<'plugins.row.config'>, PropsLocale<typeof NS> {
|
|
39
|
+
/** The staged configuration form (injected share). */
|
|
40
|
+
config: ZenRemoteSettingsForm;
|
|
41
|
+
/** The shared shares store (injected share, T33b) — the same singleton the
|
|
42
|
+
* title-row icon and the session menu read. */
|
|
43
|
+
shares: SharesStore;
|
|
44
|
+
}
|
|
45
|
+
export declare function SettingsSection(props: SettingsSectionProps): import("react").JSX.Element;
|
|
46
|
+
//# sourceMappingURL=SettingsSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsSection.d.ts","sourceRoot":"","sources":["../../../../src/client/settings/SettingsSection.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAqBjF,OAAO,KAAK,EAUV,qBAAqB,EACtB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAElC,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9E,MAAM,WAAW,oBAAqB,SAAQ,YAAY,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;IACtG,sDAAsD;IACtD,MAAM,EAAE,qBAAqB,CAAA;IAC7B;mDAC+C;IAC/C,MAAM,EAAE,WAAW,CAAA;CACpB;AA0DD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAW1D"}
|