Kaynağa Gözat

fix(desktop): present installer welcome and package 0.1.6-alpha.1.20260916.2

winewill 5 gün önce
ebeveyn
işleme
c624c2eff0
100 değiştirilmiş dosya ile 230 ekleme ve 94 silme
  1. 6 0
      .agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.i18n.yaml
  2. 23 0
      .agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.md
  3. 23 0
      .agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.zh.md
  4. 1 1
      apps/cli/package.json
  5. 1 1
      apps/desktop-host/package.json
  6. 2 2
      apps/desktop/README.i18n.yaml
  7. 1 1
      apps/desktop/README.md
  8. 1 1
      apps/desktop/README.zh.md
  9. 3 0
      apps/desktop/installer/pages.nsh
  10. 13 0
      apps/desktop/installer/window-frame.cpp
  11. 1 1
      apps/desktop/package.json
  12. 2 1
      apps/desktop/scripts/installer.nsh
  13. 10 0
      apps/desktop/scripts/prepare-windows-installer.ps1
  14. 21 3
      apps/desktop/scripts/test-windows-installer.mjs
  15. 1 0
      apps/desktop/tests/expected/windows-installer.json
  16. 32 0
      apps/desktop/tests/windows-installer-presentation.cpp
  17. 6 0
      apps/desktop/tests/windows-installer-smoke.ps1
  18. 1 1
      apps/web/package.json
  19. 1 1
      package.json
  20. 1 1
      packages/acp/acp/package.json
  21. 1 1
      packages/api/gateway/package.json
  22. 1 1
      packages/api/remotes/package.json
  23. 1 1
      packages/api/session-controller/package.json
  24. 1 1
      packages/api/settings-controller/package.json
  25. 1 1
      packages/api/terminal-controller/package.json
  26. 1 1
      packages/api/workspace-controller/package.json
  27. 1 1
      packages/api/workspace-files/package.json
  28. 1 1
      packages/attachment/attachment-local/package.json
  29. 1 1
      packages/attachment/attachment/package.json
  30. 1 1
      packages/boot/app-boot/package.json
  31. 1 1
      packages/boot/cmdline/package.json
  32. 1 1
      packages/boot/hmr/package.json
  33. 1 1
      packages/boot/plugin-manager/package.json
  34. 1 1
      packages/browser-use/browser-use/package.json
  35. 1 1
      packages/bundle/acp-app/package.json
  36. 1 1
      packages/bundle/base/package.json
  37. 1 1
      packages/bundle/headless/package.json
  38. 1 1
      packages/bundle/sdk-app/package.json
  39. 1 1
      packages/bundle/sdk-minimal/package.json
  40. 1 1
      packages/bundle/web-app/package.json
  41. 1 1
      packages/client/connection/package.json
  42. 1 1
      packages/client/file-upload/package.json
  43. 1 1
      packages/client/hmr/package.json
  44. 1 1
      packages/client/locale/package.json
  45. 1 1
      packages/client/modules/package.json
  46. 1 1
      packages/client/resources/package.json
  47. 1 1
      packages/client/store/package.json
  48. 1 1
      packages/client/ui-agent-preset/package.json
  49. 1 1
      packages/client/ui-approval/package.json
  50. 1 1
      packages/client/ui-attachment/package.json
  51. 1 1
      packages/client/ui-brand-official/package.json
  52. 1 1
      packages/client/ui-chat/package.json
  53. 1 1
      packages/client/ui-commands/package.json
  54. 1 1
      packages/client/ui-conversation/package.json
  55. 1 1
      packages/client/ui-deliverables/package.json
  56. 1 1
      packages/client/ui-directory-picker-browse/package.json
  57. 1 1
      packages/client/ui-directory-picker-native/package.json
  58. 1 1
      packages/client/ui-dockkit/package.json
  59. 1 1
      packages/client/ui-goal/package.json
  60. 1 1
      packages/client/ui-input-trigger/package.json
  61. 1 1
      packages/client/ui-jobs/package.json
  62. 1 1
      packages/client/ui-layout/package.json
  63. 1 1
      packages/client/ui-message-feedback/package.json
  64. 1 1
      packages/client/ui-model-selection/package.json
  65. 1 1
      packages/client/ui-open-in-app/package.json
  66. 1 1
      packages/client/ui-permission-presets/package.json
  67. 1 1
      packages/client/ui-plan/package.json
  68. 1 1
      packages/client/ui-plugin-manager/package.json
  69. 1 1
      packages/client/ui-primitives/package.json
  70. 1 1
      packages/client/ui-reference/package.json
  71. 1 1
      packages/client/ui-renderer/package.json
  72. 1 1
      packages/client/ui-schedule/package.json
  73. 1 1
      packages/client/ui-session/package.json
  74. 1 1
      packages/client/ui-settings-general/package.json
  75. 1 1
      packages/client/ui-settings-models/package.json
  76. 1 1
      packages/client/ui-settings-plugin-inventory/package.json
  77. 1 1
      packages/client/ui-settings-plugins/package.json
  78. 1 1
      packages/client/ui-settings-unarchive-sessions/package.json
  79. 1 1
      packages/client/ui-settings/package.json
  80. 1 1
      packages/client/ui-sidebar-documentpreview/package.json
  81. 1 1
      packages/client/ui-sidebar-files/package.json
  82. 1 1
      packages/client/ui-sidebar-right/package.json
  83. 1 1
      packages/client/ui-sidebar-terminal/package.json
  84. 1 1
      packages/client/ui-sidebar/package.json
  85. 1 1
      packages/client/ui-skill/package.json
  86. 1 1
      packages/client/ui-slots/package.json
  87. 1 1
      packages/client/ui-subagent/package.json
  88. 1 1
      packages/client/ui-theme/package.json
  89. 1 1
      packages/client/ui-tool/package.json
  90. 1 1
      packages/client/ui-trajectory/package.json
  91. 1 1
      packages/client/ui-user-questions/package.json
  92. 1 1
      packages/client/ui-workflow-run/package.json
  93. 1 1
      packages/client/ui-workspace/package.json
  94. 1 1
      packages/client/web/package.json
  95. 1 1
      packages/compaction/command-compact/package.json
  96. 1 1
      packages/compaction/compaction-basic/package.json
  97. 1 1
      packages/compaction/compaction-image-offload/package.json
  98. 1 1
      packages/compaction/compaction-tool-result-pruner/package.json
  99. 1 1
      packages/compaction/compaction/package.json
  100. 1 1
      packages/computer-use/computer-use/package.json

+ 6 - 0
.agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.i18n.yaml

@@ -0,0 +1,6 @@
+# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
+# side as of the last confirmed-consistent state. Both languages carry equal authority;
+# after editing either side, bring the other along and re-record with:
+#   pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.md
+2026-09-16-present-delayed-windows-installer.md: d4ffcfdc1183bbc414cfdd82595053c959a9975c
+2026-09-16-present-delayed-windows-installer.zh.md: bf97ed8a4f6c7184d1e048c21f7975c90fb4a9cb

+ 23 - 0
.agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.md

@@ -0,0 +1,23 @@
+# Agent Note: Present delayed Windows installer
+
+Status: implemented
+
+English | [中文](2026-09-16-present-delayed-windows-installer.zh.md)
+
+## Problem
+
+The native installer hides its window while preparing resources. If the user activates another application during that interval, the welcome page can appear behind that application and seem absent.
+
+## Decision
+
+The first welcome-page display moves the installer above ordinary windows without activating it. When another window owns the foreground, the installer also flashes its taskbar button until foreground interaction. Later page changes do not repeat the move. The window never becomes permanently topmost.
+
+## Alternatives considered
+
+**Force foreground focus.** Windows may reject a background process's foreground request, and taking focus after the user switches applications interrupts their current action.
+
+**Keep the installer topmost.** A persistent topmost window obscures applications the user intentionally opens during installation.
+
+## Consequences
+
+The welcome page becomes visible when preparation completes, while the user retains control of focus and can cover the installer again. A native window-order test and the signed installer smoke test exercise the first display.

+ 23 - 0
.agents/notes/implemented/bug-fix/2026-09-16-present-delayed-windows-installer.zh.md

@@ -0,0 +1,23 @@
+# Agent Note: 延迟显示的 Windows 安装窗口
+
+Status: implemented
+
+[English](2026-09-16-present-delayed-windows-installer.md) | 中文
+
+## Problem
+
+原生安装程序准备资源时会隐藏窗口。如果用户在此期间激活其他应用,欢迎页可能出现在该应用后面,看起来像没有启动。
+
+## Decision
+
+欢迎页首次显示时,安装窗口会移到普通窗口前方,但不抢占焦点。如果其他窗口位于前台,安装程序还会闪烁任务栏按钮,直至用户进行前台交互。后续页面切换不会重复置前。安装窗口不会永久置顶。
+
+## Alternatives considered
+
+**强制获取前台焦点。** Windows 可能拒绝后台进程的前台请求,而且用户切换应用后再抢回焦点会打断当前操作。
+
+**让安装窗口始终置顶。** 持续置顶会遮挡用户在安装期间主动打开的其他应用。
+
+## Consequences
+
+准备完成时欢迎页可见,用户仍能控制焦点,也可以再次用其他窗口覆盖安装程序。原生窗口顺序测试和签名安装程序冒烟测试覆盖首次显示。

+ 1 - 1
apps/cli/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh",
   "description": "dsh CLI: profile launch, plugin management, and configuration inspection",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
apps/desktop-host/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-desktop-host",
   "description": "Private Node-mode host process for the Electron desktop application",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "private": true,
   "license": "MIT",
   "type": "module",

+ 2 - 2
apps/desktop/README.i18n.yaml

@@ -2,5 +2,5 @@
 # side as of the last confirmed-consistent state. Both languages carry equal authority;
 # after editing either side, bring the other along and re-record with:
 #   pnpm run verify-translation-pairing --write apps/desktop/README.md
-README.md: 528efff5c89e8c195dcf27ed922ff8e0dc478355
-README.zh.md: 089cfb1f3c120fbe7a7d1c3d9ae88350c3f8cbe7
+README.md: 503e2a937f4c49a49be6af8deb024db22a0b59f5
+README.zh.md: a3ebd75f25e155f2ce6dd8845e141622a4d05ea7

+ 1 - 1
apps/desktop/README.md

@@ -193,7 +193,7 @@ The command requires `DSH_DESKTOP_APP_ID` and the normal build dependencies, inc
 
 The Windows installer uses native NSIS pages with light and dark palettes, system shadows, an editable installation directory, and a finish page whose launch checkbox is selected by default. Installation is restricted to the current user. Clicking Install or pressing Enter validates the current path; new destinations must be empty, and nonempty destinations must be registered installations. Running executables at the affected installation path produce a native prompt and remain running; same-named applications in other directories do not block installation. Silent updates wait up to ten seconds for the affected application to exit, then stop with exit code 2 if it is still running.
 
-The theme follows Windows at startup; `/THEME=light`, `/THEME=dark`, and `/THEME=auto` select a palette explicitly. The window appears after its branded controls are ready. Progress reads the pinned 7-Zip extractor’s percentage; directory promotion, registration, and cleanup retain bounded estimates. The weighted percentage does not predict remaining time. After NSIS reports success, the bar fills over 600 ms and displays 100% briefly before the finish page appears; the transition targets 750 ms. The finish page preserves the window position. Finish dismisses the installer before launching the installed executable; a launch failure restores the page for retry. Directory replacement and failure recovery follow the installation flow described above. First-launch profile preparation remains a separate Desktop operation.
+The theme follows Windows at startup; `/THEME=light`, `/THEME=dark`, and `/THEME=auto` select a palette explicitly. The window appears after its branded controls are ready. When the welcome page first appears, the installer moves above ordinary windows once and flashes its taskbar button if another window has focus; it does not remain always on top. Progress reads the pinned 7-Zip extractor’s percentage; directory promotion, registration, and cleanup retain bounded estimates. The weighted percentage does not predict remaining time. After NSIS reports success, the bar fills over 600 ms and displays 100% briefly before the finish page appears; the transition targets 750 ms. The finish page preserves the window position. Finish dismisses the installer before launching the installed executable; a launch failure restores the page for retry. Directory replacement and failure recovery follow the installation flow described above. First-launch profile preparation remains a separate Desktop operation.
 
 Windows packaging compiles an x86 Win32/GDI+ helper with Visual C++ Build Tools and a Windows SDK; signed builds sign this helper through the configured Windows signer. The preparation hook leaves production dependency collection to electron-builder on every platform. The [installer decision](../../.agents/notes/implemented/architecture/2026-09-10-windows-native-installer-pages.md) records the NSIS integration and release checks.
 

+ 1 - 1
apps/desktop/README.zh.md

@@ -193,7 +193,7 @@ pnpm run package:desktop:win:x64:unsigned
 
 Windows 安装程序使用原生 NSIS 页面,提供亮暗配色、系统阴影、可编辑的安装目录,以及默认勾选立即启动的完成页。安装仅面向当前用户。点击安装或按 Enter 均校验当前路径;新安装位置必须为空,非空位置必须是已登记的安装目录。受影响安装路径中的程序运行时显示系统提示,并保持应用运行;其他目录中的同名应用不阻止安装。静默更新最多等待受影响应用退出十秒,若仍在运行则以退出码 2 结束。
 
-主题在启动时跟随 Windows;可用 `/THEME=light`、`/THEME=dark` 和 `/THEME=auto` 显式选择配色。窗口在品牌控件准备完成后显示。进度读取锁定版本的 7-Zip 解压器百分比;目录替换、注册和清理仍使用有界估算。加权百分比不代表剩余时间。NSIS 报告成功后,进度条用 600 毫秒补满并短暂显示 100%,再显示完成页;切换目标时长为 750 毫秒。完成页保留窗口位置。点击完成后,安装程序先隐藏窗口,再启动已安装的可执行文件;启动失败会恢复页面以供重试。目录替换和失败恢复遵循上文描述的安装流程。首次启动的配置档案准备仍属于独立的 Desktop 操作。
+主题在启动时跟随 Windows;可用 `/THEME=light`、`/THEME=dark` 和 `/THEME=auto` 显式选择配色。窗口在品牌控件准备完成后显示。欢迎页首次出现时,安装窗口会一次性移到普通窗口前方;若焦点在其他窗口,任务栏按钮会闪烁提示,但安装窗口不会始终置顶。进度读取锁定版本的 7-Zip 解压器百分比;目录替换、注册和清理仍使用有界估算。加权百分比不代表剩余时间。NSIS 报告成功后,进度条用 600 毫秒补满并短暂显示 100%,再显示完成页;切换目标时长为 750 毫秒。完成页保留窗口位置。点击完成后,安装程序先隐藏窗口,再启动已安装的可执行文件;启动失败会恢复页面以供重试。目录替换和失败恢复遵循上文描述的安装流程。首次启动的配置档案准备仍属于独立的 Desktop 操作。
 
 Windows 打包使用 Visual C++ Build Tools 和 Windows SDK 编译 x86 Win32/GDI+ 辅助库;签名构建通过已配置的 Windows 签名器对该库签名。准备钩子在所有平台上均由 electron-builder 继续负责收集生产依赖。[安装界面决策](../../.agents/notes/implemented/architecture/2026-09-10-windows-native-installer-pages.zh.md)记录 NSIS 接入方式和发布验证要求。
 

+ 3 - 0
apps/desktop/installer/pages.nsh

@@ -167,6 +167,9 @@ Function InstallerCreate
     System::Call 'user32::SetPropW(p $HWNDPARENT, w "HarnessInstaller.Ready", p 1)'
     ShowWindow $InstallerDialog 5
     ShowWindow $HWNDPARENT 5
+    ${If} $InstallerPhase == "welcome"
+        System::Call '$PLUGINSDIR\window-frame.dll::InstallerPresentWelcome(p $HWNDPARENT) i.r0 ?c'
+    ${EndIf}
     nsDialogs::Show
     ${NSD_KillTimer} InstallerValidateEditedPath
     ${NSD_FreeImage} $InstallerImage

+ 13 - 0
apps/desktop/installer/window-frame.cpp

@@ -242,3 +242,16 @@ extern "C" __declspec(dllexport) HRESULT __cdecl InstallerApplyFrame(HWND window
                  SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
     return result;
 }
+
+// Present the first interactive page after resource preparation without keeping the installer topmost.
+extern "C" __declspec(dllexport) BOOL __cdecl InstallerPresentWelcome(HWND window) {
+    if (!IsWindowVisible(window)) return FALSE;
+    if (!SetWindowPos(window, HWND_TOP, 0, 0, 0, 0,
+                      SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE)) return FALSE;
+    if (GetForegroundWindow() != window) {
+        FLASHWINFO flash = {sizeof(flash), window, FLASHW_TRAY | FLASHW_TIMERNOFG, 0, 0};
+        FlashWindowEx(&flash);
+    }
+    SetPropW(window, L"HarnessInstaller.Presented", reinterpret_cast<HANDLE>(1));
+    return TRUE;
+}

+ 1 - 1
apps/desktop/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-desktop",
   "description": "Electron desktop shell for a bundled dsh runtime and external plugins",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "private": true,
   "license": "MIT",
   "type": "module",

+ 2 - 1
apps/desktop/scripts/installer.nsh

@@ -8,7 +8,8 @@
 !endif
 
 !macro customHeader
-  !include "${INSTALLER_SOURCE_DIR}\strings.nsh"
+  !define /ifndef INSTALLER_STRINGS_FILE "${INSTALLER_SOURCE_DIR}\strings.nsh"
+  !include "${INSTALLER_STRINGS_FILE}"
   !ifndef BUILD_UNINSTALLER
     !include "${INSTALLER_SOURCE_DIR}\theme.nsh"
     !include "${INSTALLER_SOURCE_DIR}\pages.nsh"

+ 10 - 0
apps/desktop/scripts/prepare-windows-installer.ps1

@@ -29,6 +29,16 @@ if ($TestProgress -or $CompileProgressOnly) {
         & $testExecutable
         if ($LASTEXITCODE -ne 0) { throw 'Progress timeline regression failed.' }
     }
+    $presentationSource = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '../tests/windows-installer-presentation.cpp'))
+    $presentationExecutable = Join-Path $output 'presentation-test.exe'
+    $presentationScript = Join-Path $output 'compile-presentation-test.cmd'
+    [IO.File]::WriteAllLines($presentationScript, @('@echo off', ('call "{0}" >nul' -f $vcvars), 'if errorlevel 1 exit /b %errorlevel%', ('cl /nologo /MT /W4 /WX /EHsc "{0}" /Fo"{1}" /Fe"{2}" /link "{3}" user32.lib' -f $presentationSource, (Join-Path $output 'presentation-test.obj'), $presentationExecutable, (Join-Path $output 'window-frame.lib'))), [Text.Encoding]::Default)
+    & $env:ComSpec /d /c $presentationScript
+    if ($LASTEXITCODE -ne 0) { throw 'Installer presentation test compilation failed.' }
+    if ($TestProgress) {
+        & $presentationExecutable
+        if ($LASTEXITCODE -ne 0) { throw 'Installer presentation regression failed.' }
+    }
 }
 Add-Type -AssemblyName System.Drawing
 foreach ($asset in @('brand', 'brand-2x', 'brand-dark', 'brand-dark-2x', 'uninstaller-sidebar')) {

+ 21 - 3
apps/desktop/scripts/test-windows-installer.mjs

@@ -1,13 +1,14 @@
 /** Builds an isolated native payload through the production NSIS configuration and exercises its UI. */
 import { execFile } from 'node:child_process'
 import { randomUUID } from 'node:crypto'
-import { mkdir, mkdtemp, writeFile } from 'node:fs/promises'
+import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises'
 import { createRequire } from 'node:module'
 import { join } from 'node:path'
 import { fileURLToPath } from 'node:url'
 import { promisify } from 'node:util'
 import { createWindowsTokenSigner, installWindowsNsisBootstrapSigner, scrubWindowsSigningEnvironment } from './windows-sign.mjs'
 import { loadDesktopPackageEnvironment } from './desktop-package-environment.mjs'
+import { createPackagingRun } from './packaging-run.mjs'
 
 if (process.platform !== 'win32' || process.arch !== 'x64') {
   throw new Error('Installer UI checks require an interactive Windows x64 desktop')
@@ -27,29 +28,39 @@ const payload = join(output, 'payload')
 await mkdir(join(payload, 'resources'), { recursive: true })
 const previousEnvironment = { ...process.env }
 const signingEnvironment = process.argv.includes('--signed') ? loadDesktopPackageEnvironment('win32') : {}
+const signingRun = process.argv.includes('--signed')
+  ? createPackagingRun(join(output, 'packaging-runs'), { target: 'installer-test' }) : undefined
 const sign = process.argv.includes('--signed') ? createWindowsTokenSigner({
   certificateFile: signingEnvironment.DSH_DESKTOP_WINDOWS_CER_FILE,
   signTool: signingEnvironment.DSH_DESKTOP_WINDOWS_SIGNTOOL,
   tokenPin: signingEnvironment.DSH_DESKTOP_WINDOWS_TOKEN_PIN,
   keyContainer: signingEnvironment.DSH_DESKTOP_WINDOWS_KEY_CONTAINER,
+  runDirectory: signingRun.directory,
 }) : undefined
+let succeeded = false
 try {
   Object.assign(process.env, {
     DSH_DESKTOP_APP_ID: `com.deepseek.harness.installertest.n${id}`,
     DSH_DESKTOP_TARGET_PLATFORM: 'win32', DSH_DESKTOP_TARGET_ARCH: 'x64',
     DSH_DESKTOP_UNSIGNED: '1', CSC_IDENTITY_AUTO_DISCOVERY: 'false', ELECTRON_BUILDER_7Z_FILTER: 'BCJ',
+    DSH_DESKTOP_MANDATORY_UPDATE_TEST_ORIGIN: signingEnvironment.DSH_DESKTOP_MANDATORY_UPDATE_TEST_ORIGIN
+      ?? 'https://harness-test.deepseek.com',
+    ...signingRun ? { DSH_DESKTOP_PACKAGING_RUN_DIR: signingRun.directory } : {},
   })
   const { createElectronBuilderConfig } = await import('../electron-builder.config.mjs')
   const childOptions = { env: scrubWindowsSigningEnvironment(process.env), windowsHide: true, maxBuffer: 8 * 1024 * 1024 }
   await execute('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File',
     join(appRoot, 'scripts', 'prepare-windows-installer.ps1'), '-OutputDirectory', join(output, 'ui'), '-CompileProgressOnly'], childOptions)
   const progressTest = join(output, 'ui', 'progress-test.exe')
+  const presentationTest = join(output, 'ui', 'presentation-test.exe')
   if (sign) {
     await sign({ path: progressTest, hash: 'sha256', isNest: false })
+    await sign({ path: presentationTest, hash: 'sha256', isNest: false })
     await sign({ path: join(output, 'ui', 'window-frame.dll'), hash: 'sha256', isNest: false })
     installWindowsNsisBootstrapSigner({ sign })
   }
   await execute(progressTest, [], childOptions)
+  await execute(presentationTest, [], childOptions)
   const payloadSource = join(output, 'payload.nsi')
   await writeFile(payloadSource, `Unicode true
 RequestExecutionLevel user
@@ -67,8 +78,7 @@ SectionEnd
   const compiler = await getMakeNsisPath()
   await execute(compiler.path, ['/V2', payloadSource], { ...childOptions, env: { ...childOptions.env, ...compiler.env } })
   if (sign) await sign({ path: join(payload, `${productName}.exe`), hash: 'sha256', isNest: false })
-  const include = join(output, 'include.nsh')
-  await writeFile(include, `!define INSTALLER_BUILD_DIR "${join(output, 'ui')}"\n!include "${join(appRoot, 'scripts', 'installer.nsh')}"\n`)
+  const sourceStrings = await readFile(join(appRoot, 'installer', 'strings.nsh'), 'utf8')
   const config = createElectronBuilderConfig()
   if (sign) {
     config.win.forceCodeSigning = true
@@ -77,6 +87,12 @@ SectionEnd
   for (const language of ['en_US', 'zh_CN']) {
     const languageOutput = join(output, language)
     await mkdir(languageOutput)
+    const strings = join(languageOutput, 'strings.nsh')
+    const languageId = language === 'en_US' ? 'ENGLISH' : 'SIMPCHINESE'
+    await writeFile(strings, sourceStrings.split('\n').filter((line) =>
+      !line.startsWith('LangString ') || line.includes(`\${LANG_${languageId}}`)).join('\n'))
+    const include = join(languageOutput, 'include.nsh')
+    await writeFile(include, `!define INSTALLER_BUILD_DIR "${join(output, 'ui')}"\n!define INSTALLER_STRINGS_FILE "${strings}"\n!include "${join(appRoot, 'scripts', 'installer.nsh')}"\n`)
     await build({ projectDir: appRoot, prepackaged: payload, targets: Platform.WINDOWS.createTarget(['nsis'], Arch.x64), publish: 'never',
       config: { ...config, productName, artifactName: 'installer-test.exe', directories: { output: languageOutput },
         nsis: { ...config.nsis, guid, include, installerLanguages: [language] }, beforeBuild: undefined, afterPack: undefined, afterSign: undefined, artifactBuildCompleted: undefined },
@@ -86,7 +102,9 @@ SectionEnd
       '-ProductName', productName, '-RegistryKey', guid, '-OutputDirectory', languageOutput], childOptions)
     process.stdout.write(`${language}\n${result.stdout}`)
   }
+  succeeded = true
 } finally {
+  signingRun?.finish(succeeded)
   for (const name of Object.keys(process.env)) if (!(name in previousEnvironment)) delete process.env[name]
   Object.assign(process.env, previousEnvironment)
   process.stdout.write(`Installer test artifacts: ${output}\n`)

+ 1 - 0
apps/desktop/tests/expected/windows-installer.json

@@ -5,6 +5,7 @@
     "enter-validates-current-path-and-unchecked-launch",
     "completion-preserves-window-position",
     "welcome-ready-before-first-show",
+    "welcome-presented-on-first-show",
     "successful-install-paints-100-before-finish",
     "registered-directory-with-trailing-separators",
     "registered-directory-and-checked-launch",

+ 32 - 0
apps/desktop/tests/windows-installer-presentation.cpp

@@ -0,0 +1,32 @@
+#define WIN32_LEAN_AND_MEAN
+#define UNICODE
+#include <windows.h>
+
+extern "C" __declspec(dllimport) BOOL __cdecl InstallerPresentWelcome(HWND window);
+
+static bool Above(HWND upper, HWND lower) {
+    for (HWND current = GetWindow(lower, GW_HWNDPREV); current;
+         current = GetWindow(current, GW_HWNDPREV)) {
+        if (current == upper) return true;
+    }
+    return false;
+}
+
+int wmain() {
+    HINSTANCE instance = GetModuleHandleW(nullptr);
+    HWND installer = CreateWindowExW(0, L"STATIC", L"Installer", WS_POPUP,
+                                     100, 100, 300, 300, nullptr, nullptr, instance, nullptr);
+    HWND other = CreateWindowExW(0, L"STATIC", L"Other", WS_POPUP,
+                                 120, 120, 300, 300, nullptr, nullptr, instance, nullptr);
+    if (!installer || !other) return 1;
+    ShowWindow(installer, SW_SHOW);
+    ShowWindow(other, SW_SHOW);
+    if (!Above(other, installer)) return 2;
+    if (!InstallerPresentWelcome(installer)) return 3;
+    if (!Above(installer, other)) return 4;
+    if (GetWindowLongPtrW(installer, GWL_EXSTYLE) & WS_EX_TOPMOST) return 5;
+    if (GetPropW(installer, L"HarnessInstaller.Presented") != reinterpret_cast<HANDLE>(1)) return 6;
+    DestroyWindow(other);
+    DestroyWindow(installer);
+    return 0;
+}

+ 6 - 0
apps/desktop/tests/windows-installer-smoke.ps1

@@ -43,6 +43,11 @@ function Start-Setup([string]$Theme, [string]$Path = $installPath) {
         Start-Sleep -Milliseconds 5
     } while ($timer.Elapsed.TotalSeconds -lt 30)
     if ($window -eq [IntPtr]::Zero) { throw 'Installer welcome window did not appear' }
+    $timer.Restart()
+    while ([InstallerCapture]::GetProp($window, 'HarnessInstaller.Presented') -eq [IntPtr]::Zero) {
+        if ($process.HasExited -or $timer.Elapsed.TotalSeconds -gt 10) { throw 'Installer welcome window was not presented' }
+        Start-Sleep -Milliseconds 10
+    }
     [InstallerCapture]::Reveal($window)
     $languages = @($localizedCopy.Keys | Where-Object {
         [InstallerCapture]::FindButton($process.Id, $localizedCopy[$_].INSTALLER_INSTALL) -ne [IntPtr]::Zero
@@ -127,6 +132,7 @@ function Run-Silent([string]$Arguments, [int]$Code) {
 }
 try {
     $process = Start-Setup light
+    $results.Add('welcome-presented-on-first-show')
     $window = [InstallerCapture]::Find($process.Id)
     [void][InstallerCapture]::Save($window, (Join-Path $OutputDirectory 'light-welcome.png'))
     Click-Control $process $copy.INSTALLER_CHOOSE_PATH

+ 1 - 1
apps/web/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-web-frontend",
   "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "@deepseek-ai/dsh-root",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "license": "MIT",
   "private": true,
   "type": "module",

+ 1 - 1
packages/acp/acp/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-acp",
   "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/gateway/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-gateway",
   "description": "Typert Remote Host dispatcher and Client API endpoint",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/remotes/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-remotes",
   "description": "Remote BFF assembly for application-selected Host capabilities",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/session-controller/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-session-controller",
   "description": "Session Remote commands, cold reads, and live control transport",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/settings-controller/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-settings-controller",
   "description": "Remote owner for the configuration surfaces over the settings-domain seams",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/terminal-controller/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-terminal-controller",
   "description": "Session-owned interactive terminals with shell discovery, screen recovery and typed Remote control",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/workspace-controller/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-workspace-controller",
   "description": "Workspace Remote commands and reconnect-safe state transport",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/api/workspace-files/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-api-workspace-files",
   "description": "Workspace file service and Client resource provider: bounded reads, directory listing, and live metadata over the workspaceFiles Remote namespace",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/attachment/attachment-local/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-attachment-local",
   "description": "Private content-addressed DSH_HOME attachment storage",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/attachment/attachment/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-attachment",
   "description": "Durable immutable attachment storage seam for the DeepSeek Harness",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/boot/app-boot/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-app-boot",
   "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/boot/cmdline/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-cmdline",
   "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/boot/hmr/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-hmr",
   "description": "Coordinated module and profile configuration hot reload",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/boot/plugin-manager/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-plugin-manager",
   "description": "Current-profile plugin and bundle management shared by dsh CLI, Web and agent tools",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/browser-use/browser-use/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-browser-use",
   "description": "Exclusive named browser-use provider registration",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/bundle/acp-app/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-acp-app",
   "description": "The dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-base",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/bundle/base/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-base",
   "description": "The shared dsh core as a profile bundle: the first patch layer of base-backed profiles, inserting core rows over the empty profile root",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/bundle/headless/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-headless",
   "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/bundle/sdk-app/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-sdk-app",
   "description": "The dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-base",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/bundle/sdk-minimal/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-sdk-minimal",
   "description": "The standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessions",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/bundle/web-app/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-web-app",
   "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/connection/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-connection",
   "description": "Authenticated RPC transport and generation lifecycle",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/file-upload/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-file-upload",
   "description": "Agent-scoped browser file upload, streaming intake, and staged receipt service",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/hmr/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-hmr",
   "description": "Web client graph synchronization and rebuilt-bundle reload transport",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/locale/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-locale",
   "description": "Locale plugin: Host-backed preference, extensible language catalog, browser fallback, and typed built-in dictionaries",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/modules/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-modules",
   "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/resources/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-resources",
   "description": "Unified client resource model: protocol-registered providers turn URL addresses into live values, consumed through the useResource global standard hook",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/store/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-store",
   "description": "React-free observable and snapshot-store contracts with the shared Zustand/Immer engine",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-agent-preset/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-agent-preset",
   "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-approval/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-approval",
   "description": "Approval composer takeover over the scoped Remote Event waterfall",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-attachment/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-attachment",
   "description": "Dynamic attachment presentation plugin for conversation input, message-image, and trajectory image slots",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-brand-official/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-brand-official",
   "description": "Official DeepSeek Harness brand occupants for the Web client's sidebar slots",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-chat/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-chat",
   "description": "Chat Conversation target, node definitions, renderers, and details surface",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-commands/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-commands",
   "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-conversation/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-conversation",
   "description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-deliverables/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-deliverables",
   "description": "Produced-files turn tail and clickable final-response file references for Web",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-directory-picker-browse/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse",
   "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-directory-picker-native/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-directory-picker-native",
   "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-dockkit/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-dockkit",
   "description": "Docking layout kit: split-tree engine with invertible operations, and the React components that render and drive it (zero cordis)",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-goal/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-goal",
   "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-input-trigger/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-input-trigger",
   "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-jobs/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-jobs",
   "description": "Session-header background-job list: live registry state mirrored from session/jobs frames",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "type": "module",
   "main": "lib/index.js",
   "types": "lib/types/index.d.ts",

+ 1 - 1
packages/client/ui-layout/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-layout",
   "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-message-feedback/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-message-feedback",
   "description": "The Web feedback surface: per-message Like/Dislike in the assistant-message action strip and the feedback dialog behind both ratings and /feedback, backed by the messageFeedback and sessionFeedback Host Remotes",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-model-selection/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-model-selection",
   "description": "Model selection over the shared model catalog, Session projection, and session.selectModel",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-open-in-app/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-open-in-app",
   "description": "Web Session-header \"Open In...\" split button opening the session workspace directory in a locally installed application",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-permission-presets/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-permission-presets",
   "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-plan/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-plan",
   "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-plugin-manager/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-plugin-manager",
   "description": "Plugin management for the dsh web client: the sidebar Plugins panel installs, enables, disables, retries, and composes installed plugin packages",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-primitives/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-primitives",
   "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-reference/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-reference",
   "description": "Unified Web @file and @session reference source",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-renderer/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-renderer",
   "description": "Browser UI renderer: React slot bindings, ctx.uiRenderer, and the assembled application root",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-schedule/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-schedule",
   "description": "Read-only active Schedule catalog in the Web Session header",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "type": "module",
   "main": "lib/index.js",
   "types": "lib/types/index.d.ts",

+ 1 - 1
packages/client/ui-session/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-session",
   "description": "Session Controller adapter for React and session-scoped slots",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-settings-general/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-settings-general",
   "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-settings-models/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-settings-models",
   "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-settings-plugin-inventory/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory",
   "description": "Read-only Cordis Loader inventory tab in Web Plugins settings",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-settings-plugins/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-settings-plugins",
   "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-settings-unarchive-sessions/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-settings-unarchive-sessions",
   "description": "Archived-session settings page: the registry-global archive set with one Unarchive action per row",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-settings/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-settings",
   "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-sidebar-documentpreview/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-sidebar-documentpreview",
   "description": "Extensible document previews for Sidebar files: Markdown, highlighted code, images, PDF, HTML, and plain text",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-sidebar-files/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-sidebar-files",
   "description": "Workspace file tree tab type for the right Sidebar: lazy directory listing over the workspaceFiles Remote namespace, opening files into the Sidebar",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-sidebar-right/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-sidebar-right",
   "description": "Right Sidebar: the docking surface's session-bound state, its panel and header expand control, and the navigation service over it",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-sidebar-terminal/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-sidebar-terminal",
   "description": "Interactive shell tabs for the right Sidebar",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-sidebar/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-sidebar",
   "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-skill/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-skill",
   "description": "Web skill references and the dedicated skill tool row",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-slots/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-slots",
   "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-subagent/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-subagent",
   "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-theme/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-theme",
   "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-tool/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-tool",
   "description": "Client Tool call-tree renderer and keyed per-tool presentation slot",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-trajectory/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-trajectory",
   "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-user-questions/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-user-questions",
   "description": "Web ask_user_question composer takeover and plan-review presentation UI",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-workflow-run/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-workflow-run",
   "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/ui-workspace/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-ui-workspace",
   "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/client/web/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-client-web",
   "description": "Web boot kernel: static module table, Cordis loader, framework-free boot page, and UI-renderer handoff",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/compaction/command-compact/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-command-compact",
   "description": "Human-facing slash command for explicit session compaction",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/compaction/compaction-basic/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-compaction-basic",
   "description": "Token-meter-driven compaction policy and LLM summarization backend for the DeepSeek Harness",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/compaction/compaction-image-offload/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-compaction-image-offload",
   "description": "Durable image offload for image-capable routes: replace over-budget request images with placeholders and retry",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/compaction/compaction-tool-result-pruner/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-compaction-tool-result-pruner",
   "description": "Replay-safe model-free head/middle/tail pruning for tool-result surface nodes",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/compaction/compaction/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-compaction",
   "description": "Abstract compaction service seam (ctx.compaction) for the DeepSeek Harness",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

+ 1 - 1
packages/computer-use/computer-use/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@deepseek-ai/dsh-computer-use",
   "description": "Exclusive named computer-use provider registration",
-  "version": "0.1.6-alpha.1.20260916.1",
+  "version": "0.1.6-alpha.1.20260916.2",
   "publishConfig": {
     "access": "public"
   },

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor