@deepseek-ai/dsh-client-ui-settings-general 0.0.1-rc.5 → 0.1.0-rc.2
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/LICENSE +17 -24
- package/README.i18n.yaml +2 -2
- package/README.md +3 -3
- package/README.zh.md +3 -3
- package/lib/client.js +48 -351
- package/lib/index.js +5 -37
- package/lib/invariant.js +1 -1
- package/lib/types/client/index.d.ts +0 -2
- package/lib/types/client/locales.d.ts +1 -14
- package/lib/types/index.d.ts +0 -1
- package/package.json +27 -27
- package/lib/types/client/WelcomeNotice.d.ts +0 -15
- package/lib/types/client/welcome-store.d.ts +0 -38
- package/lib/types/onboarding-copy.d.ts +0 -25
package/LICENSE
CHANGED
|
@@ -1,28 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026
|
|
3
|
+
Copyright (c) 2026 DeepSeek
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/client/ui-settings-general/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: c59b77617cfd5848553ba340e97bafe37b7b2a2f
|
|
6
|
+
README.zh.md: ea4896284b677a7b430cceb949b53aa6e3a5a242
|
package/README.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
English | [中文](README.zh.md)
|
|
4
4
|
|
|
5
|
-
Settings shell, ownerless
|
|
5
|
+
Settings shell, ownerless copy, and durable product-onboarding namespace. It occupies `sidebar.settings` with the trigger chrome and modal settings panel, projects the `settings.section` ledger into the navigation and the `settings.onboarding` ledger into one mounted step at a time, and registers everything on the Settings pages that belongs to no single feature — the trigger/header/close chrome content, the local configuration-file action, the General section and its `settings.general.item` slot, and the `settings` dictionaries. The slot types it renders into belong to ui-settings, the settings domain base; only the shell's own contract types live here, because they reference ui-sidebar's slot type and the base layer must depend on no `ui-*` package. Feature-owned rows (Permission, Language, Appearance), sections (Models), and conditional onboarding steps stay with their feature packages.
|
|
6
6
|
|
|
7
|
-
The shell ships no copy of its own — all text arrives from registrants. Nav labels may be locale-following thunks, so the nav projection resolves them through `resolveSlotLabel` and re-renders on the section ledger bump or the locale revision (an optional `ctx.get('locale')` read; no hard locale dependency). The onboarding ledger projects in ascending order and mounts exactly one
|
|
7
|
+
The shell ships no onboarding copy of its own — all text arrives from registrants. Nav labels may be locale-following thunks, so the nav projection resolves them through `resolveSlotLabel` and re-renders on the section ledger bump or the locale revision (an optional `ctx.get('locale')` read; no hard locale dependency). The onboarding ledger projects in ascending order and mounts exactly one step at a time. Visible steps own their dialog chrome and app-root `inert` lifecycle; a mounted step still resolving private facts renders null, so nothing paints or blocks while it decides. The active registrant receives its id, `complete()`, and an `openSection(id)` callback; completing or skipping transfers ownership to the next entry. Registrants own durable completion, capability readiness, copy, mutations, and their visible wrapper, so independently registered flows cannot stack and the shell does not become a second configuration fact source.
|
|
8
8
|
|
|
9
9
|
A loopback browser loads the provider's `hasDocument` capability through `settings.describe` and renders **Open configuration file** only when the Host confirms that a provider-owned local document can be prepared. The action sends the pathless, loopback-only `settings.openDocument` request; the Host resolves the provider path again, materializes an absent document, and hands it to a native text editor (`open -t` on macOS, bypassing a browser file association; the desktop file association on Linux and Windows; Windows association after `wslpath -w` translation on WSL). Open failures keep the action available and render a localized error. Reopening the dialog or reconnecting refreshes availability after a transient read failure or Host topology change. Remote browsers never register the action and never issue the privileged settings read.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
The Host half registers `ui-onboarding` in the user-settings seam. The welcome step contributed by `ui-settings-models` reads and writes its `welcomeNoticeVersion` through the existing public settings boundary; the shell itself remains policy-free.
|
|
12
12
|
|
|
13
13
|
## Model Experience
|
|
14
14
|
|
package/README.zh.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | 中文
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
设置外壳、无特定功能归属文案与持久化产品引导 namespace。它以触发控件和模态设置面板占用 `sidebar.settings`,把 `settings.section` 账本投影成导航、把 `settings.onboarding` 账本投影成每次只挂载一个步骤的引导流程,并在设置页面上注册所有不属于单一功能的内容:触发器、标题栏与关闭控件内容、本地配置文件操作,「通用」分区及其 `settings.general.item` slot,以及 `settings` 字典。它渲染进的那些 slot 类型归 ui-settings——设置领域底座——所有;只有外壳自身的契约类型放在这里,因为它们引用 ui-sidebar 的 slot 类型,而底座不得依赖任何 `ui-*` 包。归具体功能所有的行(「权限」、「语言」、「外观」)、分区(「模型」)和条件式首次使用引导步骤仍由各自的功能包提供。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
外壳不自带引导文案:所有文本都来自注册方。导航 label 可以是跟随语言的 thunk,因此导航投影经 `resolveSlotLabel` 解析,并在分区账本更新或 locale revision 变化时重新渲染(`ctx.get('locale')` 可选读取,无硬 locale 依赖)。首次使用引导记录按升序投影,每次只挂载一个步骤;可见步骤自行持有弹窗框架和应用根节点 `inert` 生命周期。已挂载但仍在判定私有事实的步骤渲染 null,因此判定期间不绘制也不阻塞任何内容。当前注册方会收到该条目的 id、`complete()` 和 `openSection(id)` 回调;完成或跳过当前步骤后,所有权转交给下一项。持久化完成状态、能力就绪状态、文案、变更操作以及可见包装均由注册方持有,因此独立注册的流程无法堆叠,外壳也不会成为第二个配置事实来源。
|
|
8
8
|
|
|
9
9
|
回环浏览器通过 `settings.describe` 加载提供方的 `hasDocument` 能力,且只有在 Host 确认可准备好一份由提供方持有的本地文档时才渲染**打开配置文件**。该操作发送无路径参数且仅限回环访问的 `settings.openDocument` 请求;Host 会再次解析提供方路径、在文档缺失时将其创建出来,并交给原生文本编辑器(macOS 上使用 `open -t`,绕过浏览器文件关联;Linux 和 Windows 上使用桌面文件关联;WSL 上经 `wslpath -w` 转换后使用 Windows 文件关联)。打开失败时该操作仍可使用,并渲染本地化错误。临时读取失败或 Host 拓扑变化后,重新打开对话框或重新连接会刷新可用性。远程浏览器从不注册该操作,也从不发起这项特权设置读取。
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
宿主端在用户设置 seam 中注册 `ui-onboarding`。`ui-settings-models` 提供的欢迎步骤通过既有公开 settings 边界读写其中的 `welcomeNoticeVersion`;外壳本身仍不持有产品策略。
|
|
12
12
|
|
|
13
13
|
## 模型体验
|
|
14
14
|
|
package/lib/client.js
CHANGED
|
@@ -26,35 +26,35 @@ window.__ModuleLoader__.load({
|
|
|
26
26
|
}
|
|
27
27
|
//#endregion
|
|
28
28
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-settings-general/src/client/SettingsRoot.module.css.mjs
|
|
29
|
-
const css$
|
|
30
|
-
const tagId$
|
|
31
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$
|
|
29
|
+
const css$3 = ".VOzbGW_trigger{box-sizing:border-box;cursor:pointer;width:calc(100% + 8px);height:34px;color:var(--dsw-alias-label-primary);background:0 0;border:none;border-radius:12px;flex:none;align-items:center;gap:8px;margin:4px -4px;padding:6px 2px 6px 10px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.VOzbGW_trigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.VOzbGW_trigger.VOzbGW_rail{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;margin:8px 0 10px;padding:0}.VOzbGW_triggerLabel{white-space:nowrap;overflow:hidden}.VOzbGW_overlay{z-index:1000;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.VOzbGW_mask{background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);position:absolute;inset:0}.VOzbGW_panel{z-index:1;background:var(--dsw-alias-bg-layer-2);width:800px;max-width:calc(100vw - 48px);height:min(800px,100vh - 48px);box-shadow:var(--dsw-shadow-lv3);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:24px;display:flex;position:relative;overflow:hidden}.VOzbGW_nav{box-sizing:border-box;flex-direction:column;flex:none;gap:18px;width:188px;padding:22px 12px 0;display:flex}.VOzbGW_navTitle{color:var(--dsw-alias-label-primary);padding:0 12px;font-size:16px;font-weight:500;line-height:24px}.VOzbGW_navList{flex-direction:column;gap:4px;display:flex}.VOzbGW_navCell{box-sizing:border-box;cursor:pointer;height:40px;color:var(--dsw-alias-label-primary);text-align:left;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:9px 16px 9px 12px;font-family:inherit;font-size:14px;font-weight:400;line-height:22px;display:flex}.VOzbGW_navCell:hover{background:var(--dsw-specific-sidebar-nav-item-hover)}.VOzbGW_navCell.VOzbGW_active{background:var(--dsw-specific-sidebar-nav-item-active)}.VOzbGW_navIcon{flex:none}.VOzbGW_navLabel{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.VOzbGW_content{flex-direction:column;flex:1;min-width:0;display:flex}.VOzbGW_header{box-sizing:border-box;flex:none;justify-content:space-between;align-items:flex-start;gap:8px;height:54px;padding:20px 14px 8px 10px;display:flex}.VOzbGW_actions{justify-content:flex-end;align-items:center;gap:8px;min-width:0;margin-left:auto;display:flex}.VOzbGW_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-primary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.VOzbGW_close:hover{background:var(--dsw-alias-interactive-bg-hover)}.VOzbGW_options{flex:1;min-height:0;padding:0 24px 24px;overflow-y:auto}.VOzbGW_hiddenLabel{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
|
|
30
|
+
const tagId$3 = "@deepseek-ai/dsh-client-ui-settings-general/SettingsRoot.module.css";
|
|
31
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
|
|
32
32
|
const tag = document.createElement("style");
|
|
33
33
|
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-settings-general";
|
|
34
|
-
tag.dataset.pluginCss = tagId$
|
|
35
|
-
tag.textContent = css$
|
|
34
|
+
tag.dataset.pluginCss = tagId$3;
|
|
35
|
+
tag.textContent = css$3;
|
|
36
36
|
document.head.appendChild(tag);
|
|
37
37
|
}
|
|
38
38
|
var SettingsRoot_module_css_default = {
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"panel": "VOzbGW_panel",
|
|
39
|
+
"triggerLabel": "VOzbGW_triggerLabel",
|
|
40
|
+
"options": "VOzbGW_options",
|
|
41
|
+
"actions": "VOzbGW_actions",
|
|
43
42
|
"navList": "VOzbGW_navList",
|
|
44
|
-
"
|
|
45
|
-
"trigger": "VOzbGW_trigger",
|
|
46
|
-
"navTitle": "VOzbGW_navTitle",
|
|
47
|
-
"active": "VOzbGW_active",
|
|
43
|
+
"content": "VOzbGW_content",
|
|
48
44
|
"overlay": "VOzbGW_overlay",
|
|
49
|
-
"
|
|
50
|
-
"actions": "VOzbGW_actions",
|
|
51
|
-
"options": "VOzbGW_options",
|
|
52
|
-
"triggerLabel": "VOzbGW_triggerLabel",
|
|
45
|
+
"panel": "VOzbGW_panel",
|
|
53
46
|
"navCell": "VOzbGW_navCell",
|
|
54
47
|
"header": "VOzbGW_header",
|
|
55
|
-
"content": "VOzbGW_content",
|
|
56
48
|
"hiddenLabel": "VOzbGW_hiddenLabel",
|
|
57
|
-
"
|
|
49
|
+
"navTitle": "VOzbGW_navTitle",
|
|
50
|
+
"nav": "VOzbGW_nav",
|
|
51
|
+
"trigger": "VOzbGW_trigger",
|
|
52
|
+
"navLabel": "VOzbGW_navLabel",
|
|
53
|
+
"mask": "VOzbGW_mask",
|
|
54
|
+
"navIcon": "VOzbGW_navIcon",
|
|
55
|
+
"active": "VOzbGW_active",
|
|
56
|
+
"close": "VOzbGW_close",
|
|
57
|
+
"rail": "VOzbGW_rail"
|
|
58
58
|
};
|
|
59
59
|
//#endregion
|
|
60
60
|
//#region lib/types/client/SettingsRoot.js
|
|
@@ -67,9 +67,8 @@ window.__ModuleLoader__.load({
|
|
|
67
67
|
* aria-labelledby the title node; close: visually-hidden slot text). Modal
|
|
68
68
|
* open state and the active section id are component-local viewing state;
|
|
69
69
|
* the onboarding coordinator mounts exactly one ordered registrant while the
|
|
70
|
-
* sessions-derived empty-Hero fact is active
|
|
71
|
-
*
|
|
72
|
-
* paints nothing here.
|
|
70
|
+
* sessions-derived empty-Hero fact is active. Visible dialog chrome belongs
|
|
71
|
+
* to the step, so a mounted-but-deciding step paints nothing here.
|
|
73
72
|
*/
|
|
74
73
|
/** Nav glyph by section id; unknown ids fall back to the settings gear. */
|
|
75
74
|
function navIcon(id) {
|
|
@@ -230,13 +229,13 @@ window.__ModuleLoader__.load({
|
|
|
230
229
|
}
|
|
231
230
|
//#endregion
|
|
232
231
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-settings-general/src/client/chrome.module.css.mjs
|
|
233
|
-
const css$
|
|
234
|
-
const tagId$
|
|
235
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$
|
|
232
|
+
const css$2 = ".UQsH_q_triggerLabel{white-space:nowrap;overflow:hidden}";
|
|
233
|
+
const tagId$2 = "@deepseek-ai/dsh-client-ui-settings-general/chrome.module.css";
|
|
234
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
|
|
236
235
|
const tag = document.createElement("style");
|
|
237
236
|
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-settings-general";
|
|
238
|
-
tag.dataset.pluginCss = tagId$
|
|
239
|
-
tag.textContent = css$
|
|
237
|
+
tag.dataset.pluginCss = tagId$2;
|
|
238
|
+
tag.textContent = css$2;
|
|
240
239
|
document.head.appendChild(tag);
|
|
241
240
|
}
|
|
242
241
|
var chrome_module_css_default = { "triggerLabel": "UQsH_q_triggerLabel" };
|
|
@@ -277,13 +276,13 @@ window.__ModuleLoader__.load({
|
|
|
277
276
|
}
|
|
278
277
|
//#endregion
|
|
279
278
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-settings-general/src/client/GeneralSection.module.css.mjs
|
|
280
|
-
const css$
|
|
281
|
-
const tagId$
|
|
282
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$
|
|
279
|
+
const css$1 = "._WvWnq_section{flex-direction:column;width:100%;display:flex}._WvWnq_section>[data-slot=\"settings.general.item\"]>:last-child{border-bottom:none}";
|
|
280
|
+
const tagId$1 = "@deepseek-ai/dsh-client-ui-settings-general/GeneralSection.module.css";
|
|
281
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
283
282
|
const tag = document.createElement("style");
|
|
284
283
|
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-settings-general";
|
|
285
|
-
tag.dataset.pluginCss = tagId$
|
|
286
|
-
tag.textContent = css$
|
|
284
|
+
tag.dataset.pluginCss = tagId$1;
|
|
285
|
+
tag.textContent = css$1;
|
|
287
286
|
document.head.appendChild(tag);
|
|
288
287
|
}
|
|
289
288
|
var GeneralSection_module_css_default = { "section": "_WvWnq_section" };
|
|
@@ -302,18 +301,18 @@ window.__ModuleLoader__.load({
|
|
|
302
301
|
}
|
|
303
302
|
//#endregion
|
|
304
303
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-settings-general/src/client/SettingsDocumentAction.module.css.mjs
|
|
305
|
-
const css
|
|
306
|
-
const tagId
|
|
307
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId
|
|
304
|
+
const css = ".me01iq_action{align-items:center;gap:8px;min-width:0;display:flex}.me01iq_error{max-width:180px;color:var(--dsw-alias-state-error-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}";
|
|
305
|
+
const tagId = "@deepseek-ai/dsh-client-ui-settings-general/SettingsDocumentAction.module.css";
|
|
306
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
308
307
|
const tag = document.createElement("style");
|
|
309
308
|
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-settings-general";
|
|
310
|
-
tag.dataset.pluginCss = tagId
|
|
311
|
-
tag.textContent = css
|
|
309
|
+
tag.dataset.pluginCss = tagId;
|
|
310
|
+
tag.textContent = css;
|
|
312
311
|
document.head.appendChild(tag);
|
|
313
312
|
}
|
|
314
313
|
var SettingsDocumentAction_module_css_default = {
|
|
315
|
-
"
|
|
316
|
-
"
|
|
314
|
+
"error": "me01iq_error",
|
|
315
|
+
"action": "me01iq_action"
|
|
317
316
|
};
|
|
318
317
|
//#endregion
|
|
319
318
|
//#region lib/types/client/SettingsDocumentAction.js
|
|
@@ -349,7 +348,7 @@ window.__ModuleLoader__.load({
|
|
|
349
348
|
//#endregion
|
|
350
349
|
//#region lib/types/client/settings-document-store.js
|
|
351
350
|
/** State owner for the optional local settings-document action. */
|
|
352
|
-
function messageOf
|
|
351
|
+
function messageOf(error) {
|
|
353
352
|
return error instanceof Error ? error.message : String(error);
|
|
354
353
|
}
|
|
355
354
|
/** Loads local-document availability and invokes the pathless Host-owned open operation. */
|
|
@@ -396,7 +395,7 @@ window.__ModuleLoader__.load({
|
|
|
396
395
|
if (generation !== this.generation) return;
|
|
397
396
|
this.store.update((state) => {
|
|
398
397
|
state.status = "unavailable";
|
|
399
|
-
state.error = messageOf
|
|
398
|
+
state.error = messageOf(error);
|
|
400
399
|
});
|
|
401
400
|
}
|
|
402
401
|
}
|
|
@@ -416,7 +415,7 @@ window.__ModuleLoader__.load({
|
|
|
416
415
|
if (!response.result.ok) throw new Error(response.result.error.message);
|
|
417
416
|
} catch (error) {
|
|
418
417
|
this.store.update((state) => {
|
|
419
|
-
state.error = messageOf
|
|
418
|
+
state.error = messageOf(error);
|
|
420
419
|
});
|
|
421
420
|
} finally {
|
|
422
421
|
this.store.update((state) => {
|
|
@@ -434,270 +433,8 @@ window.__ModuleLoader__.load({
|
|
|
434
433
|
controller.load();
|
|
435
434
|
}
|
|
436
435
|
//#endregion
|
|
437
|
-
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-settings-general/src/client/WelcomeNotice.module.css.mjs
|
|
438
|
-
const css = ".k2cPoG_page{z-index:1;box-sizing:border-box;width:min(640px,100vw - 64px);max-height:100vh;color:var(--dsw-alias-label-primary);--welcome-ease-out:cubic-bezier(.23, 1, .32, 1);padding:clamp(64px,9vh,104px) 0 40px;position:relative;overflow-y:auto}.k2cPoG_brand{color:var(--dsw-alias-label-primary);align-items:center;margin-bottom:42px;display:flex}.k2cPoG_title{letter-spacing:-.02em;outline:none;margin:0;font-size:28px;font-weight:600;line-height:36px}.k2cPoG_opening,.k2cPoG_reflection,.k2cPoG_feedback,.k2cPoG_error{margin:0}.k2cPoG_opening{margin-top:30px}.k2cPoG_reflection{margin-top:36px;padding:0}.k2cPoG_feedback{margin-top:30px}.k2cPoG_opening,.k2cPoG_reflection,.k2cPoG_feedback{color:var(--dsw-alias-label-secondary);font-size:16px;line-height:28px}.k2cPoG_feedback strong{color:inherit;font-weight:500}.k2cPoG_footer{justify-content:flex-end;margin-top:32px;display:flex}.k2cPoG_error{color:var(--dsw-alias-state-error-primary);margin-top:20px;font-size:14px;line-height:22px}.k2cPoG_primary{min-width:120px;transition:transform .14s var(--welcome-ease-out)}.k2cPoG_primary:active:not(:disabled){transform:scale(.97)}.k2cPoG_brand,.k2cPoG_title,.k2cPoG_opening,.k2cPoG_reflection,.k2cPoG_feedback,.k2cPoG_footer{animation:k2cPoG_welcome-enter .28s var(--welcome-ease-out) both}.k2cPoG_title{animation-delay:40ms}.k2cPoG_opening{animation-delay:80ms}.k2cPoG_reflection{animation-delay:.12s}.k2cPoG_feedback{animation-delay:.16s}.k2cPoG_footer{animation-delay:.2s}@keyframes k2cPoG_welcome-enter{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.k2cPoG_brand,.k2cPoG_title,.k2cPoG_opening,.k2cPoG_reflection,.k2cPoG_feedback,.k2cPoG_footer{animation:none}.k2cPoG_primary{transition:none}}@media (width<=560px){.k2cPoG_page{width:calc(100vw - 40px);padding-top:38px}.k2cPoG_brand{margin-bottom:30px}.k2cPoG_opening{margin-top:24px}.k2cPoG_reflection,.k2cPoG_feedback{margin-top:28px}.k2cPoG_footer{margin-top:30px}.k2cPoG_primary{width:100%}}";
|
|
439
|
-
const tagId = "@deepseek-ai/dsh-client-ui-settings-general/WelcomeNotice.module.css";
|
|
440
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
441
|
-
const tag = document.createElement("style");
|
|
442
|
-
tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-settings-general";
|
|
443
|
-
tag.dataset.pluginCss = tagId;
|
|
444
|
-
tag.textContent = css;
|
|
445
|
-
document.head.appendChild(tag);
|
|
446
|
-
}
|
|
447
|
-
var WelcomeNotice_module_css_default = {
|
|
448
|
-
"opening": "k2cPoG_opening",
|
|
449
|
-
"page": "k2cPoG_page",
|
|
450
|
-
"welcome-enter": "k2cPoG_welcome-enter",
|
|
451
|
-
"brand": "k2cPoG_brand",
|
|
452
|
-
"feedback": "k2cPoG_feedback",
|
|
453
|
-
"primary": "k2cPoG_primary",
|
|
454
|
-
"reflection": "k2cPoG_reflection",
|
|
455
|
-
"error": "k2cPoG_error",
|
|
456
|
-
"footer": "k2cPoG_footer",
|
|
457
|
-
"title": "k2cPoG_title"
|
|
458
|
-
};
|
|
459
|
-
//#endregion
|
|
460
|
-
//#region lib/types/client/WelcomeNotice.js
|
|
461
|
-
/** Product-wide, versioned first-run welcome step. */
|
|
462
|
-
function emphasizedFeedback(paragraph, emphasis) {
|
|
463
|
-
const index = paragraph.indexOf(emphasis);
|
|
464
|
-
/* v8 ignore next -- both locale values derive from one owner object that contains the emphasis */
|
|
465
|
-
if (index < 0) return paragraph;
|
|
466
|
-
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
467
|
-
paragraph.slice(0, index),
|
|
468
|
-
(0, react_jsx_runtime.jsx)("strong", { children: emphasis }),
|
|
469
|
-
paragraph.slice(index + emphasis.length)
|
|
470
|
-
] });
|
|
471
|
-
}
|
|
472
|
-
/** Render the mandatory notice until its current version is acknowledged. */
|
|
473
|
-
function WelcomeNotice(props) {
|
|
474
|
-
const { complete, controller, useSnapshot, t } = props;
|
|
475
|
-
const state = useSnapshot((snapshot) => snapshot);
|
|
476
|
-
const finished = (0, react.useRef)(false);
|
|
477
|
-
const titleRef = (0, react.useRef)(null);
|
|
478
|
-
const finish = (0, react.useCallback)(() => {
|
|
479
|
-
if (finished.current) return;
|
|
480
|
-
finished.current = true;
|
|
481
|
-
complete();
|
|
482
|
-
}, [complete]);
|
|
483
|
-
(0, react.useEffect)(() => {
|
|
484
|
-
if (state.status === "idle") controller.load();
|
|
485
|
-
}, [controller, state.status]);
|
|
486
|
-
(0, react.useEffect)(() => {
|
|
487
|
-
if (state.acknowledged) finish();
|
|
488
|
-
}, [finish, state.acknowledged]);
|
|
489
|
-
(0, react.useEffect)(() => {
|
|
490
|
-
if (state.status === "ready" && !state.acknowledged) titleRef.current?.focus();
|
|
491
|
-
}, [state.acknowledged, state.status]);
|
|
492
|
-
if (state.status === "idle" || state.status === "loading" || state.acknowledged) return null;
|
|
493
|
-
const acknowledge = async () => {
|
|
494
|
-
if (await controller.acknowledge()) finish();
|
|
495
|
-
};
|
|
496
|
-
return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.OnboardingSurface, { children: (0, react_jsx_runtime.jsxs)("section", {
|
|
497
|
-
className: WelcomeNotice_module_css_default.page,
|
|
498
|
-
role: "region",
|
|
499
|
-
"aria-labelledby": "welcome-notice-title",
|
|
500
|
-
children: [
|
|
501
|
-
(0, react_jsx_runtime.jsx)("div", {
|
|
502
|
-
className: WelcomeNotice_module_css_default.brand,
|
|
503
|
-
"aria-hidden": "true",
|
|
504
|
-
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.BrandWordmark, { size: 24 })
|
|
505
|
-
}),
|
|
506
|
-
(0, react_jsx_runtime.jsx)("h2", {
|
|
507
|
-
ref: titleRef,
|
|
508
|
-
id: "welcome-notice-title",
|
|
509
|
-
className: WelcomeNotice_module_css_default.title,
|
|
510
|
-
tabIndex: -1,
|
|
511
|
-
children: t("welcome.title")
|
|
512
|
-
}),
|
|
513
|
-
(0, react_jsx_runtime.jsx)("p", {
|
|
514
|
-
className: WelcomeNotice_module_css_default.opening,
|
|
515
|
-
children: t("welcome.paragraph.0")
|
|
516
|
-
}),
|
|
517
|
-
(0, react_jsx_runtime.jsx)("blockquote", {
|
|
518
|
-
className: WelcomeNotice_module_css_default.reflection,
|
|
519
|
-
children: t("welcome.paragraph.1")
|
|
520
|
-
}),
|
|
521
|
-
(0, react_jsx_runtime.jsx)("p", {
|
|
522
|
-
className: WelcomeNotice_module_css_default.feedback,
|
|
523
|
-
children: emphasizedFeedback(t("welcome.paragraph.2"), t("welcome.feedbackEmphasis"))
|
|
524
|
-
}),
|
|
525
|
-
state.error === null ? null : (0, react_jsx_runtime.jsx)("p", {
|
|
526
|
-
className: WelcomeNotice_module_css_default.error,
|
|
527
|
-
role: "alert",
|
|
528
|
-
children: t("welcome.error")
|
|
529
|
-
}),
|
|
530
|
-
(0, react_jsx_runtime.jsx)("div", {
|
|
531
|
-
className: WelcomeNotice_module_css_default.footer,
|
|
532
|
-
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
533
|
-
variant: "primary",
|
|
534
|
-
className: WelcomeNotice_module_css_default.primary,
|
|
535
|
-
disabled: state.status === "saving",
|
|
536
|
-
onClick: () => {
|
|
537
|
-
acknowledge();
|
|
538
|
-
},
|
|
539
|
-
children: t("welcome.continue")
|
|
540
|
-
})
|
|
541
|
-
})
|
|
542
|
-
]
|
|
543
|
-
}) });
|
|
544
|
-
}
|
|
545
|
-
//#endregion
|
|
546
|
-
//#region lib/types/onboarding-copy.js
|
|
547
|
-
/** Durable settings namespace for product-wide GUI onboarding facts. */
|
|
548
|
-
const WELCOME_NOTICE_SETTINGS_NAMESPACE = "ui-onboarding";
|
|
549
|
-
/** Field storing the last welcome notice version the user acknowledged. */
|
|
550
|
-
const WELCOME_NOTICE_ACK_FIELD = "welcomeNoticeVersion";
|
|
551
|
-
/**
|
|
552
|
-
* Bump only when the notice changes materially and every user should see it
|
|
553
|
-
* again. The acknowledgement is compared for exact equality.
|
|
554
|
-
*/
|
|
555
|
-
const WELCOME_NOTICE_VERSION = "2026-08-11.1";
|
|
556
|
-
/** The complete editable welcome notice in both supported GUI locales. */
|
|
557
|
-
const WELCOME_NOTICE_COPY = {
|
|
558
|
-
zh: {
|
|
559
|
-
title: "内测声明",
|
|
560
|
-
paragraphs: [
|
|
561
|
-
"感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。",
|
|
562
|
-
"“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。",
|
|
563
|
-
"内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。"
|
|
564
|
-
],
|
|
565
|
-
feedbackEmphasis: "如果您有任何反馈与建议,请在企业微信群中留言告诉我们",
|
|
566
|
-
continueLabel: "继续"
|
|
567
|
-
},
|
|
568
|
-
en: {
|
|
569
|
-
title: "内测声明",
|
|
570
|
-
paragraphs: [
|
|
571
|
-
"感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。",
|
|
572
|
-
"“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。",
|
|
573
|
-
"内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。"
|
|
574
|
-
],
|
|
575
|
-
feedbackEmphasis: "如果您有任何反馈与建议,请在企业微信群中留言告诉我们",
|
|
576
|
-
continueLabel: "继续"
|
|
577
|
-
}
|
|
578
|
-
};
|
|
579
|
-
//#endregion
|
|
580
|
-
//#region lib/types/client/welcome-store.js
|
|
581
|
-
/** Welcome-notice state, durable when the browser may use Host settings. */
|
|
582
|
-
function messageOf(error) {
|
|
583
|
-
return error instanceof Error ? error.message : String(error);
|
|
584
|
-
}
|
|
585
|
-
function acknowledgementOf(view) {
|
|
586
|
-
if (typeof view.value !== "object" || view.value === null) return void 0;
|
|
587
|
-
const value = view.value[WELCOME_NOTICE_ACK_FIELD];
|
|
588
|
-
return typeof value === "string" ? value : void 0;
|
|
589
|
-
}
|
|
590
|
-
/** Coordinates durable Host acknowledgement or a process-local remote fallback. */
|
|
591
|
-
var WelcomeNoticeStore = class {
|
|
592
|
-
api;
|
|
593
|
-
persistence;
|
|
594
|
-
/** uSES-safe state source shared by the registered welcome step. */
|
|
595
|
-
store = (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)({
|
|
596
|
-
status: "idle",
|
|
597
|
-
acknowledged: false,
|
|
598
|
-
error: null
|
|
599
|
-
});
|
|
600
|
-
generation = 0;
|
|
601
|
-
/**
|
|
602
|
-
* @param api - settings wire face used for durable reads and writes.
|
|
603
|
-
* @param persistence - remote browsers use memory because settings is loopback-only.
|
|
604
|
-
*/
|
|
605
|
-
constructor(api, persistence = "host") {
|
|
606
|
-
this.api = api;
|
|
607
|
-
this.persistence = persistence;
|
|
608
|
-
}
|
|
609
|
-
/** Load the acknowledgement from Host settings or initialize process-local state. */
|
|
610
|
-
async load() {
|
|
611
|
-
const generation = ++this.generation;
|
|
612
|
-
if (this.persistence === "memory") {
|
|
613
|
-
this.store.update((state) => {
|
|
614
|
-
state.status = "ready";
|
|
615
|
-
state.error = null;
|
|
616
|
-
});
|
|
617
|
-
return;
|
|
618
|
-
}
|
|
619
|
-
this.store.update((state) => {
|
|
620
|
-
state.status = "loading";
|
|
621
|
-
state.error = null;
|
|
622
|
-
});
|
|
623
|
-
try {
|
|
624
|
-
const response = await this.api.settings.describe({});
|
|
625
|
-
if (!response.result.ok) throw new Error(response.result.error.message);
|
|
626
|
-
const view = response.result.value.namespaces.find((candidate) => candidate.ns === WELCOME_NOTICE_SETTINGS_NAMESPACE);
|
|
627
|
-
if (view === void 0) throw new Error("welcome acknowledgement settings are unavailable");
|
|
628
|
-
if (generation !== this.generation) return;
|
|
629
|
-
this.store.update((state) => {
|
|
630
|
-
state.status = "ready";
|
|
631
|
-
state.acknowledged = acknowledgementOf(view) === WELCOME_NOTICE_VERSION;
|
|
632
|
-
state.error = null;
|
|
633
|
-
});
|
|
634
|
-
} catch (error) {
|
|
635
|
-
if (generation !== this.generation) return;
|
|
636
|
-
this.store.update((state) => {
|
|
637
|
-
state.status = "error";
|
|
638
|
-
state.acknowledged = false;
|
|
639
|
-
state.error = messageOf(error);
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
/**
|
|
644
|
-
* Acknowledge this copy version. The Host path mutation is idempotent across
|
|
645
|
-
* tabs and preserves sibling settings; remote fallback changes only this store.
|
|
646
|
-
* @returns true when the selected persistence mode accepted the acknowledgement.
|
|
647
|
-
*/
|
|
648
|
-
async acknowledge() {
|
|
649
|
-
const generation = ++this.generation;
|
|
650
|
-
if (this.persistence === "memory") {
|
|
651
|
-
this.store.update((state) => {
|
|
652
|
-
state.status = "ready";
|
|
653
|
-
state.acknowledged = true;
|
|
654
|
-
state.error = null;
|
|
655
|
-
});
|
|
656
|
-
return true;
|
|
657
|
-
}
|
|
658
|
-
this.store.update((state) => {
|
|
659
|
-
state.status = "saving";
|
|
660
|
-
state.error = null;
|
|
661
|
-
});
|
|
662
|
-
try {
|
|
663
|
-
const response = await this.api.settings.mutate({
|
|
664
|
-
ns: WELCOME_NOTICE_SETTINGS_NAMESPACE,
|
|
665
|
-
ops: [{
|
|
666
|
-
op: "set",
|
|
667
|
-
path: [WELCOME_NOTICE_ACK_FIELD],
|
|
668
|
-
value: WELCOME_NOTICE_VERSION
|
|
669
|
-
}]
|
|
670
|
-
});
|
|
671
|
-
if (!response.result.ok) throw new Error(response.result.error.message);
|
|
672
|
-
if (generation === this.generation) this.store.update((state) => {
|
|
673
|
-
state.status = "ready";
|
|
674
|
-
state.acknowledged = true;
|
|
675
|
-
state.error = null;
|
|
676
|
-
});
|
|
677
|
-
return true;
|
|
678
|
-
} catch (error) {
|
|
679
|
-
if (generation === this.generation) this.store.update((state) => {
|
|
680
|
-
state.status = "error";
|
|
681
|
-
state.acknowledged = false;
|
|
682
|
-
state.error = messageOf(error);
|
|
683
|
-
});
|
|
684
|
-
return false;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
};
|
|
688
|
-
/**
|
|
689
|
-
* Refresh only after welcome state has left idle. A memory-mode load retains
|
|
690
|
-
* acknowledgement so reconnect and settings-change refreshes do not reopen a
|
|
691
|
-
* process-local notice.
|
|
692
|
-
* @param controller - welcome state owner whose current status decides whether to load.
|
|
693
|
-
*/
|
|
694
|
-
function refreshWelcomeIfLoaded(controller) {
|
|
695
|
-
if (controller.store.getSnapshot().status === "idle") return;
|
|
696
|
-
controller.load();
|
|
697
|
-
}
|
|
698
|
-
//#endregion
|
|
699
436
|
//#region lib/types/client/locales.js
|
|
700
|
-
/** Shell chrome
|
|
437
|
+
/** Shell chrome and General-nav dictionaries; feature rows own their copy. */
|
|
701
438
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
702
439
|
const zh = {
|
|
703
440
|
"trigger": "设置",
|
|
@@ -705,14 +442,7 @@ window.__ModuleLoader__.load({
|
|
|
705
442
|
"close": "关闭",
|
|
706
443
|
"openDocument": "打开配置文件",
|
|
707
444
|
"openDocument.error": "无法打开配置文件",
|
|
708
|
-
"general.nav": "通用设置"
|
|
709
|
-
"welcome.title": WELCOME_NOTICE_COPY.zh.title,
|
|
710
|
-
"welcome.paragraph.0": WELCOME_NOTICE_COPY.zh.paragraphs[0],
|
|
711
|
-
"welcome.paragraph.1": WELCOME_NOTICE_COPY.zh.paragraphs[1],
|
|
712
|
-
"welcome.paragraph.2": WELCOME_NOTICE_COPY.zh.paragraphs[2],
|
|
713
|
-
"welcome.feedbackEmphasis": WELCOME_NOTICE_COPY.zh.feedbackEmphasis,
|
|
714
|
-
"welcome.continue": WELCOME_NOTICE_COPY.zh.continueLabel,
|
|
715
|
-
"welcome.error": "暂时无法保存确认状态,请重试。"
|
|
445
|
+
"general.nav": "通用设置"
|
|
716
446
|
};
|
|
717
447
|
/** English dictionary, checked complete against the zh key set. */
|
|
718
448
|
const en = {
|
|
@@ -721,14 +451,7 @@ window.__ModuleLoader__.load({
|
|
|
721
451
|
"close": "Close",
|
|
722
452
|
"openDocument": "Open configuration file",
|
|
723
453
|
"openDocument.error": "Could not open configuration file",
|
|
724
|
-
"general.nav": "General"
|
|
725
|
-
"welcome.title": WELCOME_NOTICE_COPY.en.title,
|
|
726
|
-
"welcome.paragraph.0": WELCOME_NOTICE_COPY.en.paragraphs[0],
|
|
727
|
-
"welcome.paragraph.1": WELCOME_NOTICE_COPY.en.paragraphs[1],
|
|
728
|
-
"welcome.paragraph.2": WELCOME_NOTICE_COPY.en.paragraphs[2],
|
|
729
|
-
"welcome.feedbackEmphasis": WELCOME_NOTICE_COPY.en.feedbackEmphasis,
|
|
730
|
-
"welcome.continue": WELCOME_NOTICE_COPY.en.continueLabel,
|
|
731
|
-
"welcome.error": "The acknowledgement could not be saved. Please try again."
|
|
454
|
+
"general.nav": "General"
|
|
732
455
|
};
|
|
733
456
|
//#endregion
|
|
734
457
|
//#region lib/types/client/index.js
|
|
@@ -742,8 +465,7 @@ window.__ModuleLoader__.load({
|
|
|
742
465
|
const inject = [
|
|
743
466
|
"slots",
|
|
744
467
|
"locale",
|
|
745
|
-
"connection"
|
|
746
|
-
"remote"
|
|
468
|
+
"connection"
|
|
747
469
|
];
|
|
748
470
|
/**
|
|
749
471
|
* Register the `settings` dictionaries, the chrome content, and the General
|
|
@@ -765,27 +487,9 @@ window.__ModuleLoader__.load({
|
|
|
765
487
|
useSnapshot
|
|
766
488
|
});
|
|
767
489
|
})();
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
controller: welcomeController,
|
|
772
|
-
useSnapshot: useWelcomeSnapshot
|
|
773
|
-
});
|
|
774
|
-
ctx.effect(() => {
|
|
775
|
-
const refresh = () => {
|
|
776
|
-
refreshWelcomeIfLoaded(welcomeController);
|
|
777
|
-
};
|
|
778
|
-
const disposers = [ctx.remote.$on("settings/document-updated", (ns) => {
|
|
779
|
-
if (ns !== "ui-onboarding") return;
|
|
780
|
-
refresh();
|
|
781
|
-
}), ctx.on("connection/reset", () => {
|
|
782
|
-
refresh();
|
|
783
|
-
refreshDocumentIfLoaded(documentController);
|
|
784
|
-
})];
|
|
785
|
-
return () => {
|
|
786
|
-
for (const dispose of disposers) dispose();
|
|
787
|
-
};
|
|
788
|
-
}, "ui-settings-general: metadata invalidations");
|
|
490
|
+
ctx.effect(() => ctx.on("connection/reset", () => {
|
|
491
|
+
refreshDocumentIfLoaded(documentController);
|
|
492
|
+
}), "ui-settings-general: metadata invalidations");
|
|
789
493
|
let rowsVersion = -1;
|
|
790
494
|
let rowsRevision = -1;
|
|
791
495
|
let rows = [];
|
|
@@ -893,13 +597,6 @@ window.__ModuleLoader__.load({
|
|
|
893
597
|
scope: "root"
|
|
894
598
|
} }
|
|
895
599
|
}, GeneralSection));
|
|
896
|
-
ctx.slots.inject("settings.onboarding", () => ctx.slots.register({
|
|
897
|
-
name: "settings.onboarding",
|
|
898
|
-
id: "welcome-notice",
|
|
899
|
-
order: -100,
|
|
900
|
-
locale: NS,
|
|
901
|
-
inject: welcomeInjected
|
|
902
|
-
}, WelcomeNotice));
|
|
903
600
|
}
|
|
904
601
|
//#endregion
|
|
905
602
|
exports.SettingsDocumentStore = SettingsDocumentStore;
|
package/lib/index.js
CHANGED
|
@@ -1,47 +1,15 @@
|
|
|
1
1
|
import z from "@deepseek-ai/schemastery";
|
|
2
2
|
import { settingsNamespace } from "@deepseek-ai/dsh-settings";
|
|
3
|
-
//#region lib/types/onboarding-copy.js
|
|
4
|
-
/** Durable settings namespace for product-wide GUI onboarding facts. */
|
|
5
|
-
const WELCOME_NOTICE_SETTINGS_NAMESPACE = "ui-onboarding";
|
|
6
|
-
/** Field storing the last welcome notice version the user acknowledged. */
|
|
7
|
-
const WELCOME_NOTICE_ACK_FIELD = "welcomeNoticeVersion";
|
|
8
|
-
/**
|
|
9
|
-
* Bump only when the notice changes materially and every user should see it
|
|
10
|
-
* again. The acknowledgement is compared for exact equality.
|
|
11
|
-
*/
|
|
12
|
-
const WELCOME_NOTICE_VERSION = "2026-08-11.1";
|
|
13
|
-
/** The complete editable welcome notice in both supported GUI locales. */
|
|
14
|
-
const WELCOME_NOTICE_COPY = {
|
|
15
|
-
zh: {
|
|
16
|
-
title: "内测声明",
|
|
17
|
-
paragraphs: [
|
|
18
|
-
"感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。",
|
|
19
|
-
"“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。",
|
|
20
|
-
"内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。"
|
|
21
|
-
],
|
|
22
|
-
feedbackEmphasis: "如果您有任何反馈与建议,请在企业微信群中留言告诉我们",
|
|
23
|
-
continueLabel: "继续"
|
|
24
|
-
},
|
|
25
|
-
en: {
|
|
26
|
-
title: "内测声明",
|
|
27
|
-
paragraphs: [
|
|
28
|
-
"感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。",
|
|
29
|
-
"“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。",
|
|
30
|
-
"内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。"
|
|
31
|
-
],
|
|
32
|
-
feedbackEmphasis: "如果您有任何反馈与建议,请在企业微信群中留言告诉我们",
|
|
33
|
-
continueLabel: "继续"
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
//#endregion
|
|
37
3
|
//#region lib/types/index.js
|
|
38
4
|
/** Host loader entry for the browser implementation exported from `./client`. */
|
|
39
|
-
|
|
5
|
+
/** Durable settings namespace for product-wide GUI onboarding facts. */
|
|
6
|
+
const ONBOARDING_SETTINGS_NAMESPACE = "ui-onboarding";
|
|
7
|
+
const OnboardingSettingsSchema = z.object({ welcomeNoticeVersion: z.string() });
|
|
40
8
|
/** Register the durable GUI-onboarding section when a settings provider exists. */
|
|
41
9
|
function apply(ctx) {
|
|
42
10
|
ctx.inject(["settings"], (settingsCtx) => {
|
|
43
|
-
settingsCtx.settings.register(settingsNamespace(
|
|
11
|
+
settingsCtx.settings.register(settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), OnboardingSettingsSchema);
|
|
44
12
|
});
|
|
45
13
|
}
|
|
46
14
|
//#endregion
|
|
47
|
-
export {
|
|
15
|
+
export { apply };
|
package/lib/invariant.js
CHANGED
|
@@ -10,7 +10,7 @@ const name = "client-ui-settings-general-invariant";
|
|
|
10
10
|
const inject = ["invariants"];
|
|
11
11
|
/**
|
|
12
12
|
* No runtime invariant: the settings seam validates and publishes the durable
|
|
13
|
-
*
|
|
13
|
+
* onboarding section, while slot conflicts fail loud in the slot core. The local
|
|
14
14
|
* document action is browser state over typed RPC responses and is covered by
|
|
15
15
|
* store/component tests rather than a Cordis runtime relationship.
|
|
16
16
|
*/
|
|
@@ -14,8 +14,6 @@ export type { GeneralSectionComponentProps, } from './GeneralSection.tsx';
|
|
|
14
14
|
export type { SettingsDocumentActionInjected, SettingsDocumentActionProps } from './SettingsDocumentAction.tsx';
|
|
15
15
|
export type { SettingsDocumentState } from './settings-document-store.ts';
|
|
16
16
|
export { SettingsDocumentStore } from './settings-document-store.ts';
|
|
17
|
-
export type { WelcomeNoticeInjected, WelcomeNoticeProps } from './WelcomeNotice.tsx';
|
|
18
|
-
export type { WelcomeNoticeState } from './welcome-store.ts';
|
|
19
17
|
export type { SettingsKey } from './locales.ts';
|
|
20
18
|
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
21
19
|
interface LocaleNamespaceMap {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** Shell chrome and General-nav dictionaries; feature rows own their copy. */
|
|
1
2
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
2
3
|
export declare const zh: {
|
|
3
4
|
trigger: string;
|
|
@@ -6,13 +7,6 @@ export declare const zh: {
|
|
|
6
7
|
openDocument: string;
|
|
7
8
|
'openDocument.error': string;
|
|
8
9
|
'general.nav': string;
|
|
9
|
-
'welcome.title': "内测声明";
|
|
10
|
-
'welcome.paragraph.0': "感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。";
|
|
11
|
-
'welcome.paragraph.1': "“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。";
|
|
12
|
-
'welcome.paragraph.2': "内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。";
|
|
13
|
-
'welcome.feedbackEmphasis': "如果您有任何反馈与建议,请在企业微信群中留言告诉我们";
|
|
14
|
-
'welcome.continue': "继续";
|
|
15
|
-
'welcome.error': string;
|
|
16
10
|
};
|
|
17
11
|
/** The settings namespace key union. */
|
|
18
12
|
export type SettingsKey = keyof typeof zh;
|
|
@@ -24,12 +18,5 @@ export declare const en: {
|
|
|
24
18
|
openDocument: string;
|
|
25
19
|
'openDocument.error': string;
|
|
26
20
|
'general.nav': string;
|
|
27
|
-
'welcome.title': "内测声明";
|
|
28
|
-
'welcome.paragraph.0': "感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。";
|
|
29
|
-
'welcome.paragraph.1': "“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。";
|
|
30
|
-
'welcome.paragraph.2': "内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。";
|
|
31
|
-
'welcome.feedbackEmphasis': "如果您有任何反馈与建议,请在企业微信群中留言告诉我们";
|
|
32
|
-
'welcome.continue': "继续";
|
|
33
|
-
'welcome.error': string;
|
|
34
21
|
};
|
|
35
22
|
//# sourceMappingURL=locales.d.ts.map
|
package/lib/types/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/** Host loader entry for the browser implementation exported from `./client`. */
|
|
2
2
|
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
-
export { WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, } from './onboarding-copy.ts';
|
|
4
3
|
/** Register the durable GUI-onboarding section when a settings provider exists. */
|
|
5
4
|
export declare function apply(ctx: Context): void;
|
|
6
5
|
//# sourceMappingURL=index.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-client-ui-settings-general",
|
|
3
3
|
"description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice",
|
|
4
|
-
"version": "0.0
|
|
4
|
+
"version": "0.1.0-rc.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "restricted"
|
|
7
7
|
},
|
|
@@ -42,41 +42,41 @@
|
|
|
42
42
|
"platform": "web"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
|
-
"license": "
|
|
45
|
+
"license": "MIT",
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"clsx": "^2.0.0",
|
|
48
|
-
"@deepseek-ai/dsh-settings": "^0.0
|
|
49
|
-
"@deepseek-ai/schemastery": "^3.18.1
|
|
48
|
+
"@deepseek-ai/dsh-settings": "^0.1.0-rc.2",
|
|
49
|
+
"@deepseek-ai/schemastery": "^3.18.1"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"react": "^18.2.0",
|
|
53
|
-
"@deepseek-ai/dsh-
|
|
54
|
-
"@deepseek-ai/dsh-client-
|
|
55
|
-
"@deepseek-ai/dsh-
|
|
56
|
-
"@deepseek-ai/dsh-client-
|
|
57
|
-
"@deepseek-ai/dsh-client-
|
|
58
|
-
"@deepseek-ai/dsh-client-ui-
|
|
59
|
-
"@deepseek-ai/dsh-client-ui-
|
|
60
|
-
"@deepseek-ai/dsh-client-
|
|
61
|
-
"@deepseek-ai/
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/
|
|
53
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.2",
|
|
54
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.2",
|
|
55
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.2",
|
|
56
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.0-rc.2",
|
|
57
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.2",
|
|
58
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.2",
|
|
59
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "^0.1.0-rc.2",
|
|
60
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.2",
|
|
61
|
+
"@deepseek-ai/dsh-client-web-react": "^0.1.0-rc.2",
|
|
62
|
+
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.2",
|
|
63
|
+
"@deepseek-ai/cordis": "^4.0.1"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@types/react": "~18.3.1",
|
|
67
67
|
"react": "^18.2.0",
|
|
68
|
-
"@deepseek-ai/dsh-api-remotes": "^0.0
|
|
69
|
-
"@deepseek-ai/dsh-client-connection": "^0.0
|
|
70
|
-
"@deepseek-ai/dsh-client-locale": "^0.0
|
|
71
|
-
"@deepseek-ai/dsh-client-runtime": "^0.0
|
|
72
|
-
"@deepseek-ai/dsh-client-
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-
|
|
75
|
-
"@deepseek-ai/dsh-client-ui-
|
|
76
|
-
"@deepseek-ai/dsh-client-
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/
|
|
79
|
-
"@deepseek-ai/
|
|
68
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.2",
|
|
69
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.0-rc.2",
|
|
70
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.2",
|
|
71
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.2",
|
|
72
|
+
"@deepseek-ai/dsh-client-test-runtime": "^0.1.0-rc.2",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.0-rc.2",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.2",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "^0.1.0-rc.2",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.2",
|
|
77
|
+
"@deepseek-ai/dsh-client-web-react": "^0.1.0-rc.2",
|
|
78
|
+
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.2",
|
|
79
|
+
"@deepseek-ai/cordis": "^4.0.1"
|
|
80
80
|
},
|
|
81
81
|
"files": [
|
|
82
82
|
"lib/index.js",
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/** Product-wide, versioned first-run welcome step. */
|
|
2
|
-
import type { ReactNode } from 'react';
|
|
3
|
-
import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
-
import type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-web-react';
|
|
5
|
-
import type { WelcomeNoticeState, WelcomeNoticeStore } from './welcome-store.ts';
|
|
6
|
-
/** Registrant-owned dependencies of {@link WelcomeNotice}. */
|
|
7
|
-
export interface WelcomeNoticeInjected {
|
|
8
|
-
controller: WelcomeNoticeStore;
|
|
9
|
-
useSnapshot: SnapshotSelectorHook<WelcomeNoticeState>;
|
|
10
|
-
}
|
|
11
|
-
/** Coordinator owner props plus the welcome step's injected face. */
|
|
12
|
-
export type WelcomeNoticeProps = PropsRuntime<'settings.onboarding'> & PropsLocale<'settings'> & WelcomeNoticeInjected;
|
|
13
|
-
/** Render the mandatory notice until its current version is acknowledged. */
|
|
14
|
-
export declare function WelcomeNotice(props: WelcomeNoticeProps): ReactNode;
|
|
15
|
-
//# sourceMappingURL=WelcomeNotice.d.ts.map
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/** Welcome-notice state, durable when the browser may use Host settings. */
|
|
2
|
-
import type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client';
|
|
3
|
-
import type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client';
|
|
4
|
-
/** State rendered by the welcome step. */
|
|
5
|
-
export interface WelcomeNoticeState {
|
|
6
|
-
status: 'idle' | 'loading' | 'ready' | 'saving' | 'error';
|
|
7
|
-
acknowledged: boolean;
|
|
8
|
-
error: string | null;
|
|
9
|
-
}
|
|
10
|
-
/** Coordinates durable Host acknowledgement or a process-local remote fallback. */
|
|
11
|
-
export declare class WelcomeNoticeStore {
|
|
12
|
-
private readonly api;
|
|
13
|
-
private readonly persistence;
|
|
14
|
-
/** uSES-safe state source shared by the registered welcome step. */
|
|
15
|
-
readonly store: SnapshotStore<WelcomeNoticeState>;
|
|
16
|
-
private generation;
|
|
17
|
-
/**
|
|
18
|
-
* @param api - settings wire face used for durable reads and writes.
|
|
19
|
-
* @param persistence - remote browsers use memory because settings is loopback-only.
|
|
20
|
-
*/
|
|
21
|
-
constructor(api: Pick<IApiClient, 'settings'>, persistence?: 'host' | 'memory');
|
|
22
|
-
/** Load the acknowledgement from Host settings or initialize process-local state. */
|
|
23
|
-
load(): Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* Acknowledge this copy version. The Host path mutation is idempotent across
|
|
26
|
-
* tabs and preserves sibling settings; remote fallback changes only this store.
|
|
27
|
-
* @returns true when the selected persistence mode accepted the acknowledgement.
|
|
28
|
-
*/
|
|
29
|
-
acknowledge(): Promise<boolean>;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Refresh only after welcome state has left idle. A memory-mode load retains
|
|
33
|
-
* acknowledgement so reconnect and settings-change refreshes do not reopen a
|
|
34
|
-
* process-local notice.
|
|
35
|
-
* @param controller - welcome state owner whose current status decides whether to load.
|
|
36
|
-
*/
|
|
37
|
-
export declare function refreshWelcomeIfLoaded(controller: WelcomeNoticeStore): void;
|
|
38
|
-
//# sourceMappingURL=welcome-store.d.ts.map
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/** Durable settings namespace for product-wide GUI onboarding facts. */
|
|
2
|
-
export declare const WELCOME_NOTICE_SETTINGS_NAMESPACE = "ui-onboarding";
|
|
3
|
-
/** Field storing the last welcome notice version the user acknowledged. */
|
|
4
|
-
export declare const WELCOME_NOTICE_ACK_FIELD = "welcomeNoticeVersion";
|
|
5
|
-
/**
|
|
6
|
-
* Bump only when the notice changes materially and every user should see it
|
|
7
|
-
* again. The acknowledgement is compared for exact equality.
|
|
8
|
-
*/
|
|
9
|
-
export declare const WELCOME_NOTICE_VERSION = "2026-08-11.1";
|
|
10
|
-
/** The complete editable welcome notice in both supported GUI locales. */
|
|
11
|
-
export declare const WELCOME_NOTICE_COPY: {
|
|
12
|
-
readonly zh: {
|
|
13
|
-
readonly title: "内测声明";
|
|
14
|
-
readonly paragraphs: readonly ["感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。", "“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。", "内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。"];
|
|
15
|
-
readonly feedbackEmphasis: "如果您有任何反馈与建议,请在企业微信群中留言告诉我们";
|
|
16
|
-
readonly continueLabel: "继续";
|
|
17
|
-
};
|
|
18
|
-
readonly en: {
|
|
19
|
-
readonly title: "内测声明";
|
|
20
|
-
readonly paragraphs: readonly ["感谢您愿意拨冗试用 DeepSeek Harness。当前版本仍处于内部测试阶段,功能仍待完善,体验难免有些粗糙。", "“如切如磋,如琢如磨。” 产品的成长,离不开一次次真实的碰撞与坦诚的反馈。您在真实使用中发现的问题,也可能促使我们重新审视,甚至推翻已有的设计。", "内测版本默认不会上传 Session Log。如需在提交反馈时共享会话日志,可以设置环境变量 DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需持续上传,可以设置 DSH_TELEMETRY_MODE=FULL,但该模式同时会启用 dsh-sdk 命令遥测,上报匿名 ID、命令结果以及脱敏后的项目配置。另外,如果您有任何反馈与建议,请在企业微信群中留言告诉我们。每一条反馈,都会帮助我们把它打磨得更好。"];
|
|
21
|
-
readonly feedbackEmphasis: "如果您有任何反馈与建议,请在企业微信群中留言告诉我们";
|
|
22
|
-
readonly continueLabel: "继续";
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=onboarding-copy.d.ts.map
|