@deepseek-ai/dsh-client-ui-settings-account 0.2.0-rc.2 → 0.2.1-alpha.1

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/README.i18n.yaml CHANGED
@@ -9,20 +9,20 @@
9
9
  en: 9ff7ac2d70f70b59
10
10
  zh: ded522c4cfd6e040
11
11
  /deepseek-ai-dsh-client-ui-settings-account/summary:
12
- en: 9ff357621753be69
13
- zh: 3f7ede82acc9fa31
12
+ en: 54da65ea807d7af1
13
+ zh: 359f85d16724d71d
14
14
  /deepseek-ai-dsh-client-ui-settings-account/table-of-contents:
15
15
  en: c26f81e8adf0128b
16
16
  zh: e11ab371f51f66bc
17
17
  /deepseek-ai-dsh-client-ui-settings-account/use-this-package:
18
- en: db54432d24abc9d9
19
- zh: 55add79efabfae08
18
+ en: fe1db216d397749f
19
+ zh: f823c2cd43152e66
20
20
  /deepseek-ai-dsh-client-ui-settings-account/use-this-package/desktop-onboarding:
21
21
  en: c1c4db71fd09ca13
22
22
  zh: a40c0a01e9951945
23
23
  /deepseek-ai-dsh-client-ui-settings-account/understand-the-implementation:
24
- en: 6b3ad3b6860100cf
25
- zh: aeced4fb37642f15
24
+ en: 93e9874de6ed3a4d
25
+ zh: d98ba48e88078eee
26
26
  /deepseek-ai-dsh-client-ui-settings-account/further-exploration:
27
27
  en: a28acdef21b1643a
28
28
  zh: 5e2e357a6b716274
package/README.md CHANGED
@@ -15,6 +15,8 @@ Server-expired account credentials clear the displayed account details and emit
15
15
 
16
16
  The Account settings section displays DeepSeek login state and offers browser sign-in and cancellation; the sidebar account menu provides Platform sign-out. Desktop users also receive a resumable introduction to account credit and presentation preferences.
17
17
 
18
+ The sign-in dialog offers network troubleshooting only for `no-response` failures. HTTP, business, response-validation, storage, and account-stream failures retain the generic retry message.
19
+
18
20
  ## Table of Contents
19
21
 
20
22
  - [Use this package](#use-this-package)
@@ -40,7 +42,7 @@ Desktop usage, top-up, and onboarding recharge actions open one isolated native
40
42
 
41
43
  Chat offers each live quota failure from a bound Session to the frame-wide `shell.quota-notice` chain from its host in `shell.overlay`, so the notice outlives the Chat panel that reported it. The account entry claims `ACCOUNT_QUOTA`: while an account credential is stored and the shared host entry exists, the Modal offers Cancel and Top up. While a page requested through the shared request channel is showing, the native view covers this document, so the entry paints neither the Modal nor the Toast. A quota failure that arrives while a Settings-opened page is already showing is not retained: it stays subject to newest-notice replacement, and the Modal appears after the viewer returns while that notice is still current. That Modal reports the failure of the original request, not the account's current balance: the top-up re-read is a separate read, and returning neither proves a successful payment nor dismisses the notice on its own. The notice's own Top up is the retained case: it calls `keepOpen()` and requests the `top-up` page through the shared request channel, keeping that notice and its page mounted through later quota failures. With the shared host entry the entry waits for the first account snapshot instead of rendering a Toast that its own timer could discard; a snapshot that reports no stored credential, or a failed account stream with no snapshot, then renders the same neutral warning Toast itself, and without that host entry the entry renders that Toast immediately, instead of relying on the chat host fallback. The entry owns the hold and its page request and releases both when it unmounts, so a later quota failure publishes again without replaying the dropped ones; dismissal or sign-out clears the hold and the page request. Close, Cancel, a sign-out, or leaving the notice's own embedded page takes the notice down without retrying the request.
42
44
 
43
- The account menu's Feedback entry opens the Feishu questionnaire in the system browser. Every click samples its context then: the account UID when the profile is ready and carries an id, the build version as harness_version, the UI locale, the physical screen resolution, and device_info. Each context field also carries hide_*=1, stale prefill values for these fields are dropped from the configured form URL first, including uid, device_info and harness_version regardless of the configured URL. Tokens and masked contact details stay out, and a signed-out, still-loading, or failed profile leaves prefill_uid out. When the Desktop bridge has no deviceInfo reader, the form opens with navigator.userAgent. Desktop exposes the optional dshDesktop.deviceInfo reader, whose field format the [Desktop README](../../../apps/desktop/README.md) owns; its answer replaces the user agent, a failed read opens the form with device_info empty instead of dropping the report, and device_info describes the reported environment rather than a hardware model. Configure contactFormUrl on the ui-settings-account plugin to select another HTTPS form; contactSource defaults to empty until the questionnaire supports a Harness source option.
45
+ The account menu's Feedback entry opens the Feishu questionnaire in the system browser. Every click samples its context then: the account UID when the profile is ready and carries an id, the build version as harness_version, and device_info. The device_info value includes the physical screen resolution as screen_resolution=widthxheight, after rounding the screen dimensions multiplied by devicePixelRatio; unavailable screen dimensions omit this entry. Each context field also carries hide_*=1, stale prefill values for these fields are dropped from the configured form URL first, including uid, device_info and harness_version regardless of the configured URL. The URL carries no os_version, device_brand, app_locale or separate screen_resolution parameters; configured prefill and hide parameters for these fields are removed. Tokens and masked contact details stay out, and a signed-out, still-loading, or failed profile leaves prefill_uid out. When the Desktop bridge has no deviceInfo reader, the form opens with navigator.userAgent. Desktop exposes the optional dshDesktop.deviceInfo reader, whose field format the [Desktop README](../../../apps/desktop/README.md) owns; its answer replaces the user agent, a failed read still opens the form with any available screen resolution in device_info, and device_info describes the reported environment rather than a hardware model. Configure contactFormUrl on the ui-settings-account plugin to select another HTTPS form; contactSource defaults to empty until the questionnaire supports a Harness source option.
44
46
 
45
47
  Account profile and balance cards share the [settings card material and radius](../../../docs/web-styling.md#corner-radii-and-settings-cards). Usage and top-up links match standard Button geometry; authorization actions use the shared Button.
46
48
 
@@ -64,9 +66,9 @@ The welcome page requires Get started. The credit page always appears. A positiv
64
66
  <a id="understand-the-implementation"></a>
65
67
  ## Understand the implementation
66
68
 
67
- The Account section appears first in Settings only while signed in; it is hidden before account state loads and after sign-out. The plugin owns one Host snapshot stream shared through framework hooks by settings.section and settings.launcher. The launcher opens Settings and offers Sign out only while an account credential is stored. Platform failures leave the menu available for retry. It maintains no independent credential state, so no invariant companion is published.
69
+ The Account section appears first in Settings only while signed in; it is hidden before account state loads and after sign-out. The plugin owns one Host snapshot stream shared through framework hooks by settings.section and settings.launcher. The launcher opens Settings and offers Sign out only while an account credential is stored. Platform failures leave the menu available for retry. It maintains no independent credential state.
68
70
 
69
- The desktop controller writes progress to `ui-settings-account` through Host settings. Completion first applies `ui-chat.transcriptView` and `ui-chat.performanceUsage` together, then calls the shared Coding Tools preference to persist `ui-settings.enabled`, and finally saves the done marker; a rejected write keeps the flow available for retry. Successful completion reveals the workspace through a 180ms fade; choices and ordinary navigation preview immediately while writes run in order. A failed final queued write restores saved progress and allows retry. Completion waits for queued choices and retains the page until preferences persist; reduced motion skips the fade. Onboarding choices compact, standard, and detailed apply directly to the corresponding Chat work-detail modes. API-key entry and explicit skip select standard; onboarding does not select verbose. Complete Figma illustration layers are bundled as transparent, palette-compressed 3× PNG assets; welcome layers are merged with local sidebar blur; recharge uses a 70% opaque foreground window with local blur of the covered illustration, and headings use the bundled Montserrat brand font; English headings and descriptions use Light (300), except the DeepSeek Harness brand within headings uses Medium (500); card titles retain Regular (400) when selected. English footer navigation uses Light (300). Confirmed onboarding sets a 960px minimum window width and enlarges narrower windows; completion releases the minimum without restoring the previous size. Loading or already-completed onboarding does not resize the window. Empty footer navigation space passes pointer events through to the primary action. Cards exclude native window dragging and own the keyboard focus outline for their checkbox. The account package owns its onboarding overlay and control geometry. Each step and the confirmation dialog has a separate component; the flow coordinates navigation, transitions, and recharge. The overlay hides the workspace while initial account and progress state loads. Question headings and cards follow the Figma positions at 1440 × 920 and 960 × 600, independently of their action buttons. On macOS, content clears the body portal’s inherited no-drag region and a first-child drag band leaves an 8px native resize margin; interactive controls and later dialogs exclude their regions, and a native Platform page disables the underlying onboarding band. The upper workspace popup illustration has an opaque background in both languages and themes; the underlying sidebar omits its selected-row highlight. Welcome keeps its illustration at its original size, repositions and clips the artwork in narrow windows, and reveals the complete illustration on wide windows. The [onboarding decision](../../../.agents/notes/implemented/feature/2026-09-16-desktop-onboarding.md) owns persistence and presentation trade-offs.
71
+ The desktop controller writes progress to `ui-settings-account` through Host settings. Completion first applies `ui-chat.transcriptView` and `ui-chat.performanceUsage` together, then calls the shared Coding Tools preference to persist `ui-settings.enabled`, and finally saves the done marker; a rejected write keeps the flow available for retry. Successful completion reveals the workspace through a 180ms fade; choices and ordinary navigation preview immediately while writes run in order. A failed final queued write restores saved progress and allows retry. Completion waits for queued choices and retains the page until preferences persist; reduced motion skips the fade. Onboarding choices compact, standard, and detailed apply directly to the corresponding Chat work-detail modes. API-key entry and explicit skip select standard; onboarding does not select verbose. Complete Figma illustration layers are bundled as transparent, palette-compressed 3× PNG assets; welcome layers are merged with local sidebar blur; recharge uses a 70% opaque foreground window with local blur of the covered illustration, and headings use the bundled Montserrat brand font; English headings and descriptions use Light (300), except the DeepSeek Harness brand within headings uses Medium (500); card titles retain Regular (400) when selected. English footer navigation uses Light (300). Confirmed onboarding sets a 960px minimum window width and enlarges narrower windows; completion releases the minimum without restoring the previous size. Loading or already-completed onboarding does not resize the window. Empty footer navigation space passes pointer events through to the primary action. Cards exclude native window dragging and own the keyboard focus outline for their checkbox. The account package owns its onboarding overlay and control geometry. Each step and the confirmation dialog has a separate component; the flow coordinates navigation, transitions, and recharge. The overlay hides the workspace while initial account and progress state loads. Question headings and cards follow the Figma positions at 1440 × 920 and 960 × 600, independently of their action buttons. On macOS, content clears the body portal’s inherited no-drag region and a first-child drag band leaves an 8px native resize margin; interactive controls and later dialogs exclude their regions, and a native Platform page disables the underlying onboarding band. The upper workspace popup illustration has an opaque background in both languages and themes; the underlying sidebar omits its selected-row highlight. Welcome keeps its illustration at its original size, repositions and clips the artwork in narrow windows, and reveals the complete illustration on wide windows. The [historical onboarding decision](../../../.agents/notes/archived/feature/2026-09-16-desktop-onboarding.md) owns persistence and presentation trade-offs.
70
72
 
71
73
  <a id="further-exploration"></a>
72
74
  ## Further Exploration
package/README.zh.md CHANGED
@@ -15,6 +15,8 @@ kind: "package-reference"
15
15
 
16
16
  设置中的账号页面显示 DeepSeek 登录状态,并提供浏览器登录和取消;侧边栏账号菜单提供 Platform 退出登录。Desktop 用户还会进入可恢复的引导,了解账号额度并选择展示偏好。
17
17
 
18
+ 登录弹窗仅对 `no-response` 失败提示检查网络。HTTP、业务、响应校验、存储和账号状态流失败仍显示通用重试提示。
19
+
18
20
  ## 目录
19
21
 
20
22
  - [使用此包](#use-this-package)
@@ -40,7 +42,7 @@ Desktop 的用量、充值与引导充值操作在 48px 返回栏下方打开同
40
42
 
41
43
  Chat 通过 `shell.overlay` 中的宿主把已绑定 Session 的实时欠费交给全局 `shell.quota-notice` 链,提示的生命周期因此长于上报它的 Chat 面板。账号条目认领 `ACCOUNT_QUOTA`:已存储账号凭证且存在共享宿主条目时,Modal 提供取消和去充值。只要通过该共享请求通道请求的页面正在显示,原生视图就会盖住本页,因此该条目既不绘制 Modal 也不绘制 Toast。在 Account 设置页已打开页面的情况下新到达的欠费不会被保持:它仍受最新提示替换规则约束,返回后若该提示仍是最新一条就显示 Modal。该 Modal 报告的是原始请求的失败,而不是账号当前余额:返回时的重读是一次独立读取,返回本身既不证明支付成功,也不会自动撤下该提示。提示自身的去充值属于被保持的情形:它调用 `keepOpen()` 并通过共享请求通道申请 `top-up` 页面,使该提示与其页面在后续欠费期间保持挂载。存在共享宿主条目时,该条目会等待首个账号快照,而不是渲染一个可能被自身计时器丢弃的 Toast;快照报告未存储凭证,或账号流失败且无快照时,才由该条目自行渲染同一段中立警告 Toast,缺少该宿主条目时则立即渲染该 Toast,而不依赖 Chat 宿主回退。该条目持有保持与页面请求,并在自身卸载时释放二者,因此后续欠费会重新发布而不重放已丢弃的提示;关闭与退出登录也会清除保持和页面请求。关闭、取消、退出登录或离开该提示自己的内嵌页面都会撤下提示,且不会重试请求。
42
44
 
43
- 账号菜单的“意见反馈”入口在系统浏览器中打开飞书问卷。每次点击都按当时的上下文取值:profile ready 且带 id 时的账号 UID、以 harness_version 表示的构建版本、界面语言、屏幕物理分辨率,以及 device_info。所有上下文字段同时设置 hide_*=1,配置的表单 URL 中这些字段的 stale prefill 参数先被清除,uid、device_info 与 harness_version 的隐藏参数不依赖配置 URL 的取值。不传 token 或脱敏联系方式;未登录、profile 仍在加载或读取失败时都不填写 prefill_uid。Desktop 桥接没有 deviceInfo 读取器时,打开的表单以 navigator.userAgent 作为 device_info。Desktop 端暴露可选的 dshDesktop.deviceInfo 读取器,其字段格式由 [Desktop README](../../../apps/desktop/README.zh.md) 负责;该读取器的结果取代 user-agent,读取失败时仍打开表单、仅 device_info 留空,而 device_info 描述的是上报的环境而非硬件型号。可在 ui-settings-account 插件配置 contactFormUrl,切换到另一个 HTTPS 问卷;问卷支持 Harness 来源选项前,contactSource 默认为空。
45
+ 账号菜单的“意见反馈”入口在系统浏览器中打开飞书问卷。每次点击都按当时的上下文取值:profile ready 且带 id 时的账号 UID、以 harness_version 表示的构建版本,以及 device_info。device_info 以 screen_resolution=宽x高 包含屏幕物理分辨率,尺寸乘以 devicePixelRatio 后四舍五入;屏幕尺寸不可用时省略此项。所有上下文字段同时设置 hide_*=1,配置的表单 URL 中这些字段的 stale prefill 参数先被清除,uid、device_info 与 harness_version 的隐藏参数不依赖配置 URL 的取值。URL 不携带 os_version、device_brand、app_locale 或独立的 screen_resolution 参数;配置 URL 中这些字段的 prefill 与 hide 参数会被移除。不传 token 或脱敏联系方式;未登录、profile 仍在加载或读取失败时都不填写 prefill_uid。Desktop 桥接没有 deviceInfo 读取器时,打开的表单以 navigator.userAgent 作为 device_info。Desktop 端暴露可选的 dshDesktop.deviceInfo 读取器,其字段格式由 [Desktop README](../../../apps/desktop/README.zh.md) 负责;该读取器的结果取代 user-agent,读取失败时仍打开表单,device_info 保留可获取的屏幕分辨率,而 device_info 描述的是上报的环境而非硬件型号。可在 ui-settings-account 插件配置 contactFormUrl,切换到另一个 HTTPS 问卷;问卷支持 Harness 来源选项前,contactSource 默认为空。
44
46
 
45
47
  账号资料与余额卡片共用[设置卡片材质与圆角](../../../docs/web-styling.zh.md#corner-radii-and-settings-cards)。用量与充值链接与标准 Button 尺寸一致;授权操作使用公共 Button。
46
48
 
@@ -64,9 +66,9 @@ Desktop preload 标记在账号凭证已存储后启用引导。进度属于本
64
66
  <a id="understand-the-implementation"></a>
65
67
  ## 理解实现
66
68
 
67
- 仅登录后在设置导航首位显示账号页;账号状态加载完成前以及退出登录后隐藏该页。 插件持有一条 Host 快照流,通过框架 hook 供 settings.section 和 settings.launcher 共享。入口菜单可打开设置,并仅在已存储账号凭证时提供退出登录。Platform 请求失败时保留菜单,以供重试。插件不维护独立凭证状态,因此不发布 invariant。
69
+ 仅登录后在设置导航首位显示账号页;账号状态加载完成前以及退出登录后隐藏该页。 插件持有一条 Host 快照流,通过框架 hook 供 settings.section 和 settings.launcher 共享。入口菜单可打开设置,并仅在已存储账号凭证时提供退出登录。Platform 请求失败时保留菜单,以供重试。插件不维护独立凭证状态。
68
70
 
69
- 桌面控制器通过 Host 设置将进度写入 `ui-settings-account`。完成时先一并应用 `ui-chat.transcriptView` 与 `ui-chat.performanceUsage`,再通过共享代码工作工具偏好保存 `ui-settings.enabled`,最后保存完成标记;写入被拒绝时保留引导以供重试。成功完成后通过 180ms 淡出显露工作区;选择和普通翻页立即预览,写入在后台按顺序执行。队列最后一次写入失败时恢复已保存进度,并允许重试。完成操作会等待选择队列及偏好保存成功,再关闭页面;减少动态效果偏好会跳过淡出。onboarding 选项 compact、standard、detailed 直接应用到对应的 Chat 工作过程模式。API Key 进入与显式跳过均采用 standard;onboarding 不选择 verbose。完整 Figma 示意图层以透明、调色板压缩的 3× PNG 资源打包;欢迎页图层合并并烘焙侧栏局部模糊;充值页前景窗口不透明度为 70%,仅烘焙其覆盖插图区域的模糊,标题使用已打包的 Montserrat 品牌字体,英文标题和描述使用 Light(300),标题中的 DeepSeek Harness 使用 Medium(500);卡片标题选中前后均使用 Regular(400)。英文底部导航使用 Light(300)。确认进入引导后,窗口最小宽度设为 960px,较窄窗口自动放大;完成后解除宽度限制,但不恢复原尺寸。加载中或已完成引导的启动不改变窗口尺寸。底部导航空白区域透过鼠标事件,避免遮挡主操作。卡片区域不参与原生窗口拖动,复选框的键盘焦点仅在卡片外框展示。账号包负责引导覆盖层和控件尺寸样式。每个步骤和确认弹窗各有独立组件,流程组件协调导航、切换动画和充值。初始账号与进度加载期间,覆盖层隐藏工作区。答题标题和卡片独立于操作按钮,位置对齐 Figma 的 1440 × 920 和 960 × 600 断点。macOS 的内容层清除 body 浮层继承的 no-drag,位于内容之前的拖拽层保留 8px 原生缩放边缘;交互控件和后续弹窗排除自身区域;原生平台页面打开时禁用底层引导拖拽层。上方工作区弹窗插画在两种语言和主题下均使用不透明背景,下层侧边栏不绘制选中行高亮。欢迎页保持示意图的原始尺寸,在窄窗口内调整插图位置并裁切,在宽窗口内展示完整插图。[引导决策](../../../.agents/notes/implemented/feature/2026-09-16-desktop-onboarding.zh.md)记录持久化与展示方面的取舍。
71
+ 桌面控制器通过 Host 设置将进度写入 `ui-settings-account`。完成时先一并应用 `ui-chat.transcriptView` 与 `ui-chat.performanceUsage`,再通过共享代码工作工具偏好保存 `ui-settings.enabled`,最后保存完成标记;写入被拒绝时保留引导以供重试。成功完成后通过 180ms 淡出显露工作区;选择和普通翻页立即预览,写入在后台按顺序执行。队列最后一次写入失败时恢复已保存进度,并允许重试。完成操作会等待选择队列及偏好保存成功,再关闭页面;减少动态效果偏好会跳过淡出。onboarding 选项 compact、standard、detailed 直接应用到对应的 Chat 工作过程模式。API Key 进入与显式跳过均采用 standard;onboarding 不选择 verbose。完整 Figma 示意图层以透明、调色板压缩的 3× PNG 资源打包;欢迎页图层合并并烘焙侧栏局部模糊;充值页前景窗口不透明度为 70%,仅烘焙其覆盖插图区域的模糊,标题使用已打包的 Montserrat 品牌字体,英文标题和描述使用 Light(300),标题中的 DeepSeek Harness 使用 Medium(500);卡片标题选中前后均使用 Regular(400)。英文底部导航使用 Light(300)。确认进入引导后,窗口最小宽度设为 960px,较窄窗口自动放大;完成后解除宽度限制,但不恢复原尺寸。加载中或已完成引导的启动不改变窗口尺寸。底部导航空白区域透过鼠标事件,避免遮挡主操作。卡片区域不参与原生窗口拖动,复选框的键盘焦点仅在卡片外框展示。账号包负责引导覆盖层和控件尺寸样式。每个步骤和确认弹窗各有独立组件,流程组件协调导航、切换动画和充值。初始账号与进度加载期间,覆盖层隐藏工作区。答题标题和卡片独立于操作按钮,位置对齐 Figma 的 1440 × 920 和 960 × 600 断点。macOS 的内容层清除 body 浮层继承的 no-drag,位于内容之前的拖拽层保留 8px 原生缩放边缘;交互控件和后续弹窗排除自身区域;原生平台页面打开时禁用底层引导拖拽层。上方工作区弹窗插画在两种语言和主题下均使用不透明背景,下层侧边栏不绘制选中行高亮。欢迎页保持示意图的原始尺寸,在窄窗口内调整插图位置并裁切,在宽窗口内展示完整插图。[历史引导决策](../../../.agents/notes/archived/feature/2026-09-16-desktop-onboarding.md)记录持久化与展示方面的取舍。
70
72
 
71
73
  <a id="further-exploration"></a>
72
74
  ## 深入探索
package/lib/client.js CHANGED
@@ -924,25 +924,30 @@ window.__ModuleLoader__.load({
924
924
  const ratio = Number.isFinite(context.pixelRatio) ? context.pixelRatio : 1;
925
925
  const width = Math.round(context.width * ratio);
926
926
  const height = Math.round(context.height * ratio);
927
+ const deviceInfo = [context.deviceInfo];
928
+ if (width > 0 && height > 0) deviceInfo.push(`screen_resolution=${width}x${height}`);
927
929
  const fields = {
928
930
  uid: context.uid,
929
931
  source: config.contactSource,
930
932
  harness_version: context.version,
931
- os_version: void 0,
932
- device_brand: void 0,
933
- device_info: context.deviceInfo,
934
- app_locale: context.locale,
935
- screen_resolution: width > 0 && height > 0 ? `${width}x${height}` : void 0
933
+ device_info: deviceInfo.filter(Boolean).join("; ")
936
934
  };
937
935
  for (const [name, value] of Object.entries(fields)) {
938
936
  url.searchParams.set(`hide_${name}`, "1");
939
937
  url.searchParams.delete(`prefill_${name}`);
940
938
  if (value) url.searchParams.set(`prefill_${name}`, value);
941
939
  }
942
- url.searchParams.delete("prefill_app_version");
943
- url.searchParams.delete("hide_app_version");
944
- url.searchParams.delete("prefill_device_model");
945
- url.searchParams.delete("hide_device_model");
940
+ for (const name of [
941
+ "os_version",
942
+ "device_brand",
943
+ "app_locale",
944
+ "screen_resolution",
945
+ "app_version",
946
+ "device_model"
947
+ ]) {
948
+ url.searchParams.delete(`prefill_${name}`);
949
+ url.searchParams.delete(`hide_${name}`);
950
+ }
946
951
  return url.href;
947
952
  }
948
953
  //#endregion
@@ -1010,7 +1015,9 @@ window.__ModuleLoader__.load({
1010
1015
  const phase = attempt?.phase;
1011
1016
  const active = busy || phase === "initializing" || phase === "waiting-browser" || phase === "exchanging" || phase === "committing";
1012
1017
  const expired = phase === "expired";
1013
- const error = failed || account.loginFailed || account.failed || phase === "failed";
1018
+ const localFailure = failed || account.loginFailed || account.failed;
1019
+ const error = localFailure || phase === "failed";
1020
+ const failureKey = !localFailure && phase === "failed" && attempt?.errorCode === "no-response" ? "noResponse" : "failed";
1014
1021
  const waiting = active && !error;
1015
1022
  const committing = phase === "committing";
1016
1023
  (0, react.useEffect)(() => {
@@ -1085,7 +1092,7 @@ window.__ModuleLoader__.load({
1085
1092
  ]
1086
1093
  }) : (0, react_jsx_runtime.jsx)("p", {
1087
1094
  className: SignInDialog_module_css_default.description,
1088
- children: error ? t("failed") : expired ? t("timeoutDescription") : t("loginDescription")
1095
+ children: error ? t(failureKey) : expired ? t("timeoutDescription") : t("loginDescription")
1089
1096
  })]
1090
1097
  }), (0, react_jsx_runtime.jsxs)("div", {
1091
1098
  className: SignInDialog_module_css_default.actions,
@@ -2832,6 +2839,7 @@ window.__ModuleLoader__.load({
2832
2839
  completing: "Completing sign in…",
2833
2840
  expired: "Sign in expired. Try again.",
2834
2841
  failed: "Could not complete the operation. Try again.",
2842
+ noResponse: "Something went wrong. Please check your network connection and try again.",
2835
2843
  settingsSignedOutTitle: "You are not signed in to DeepSeek Harness",
2836
2844
  settingsSignedOutDescription: "Sign in to DeepSeek Harness to get your dedicated API Key",
2837
2845
  signInDescription: "Use your DeepSeek account to get started.",
@@ -2890,6 +2898,7 @@ window.__ModuleLoader__.load({
2890
2898
  completing: "正在完成登录…",
2891
2899
  expired: "登录已过期,请重试。",
2892
2900
  failed: "操作未完成,请重试。",
2901
+ noResponse: "操作未完成,可能是网络异常,请检查你的网络状况后重试",
2893
2902
  settingsSignedOutTitle: "当前未登录 DeepSeek Harness 账号",
2894
2903
  settingsSignedOutDescription: "登录 DeepSeek Harness 账号获取专属 API Key",
2895
2904
  signInDescription: "登录 DeepSeek 账号以开始使用",
@@ -4209,7 +4218,7 @@ window.__ModuleLoader__.load({
4209
4218
  for (const listener of listeners) listener();
4210
4219
  };
4211
4220
  /** @returns the client identity for one account call, read at call time so it carries the language and zone in effect then. */
4212
- const client = () => accountClientMetadata(ctx.locale.getSnapshot().active, "0.2.0-rc.2");
4221
+ const client = () => accountClientMetadata(ctx.locale.getSnapshot().active, "0.2.1-alpha.1");
4213
4222
  const notices = createBonusNoticeController({
4214
4223
  ackRetryDelayMs: config.bonusAckRetryDelayMs,
4215
4224
  ackRetryMaxDelayMs: config.bonusAckRetryMaxDelayMs,
@@ -4342,8 +4351,7 @@ window.__ModuleLoader__.load({
4342
4351
  const profile = snapshot.details?.profile;
4343
4352
  const context = {
4344
4353
  uid: profile?.status === "ready" ? profile.value.id : null,
4345
- version: "0.2.0-rc.2",
4346
- locale: ctx.locale.getSnapshot().active === "zh" ? "zh-CN" : "en",
4354
+ version: "0.2.1-alpha.1",
4347
4355
  width: window.screen.width,
4348
4356
  height: window.screen.height,
4349
4357
  pixelRatio: window.devicePixelRatio
@@ -1,4 +1,4 @@
1
- /** Feishu questionnaire context: Harness build, locale, screen and reported environment. */
1
+ /** Feishu questionnaire context: Harness build and reported environment. */
2
2
  import type { AccountUserId } from '@deepseek-ai/dsh-deepseek-account/types';
3
3
  import type { ContactConfig } from '../contact-config.ts';
4
4
  /**
@@ -10,7 +10,6 @@ import type { ContactConfig } from '../contact-config.ts';
10
10
  export declare function contactUrl(config: ContactConfig, context: {
11
11
  uid: AccountUserId | null | undefined;
12
12
  version: string | undefined;
13
- locale: string;
14
13
  deviceInfo: string;
15
14
  width: number;
16
15
  height: number;
@@ -36,6 +36,7 @@ export declare const en: {
36
36
  readonly completing: "Completing sign in…";
37
37
  readonly expired: "Sign in expired. Try again.";
38
38
  readonly failed: "Could not complete the operation. Try again.";
39
+ readonly noResponse: "Something went wrong. Please check your network connection and try again.";
39
40
  readonly settingsSignedOutTitle: "You are not signed in to DeepSeek Harness";
40
41
  readonly settingsSignedOutDescription: "Sign in to DeepSeek Harness to get your dedicated API Key";
41
42
  readonly signInDescription: "Use your DeepSeek account to get started.";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-settings-account",
3
3
  "description": "Manage DeepSeek login and open Platform billing pages",
4
- "version": "0.2.0-rc.2",
4
+ "version": "0.2.1-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "license": "MIT",
42
42
  "peerDependencies": {
43
- "@deepseek-ai/cordis": "~4.0.4"
43
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@testing-library/react": "^16.1.0",
@@ -50,23 +50,23 @@
50
50
  "react-dom": "^18.2.0",
51
51
  "@types/react-dom": "~18.3.0",
52
52
  "big.js": "^7.0.1",
53
- "@deepseek-ai/cordis": "~4.0.4",
54
- "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2",
55
- "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
56
- "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
57
- "@deepseek-ai/dsh-client-test-runtime": "0.2.0-rc.2",
58
- "@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
59
- "@deepseek-ai/dsh-client-ui-primitives": "0.2.0-rc.2",
60
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
61
- "@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
62
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
63
- "@deepseek-ai/dsh-client-ui-theme": "0.2.0-rc.2",
64
- "@deepseek-ai/dsh-deepseek-account": "0.2.0-rc.2",
65
- "@deepseek-ai/dsh-client-ui-chat": "0.2.0-rc.2",
66
- "@deepseek-ai/dsh-settings": "0.2.0-rc.2",
67
- "@deepseek-ai/dsh-client-ui-settings-models": "0.2.0-rc.2",
68
- "@deepseek-ai/dsh-host-webserver": "0.2.0-rc.2",
69
- "@deepseek-ai/dsh-client-product-analytics": "0.2.0-rc.2"
53
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1",
54
+ "@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.1",
55
+ "@deepseek-ai/dsh-client-locale": "0.2.1-alpha.1",
56
+ "@deepseek-ai/dsh-client-store": "0.2.1-alpha.1",
57
+ "@deepseek-ai/dsh-client-test-runtime": "0.2.1-alpha.1",
58
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-alpha.1",
59
+ "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-alpha.1",
60
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.1",
61
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.1-alpha.1",
62
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.1",
63
+ "@deepseek-ai/dsh-client-ui-theme": "0.2.1-alpha.1",
64
+ "@deepseek-ai/dsh-deepseek-account": "0.2.1-alpha.1",
65
+ "@deepseek-ai/dsh-settings": "0.2.1-alpha.1",
66
+ "@deepseek-ai/dsh-client-ui-chat": "0.2.1-alpha.1",
67
+ "@deepseek-ai/dsh-client-ui-settings-models": "0.2.1-alpha.1",
68
+ "@deepseek-ai/dsh-host-webserver": "0.2.1-alpha.1",
69
+ "@deepseek-ai/dsh-client-product-analytics": "0.2.1-alpha.1"
70
70
  },
71
71
  "files": [
72
72
  "lib/index.js",
@@ -74,7 +74,7 @@
74
74
  "lib/types/**/*.d.ts"
75
75
  ],
76
76
  "dependencies": {
77
- "@deepseek-ai/schemastery": "~3.18.4"
77
+ "@deepseek-ai/schemastery": "~3.18.5-alpha.1"
78
78
  },
79
79
  "scripts": {
80
80
  "bundle": "tsdown",