dsh-cliworker-now 0.7.6 → 0.7.8

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.
Files changed (181) hide show
  1. package/README.en.md +53 -11
  2. package/README.md +56 -11
  3. package/lib/account-models.mjs +49 -18
  4. package/lib/client.js +1221 -151
  5. package/lib/client.js.map +1 -1
  6. package/lib/grok-catalog.mjs +2 -2
  7. package/lib/hermes-native-entry.py +48 -13
  8. package/lib/hermes-nous-refresh.py +331 -0
  9. package/lib/index.js +9469 -6030
  10. package/lib/index.js.map +1 -1
  11. package/lib/native-launch.mjs +62 -7
  12. package/lib/native-spawn.mjs +32 -0
  13. package/lib/pi-installation.mjs +27 -3
  14. package/lib/pi-native-catalog.mjs +17 -7
  15. package/lib/pi-omp-bridge.mjs +2 -2
  16. package/lib/pi-omp-refresh.mjs +3 -3
  17. package/lib/private-launch.mjs +6 -2
  18. package/lib/terminal-bridge.mjs +2 -2
  19. package/lib/typert.host.js +265 -25
  20. package/lib/typert.remote-client.d.ts +8 -0
  21. package/lib/typert.remote-client.d.ts.map +1 -1
  22. package/lib/typert.remote-client.js +241 -25
  23. package/lib/types/client/account-query-queue.d.ts +16 -0
  24. package/lib/types/client/account-query-queue.js +61 -0
  25. package/lib/types/client/account-query-queue.js.map +1 -0
  26. package/lib/types/client/account-terminal.d.ts +6 -2
  27. package/lib/types/client/account-terminal.js +260 -31
  28. package/lib/types/client/account-terminal.js.map +1 -1
  29. package/lib/types/client/cli-executable-settings.d.ts +13 -0
  30. package/lib/types/client/cli-executable-settings.js +128 -0
  31. package/lib/types/client/cli-executable-settings.js.map +1 -0
  32. package/lib/types/client/management-styles.d.ts +1 -1
  33. package/lib/types/client/management-styles.js +4 -0
  34. package/lib/types/client/management-styles.js.map +1 -1
  35. package/lib/types/client/settings-dialog.js +196 -80
  36. package/lib/types/client/settings-dialog.js.map +1 -1
  37. package/lib/types/client/styles.d.ts +1 -1
  38. package/lib/types/client/styles.js +18 -16
  39. package/lib/types/client/styles.js.map +1 -1
  40. package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
  41. package/lib/types/client/zcode-login-link-provider.js +105 -0
  42. package/lib/types/client/zcode-login-link-provider.js.map +1 -0
  43. package/lib/types/client/zcode-login-link.d.ts +16 -0
  44. package/lib/types/client/zcode-login-link.js +194 -0
  45. package/lib/types/client/zcode-login-link.js.map +1 -0
  46. package/lib/types/host/account-models.d.mts +10 -2
  47. package/lib/types/host/account-models.mjs +49 -18
  48. package/lib/types/host/accounts.d.ts +3 -2
  49. package/lib/types/host/accounts.js +168 -29
  50. package/lib/types/host/accounts.js.map +1 -1
  51. package/lib/types/host/adapters.d.ts +3 -1
  52. package/lib/types/host/adapters.js +138 -11
  53. package/lib/types/host/adapters.js.map +1 -1
  54. package/lib/types/host/agy-background-environment.d.ts +2 -0
  55. package/lib/types/host/agy-background-environment.js +7 -0
  56. package/lib/types/host/agy-background-environment.js.map +1 -0
  57. package/lib/types/host/agy-models.d.ts +2 -1
  58. package/lib/types/host/agy-models.js +6 -6
  59. package/lib/types/host/agy-models.js.map +1 -1
  60. package/lib/types/host/agy-windows-account.d.ts +14 -0
  61. package/lib/types/host/agy-windows-account.js +104 -0
  62. package/lib/types/host/agy-windows-account.js.map +1 -0
  63. package/lib/types/host/authorized-catalog.js +13 -4
  64. package/lib/types/host/authorized-catalog.js.map +1 -1
  65. package/lib/types/host/claude-native-oauth.d.ts +17 -0
  66. package/lib/types/host/claude-native-oauth.js +274 -0
  67. package/lib/types/host/claude-native-oauth.js.map +1 -0
  68. package/lib/types/host/claude-own-route.d.ts +45 -0
  69. package/lib/types/host/claude-own-route.js +375 -0
  70. package/lib/types/host/claude-own-route.js.map +1 -0
  71. package/lib/types/host/cli-account-binding.d.ts +2 -1
  72. package/lib/types/host/cli-account-binding.js +64 -21
  73. package/lib/types/host/cli-account-binding.js.map +1 -1
  74. package/lib/types/host/cli-executable-paths.d.ts +30 -0
  75. package/lib/types/host/cli-executable-paths.js +272 -0
  76. package/lib/types/host/cli-executable-paths.js.map +1 -0
  77. package/lib/types/host/codex-models.d.ts +3 -1
  78. package/lib/types/host/codex-models.js +41 -4
  79. package/lib/types/host/codex-models.js.map +1 -1
  80. package/lib/types/host/extended-adapters.d.ts +3 -2
  81. package/lib/types/host/extended-adapters.js +9 -7
  82. package/lib/types/host/extended-adapters.js.map +1 -1
  83. package/lib/types/host/first-party-models.d.ts +5 -0
  84. package/lib/types/host/first-party-models.js +173 -50
  85. package/lib/types/host/first-party-models.js.map +1 -1
  86. package/lib/types/host/hermes-accounts.js +68 -9
  87. package/lib/types/host/hermes-accounts.js.map +1 -1
  88. package/lib/types/host/hermes-adapter.d.ts +3 -0
  89. package/lib/types/host/hermes-adapter.js +13 -4
  90. package/lib/types/host/hermes-adapter.js.map +1 -1
  91. package/lib/types/host/hermes-installation.js +54 -35
  92. package/lib/types/host/hermes-installation.js.map +1 -1
  93. package/lib/types/host/hermes-models.js +21 -2
  94. package/lib/types/host/hermes-models.js.map +1 -1
  95. package/lib/types/host/hermes-native-entry.py +48 -13
  96. package/lib/types/host/hermes-nous-refresh.py +331 -0
  97. package/lib/types/host/hermes-nous.d.ts +5 -1
  98. package/lib/types/host/hermes-nous.js +5 -5
  99. package/lib/types/host/hermes-nous.js.map +1 -1
  100. package/lib/types/host/hermes-renewal.d.ts +27 -0
  101. package/lib/types/host/hermes-renewal.js +292 -0
  102. package/lib/types/host/hermes-renewal.js.map +1 -0
  103. package/lib/types/host/hermes-windows-installation.d.ts +5 -0
  104. package/lib/types/host/hermes-windows-installation.js +91 -0
  105. package/lib/types/host/hermes-windows-installation.js.map +1 -0
  106. package/lib/types/host/index.d.ts +12 -0
  107. package/lib/types/host/index.js +138 -8
  108. package/lib/types/host/index.js.map +1 -1
  109. package/lib/types/host/kimi-accounts.d.ts +2 -0
  110. package/lib/types/host/kimi-accounts.js +4 -2
  111. package/lib/types/host/kimi-accounts.js.map +1 -1
  112. package/lib/types/host/kimi-oauth-models.d.ts +14 -0
  113. package/lib/types/host/kimi-oauth-models.js +246 -0
  114. package/lib/types/host/kimi-oauth-models.js.map +1 -0
  115. package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
  116. package/lib/types/host/mimo-metadata-cache.js +121 -0
  117. package/lib/types/host/mimo-metadata-cache.js.map +1 -0
  118. package/lib/types/host/native-capability-cache.d.ts +11 -0
  119. package/lib/types/host/native-capability-cache.js +94 -0
  120. package/lib/types/host/native-capability-cache.js.map +1 -0
  121. package/lib/types/host/native-launch.mjs +62 -7
  122. package/lib/types/host/native-process.d.ts +3 -1
  123. package/lib/types/host/native-process.js +30 -5
  124. package/lib/types/host/native-process.js.map +1 -1
  125. package/lib/types/host/native-spawn.mjs +32 -0
  126. package/lib/types/host/opencode-native.js +13 -0
  127. package/lib/types/host/opencode-native.js.map +1 -1
  128. package/lib/types/host/pi-installation.d.mts +1 -1
  129. package/lib/types/host/pi-installation.mjs +27 -3
  130. package/lib/types/host/pi-omp-adapter.js +17 -3
  131. package/lib/types/host/pi-omp-adapter.js.map +1 -1
  132. package/lib/types/host/pi-omp-native.js +5 -3
  133. package/lib/types/host/pi-omp-native.js.map +1 -1
  134. package/lib/types/host/pi-omp-refresh.mjs +3 -3
  135. package/lib/types/host/private-launch.mjs +23 -0
  136. package/lib/types/host/process.d.ts +3 -0
  137. package/lib/types/host/process.js +3 -1
  138. package/lib/types/host/process.js.map +1 -1
  139. package/lib/types/host/routing.js +25 -2
  140. package/lib/types/host/routing.js.map +1 -1
  141. package/lib/types/host/runtime.js +21 -5
  142. package/lib/types/host/runtime.js.map +1 -1
  143. package/lib/types/host/settings-catalog-cache.d.ts +28 -0
  144. package/lib/types/host/settings-catalog-cache.js +189 -0
  145. package/lib/types/host/settings-catalog-cache.js.map +1 -0
  146. package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
  147. package/lib/types/host/windows-account-launch.mjs +47 -0
  148. package/lib/types/host/windows-account-owner.ps1 +137 -0
  149. package/lib/types/host/windows-account-stdio.mjs +19 -0
  150. package/lib/types/host/windows-account-terminal.d.ts +17 -0
  151. package/lib/types/host/windows-account-terminal.js +208 -0
  152. package/lib/types/host/windows-account-terminal.js.map +1 -0
  153. package/lib/types/host/windows-agy-account.ps1 +81 -0
  154. package/lib/types/host/windows-cli-installation.d.ts +35 -0
  155. package/lib/types/host/windows-cli-installation.js +164 -0
  156. package/lib/types/host/windows-cli-installation.js.map +1 -0
  157. package/lib/types/host/windows-codex-launch.d.ts +9 -0
  158. package/lib/types/host/windows-codex-launch.js +216 -0
  159. package/lib/types/host/windows-codex-launch.js.map +1 -0
  160. package/lib/types/host/windows-desktop-cli-installation.d.ts +20 -0
  161. package/lib/types/host/windows-desktop-cli-installation.js +420 -0
  162. package/lib/types/host/windows-desktop-cli-installation.js.map +1 -0
  163. package/lib/types/host/windows-hidden-launch.mjs +51 -0
  164. package/lib/types/host/windows-hidden-process.d.ts +12 -0
  165. package/lib/types/host/windows-hidden-process.js +116 -0
  166. package/lib/types/host/windows-hidden-process.js.map +1 -0
  167. package/lib/types/host/zcode-adapter.js +5 -1
  168. package/lib/types/host/zcode-adapter.js.map +1 -1
  169. package/lib/types/host/zcode-grok-accounts.d.ts +3 -1
  170. package/lib/types/host/zcode-grok-accounts.js +60 -11
  171. package/lib/types/host/zcode-grok-accounts.js.map +1 -1
  172. package/lib/types/shared/accounts.d.ts +4 -0
  173. package/lib/types/shared/cli-settings.d.ts +8 -0
  174. package/lib/windows-account-bootstrap.ps1 +44 -0
  175. package/lib/windows-account-launch.mjs +47 -0
  176. package/lib/windows-account-owner.ps1 +137 -0
  177. package/lib/windows-account-stdio.mjs +19 -0
  178. package/lib/windows-agy-account.ps1 +81 -0
  179. package/lib/windows-hidden-launch.mjs +51 -0
  180. package/lib/zcode-resume.mjs +2 -2
  181. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-executable-settings.js","sourceRoot":"","sources":["../../../src/client/cli-executable-settings.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const workerManagementStyles = "\n.cwn-worker{display:block;padding:12px;min-height:62px}\n.cwn .cwn-worker-menu-anchor{display:block;width:100%}\n.cwn-worker-layout{display:grid;grid-template-columns:minmax(0,1fr) 14px;column-gap:10px;align-items:center;min-width:0}\n.cwn-worker-open{display:flex;align-items:center;gap:10px;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left;font:inherit}\n.cwn-worker-open{grid-column:1;grid-row:1}.cwn-worker-open>.cwn-worker-line{flex:1;min-width:0}\n.cwn-worker-layout>.cwn-worker-meta{grid-column:1;grid-row:2}\n.cwn-worker-chevron{grid-column:2;grid-row:1/span 2;align-self:center;display:grid;place-items:center;color:var(--cwn-muted);pointer-events:none}.cwn-worker-chevron>svg{display:block;width:14px;height:14px}\n.cwn-worker-menu{z-index:1100}\n.cwn-archived-list{display:grid;gap:8px}.cwn-archived-row{display:flex;gap:8px;align-items:center;padding:12px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover)}.cwn-archived-row>div{min-width:0;flex:1}.cwn-archived-row strong,.cwn-archived-row small{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cwn-archived-row small{color:var(--cwn-muted);margin-top:3px}\n.cwn-filter-row{display:flex;align-items:center;gap:6px;margin:10px 0 14px;min-width:0}.cwn-filter-row .cwn-filters{flex:1;min-width:0;margin:0}\n.cwn .cwn-archive-toggle{width:var(--cwn-control-height,36px);min-width:var(--cwn-control-height,36px);height:var(--cwn-control-height,36px);min-height:var(--cwn-control-height,36px);flex:none;padding:0;background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 9%,transparent);color:var(--dsw-alias-state-error-primary);border-radius:var(--dsw-radius-md)}.cwn-archive-toggle svg{width:16px;height:16px}.cwn .cwn-archive-toggle:hover:not([aria-pressed=true]){background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 16%,transparent)}.cwn .cwn-archive-toggle[aria-pressed=true]{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 85%,#000);color:#fff}.cwn .cwn-archive-toggle[aria-pressed=true]:hover{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 75%,#000);color:#fff}\n.cwn-resume-banner{box-sizing:border-box;display:flex;align-items:center;gap:8px;flex:none;min-width:0;min-height:38px;margin:0 16px 8px;padding:5px 8px 5px 12px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover);color:var(--cwn-muted);font-size:12px;line-height:20px}.cwn-resume-banner>span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cwn .cwn-resume-banner button{flex:none;height:28px;min-height:28px;padding:0 8px;font-size:12px}\n.cwn-start-empty{height:100%;min-height:140px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:28px 12px}.cwn-start-empty h3{margin:0 0 8px;font-size:16px;font-weight:500;line-height:24px;color:var(--dsw-alias-label-primary);text-wrap:balance}.cwn-start-empty p{max-width:360px;margin:0;font-size:13px;line-height:22px;color:var(--dsw-alias-label-tertiary);text-wrap:balance}\n";
1
+ export declare const workerManagementStyles = "\n.cwn-settings-advanced-heading{flex:1;min-width:0}.cwn-settings-section-head>.cwn-settings-advanced-toggle{flex:none;width:var(--cwn-settings-control-height);min-width:var(--cwn-settings-control-height);padding:0;color:inherit}.cwn-settings-advanced-toggle>svg{transition:transform 220ms cubic-bezier(.2,0,0,1)}.cwn-settings-advanced-toggle[aria-expanded=true]>svg{transform:rotate(180deg)}\n.cwn-settings-advanced-body{display:grid;grid-template-rows:1fr;opacity:1;transition:grid-template-rows 220ms cubic-bezier(.2,0,0,1),opacity 180ms ease,visibility 220ms}.cwn-settings-advanced-body[data-expanded=false]{grid-template-rows:0fr;opacity:0;visibility:hidden}.cwn-settings-advanced-body-inner{min-height:0;overflow:hidden}\n.cwn-cli-path-settings{display:flex;flex-direction:column;gap:var(--cwn-settings-field-gap);min-width:0}.cwn-cli-path-settings>.cwn-setting-row-text{flex:none;color:var(--dsw-alias-label-primary)}.cwn-cli-path-settings form{display:flex;flex-direction:column;gap:var(--cwn-settings-action-gap);min-width:0}.cwn-cli-path-settings .cwn-cli-path-input{width:100%;min-width:0}.cwn-cli-path-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--cwn-settings-action-gap)}\n@media(prefers-reduced-motion:reduce){.cwn-settings-advanced-body,.cwn-settings-advanced-toggle>svg{transition:none}}\n.cwn-worker{display:block;padding:12px;min-height:62px}\n.cwn .cwn-worker-menu-anchor{display:block;width:100%}\n.cwn-worker-layout{display:grid;grid-template-columns:minmax(0,1fr) 14px;column-gap:10px;align-items:center;min-width:0}\n.cwn-worker-open{display:flex;align-items:center;gap:10px;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left;font:inherit}\n.cwn-worker-open{grid-column:1;grid-row:1}.cwn-worker-open>.cwn-worker-line{flex:1;min-width:0}\n.cwn-worker-layout>.cwn-worker-meta{grid-column:1;grid-row:2}\n.cwn-worker-chevron{grid-column:2;grid-row:1/span 2;align-self:center;display:grid;place-items:center;color:var(--cwn-muted);pointer-events:none}.cwn-worker-chevron>svg{display:block;width:14px;height:14px}\n.cwn-worker-menu{z-index:1100}\n.cwn-archived-list{display:grid;gap:8px}.cwn-archived-row{display:flex;gap:8px;align-items:center;padding:12px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover)}.cwn-archived-row>div{min-width:0;flex:1}.cwn-archived-row strong,.cwn-archived-row small{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cwn-archived-row small{color:var(--cwn-muted);margin-top:3px}\n.cwn-filter-row{display:flex;align-items:center;gap:6px;margin:10px 0 14px;min-width:0}.cwn-filter-row .cwn-filters{flex:1;min-width:0;margin:0}\n.cwn .cwn-archive-toggle{width:var(--cwn-control-height,36px);min-width:var(--cwn-control-height,36px);height:var(--cwn-control-height,36px);min-height:var(--cwn-control-height,36px);flex:none;padding:0;background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 9%,transparent);color:var(--dsw-alias-state-error-primary);border-radius:var(--dsw-radius-md)}.cwn-archive-toggle svg{width:16px;height:16px}.cwn .cwn-archive-toggle:hover:not([aria-pressed=true]){background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 16%,transparent)}.cwn .cwn-archive-toggle[aria-pressed=true]{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 85%,#000);color:#fff}.cwn .cwn-archive-toggle[aria-pressed=true]:hover{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 75%,#000);color:#fff}\n.cwn-resume-banner{box-sizing:border-box;display:flex;align-items:center;gap:8px;flex:none;min-width:0;min-height:38px;margin:0 16px 8px;padding:5px 8px 5px 12px;border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover);color:var(--cwn-muted);font-size:12px;line-height:20px}.cwn-resume-banner>span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cwn .cwn-resume-banner button{flex:none;height:28px;min-height:28px;padding:0 8px;font-size:12px}\n.cwn-start-empty{height:100%;min-height:140px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:28px 12px}.cwn-start-empty h3{margin:0 0 8px;font-size:16px;font-weight:500;line-height:24px;color:var(--dsw-alias-label-primary);text-wrap:balance}.cwn-start-empty p{max-width:360px;margin:0;font-size:13px;line-height:22px;color:var(--dsw-alias-label-tertiary);text-wrap:balance}\n";
@@ -1,5 +1,9 @@
1
1
  // Management additions retain the host Menu, Tooltip, theme and motion primitives.
2
2
  export const workerManagementStyles = `
3
+ .cwn-settings-advanced-heading{flex:1;min-width:0}.cwn-settings-section-head>.cwn-settings-advanced-toggle{flex:none;width:var(--cwn-settings-control-height);min-width:var(--cwn-settings-control-height);padding:0;color:inherit}.cwn-settings-advanced-toggle>svg{transition:transform 220ms cubic-bezier(.2,0,0,1)}.cwn-settings-advanced-toggle[aria-expanded=true]>svg{transform:rotate(180deg)}
4
+ .cwn-settings-advanced-body{display:grid;grid-template-rows:1fr;opacity:1;transition:grid-template-rows 220ms cubic-bezier(.2,0,0,1),opacity 180ms ease,visibility 220ms}.cwn-settings-advanced-body[data-expanded=false]{grid-template-rows:0fr;opacity:0;visibility:hidden}.cwn-settings-advanced-body-inner{min-height:0;overflow:hidden}
5
+ .cwn-cli-path-settings{display:flex;flex-direction:column;gap:var(--cwn-settings-field-gap);min-width:0}.cwn-cli-path-settings>.cwn-setting-row-text{flex:none;color:var(--dsw-alias-label-primary)}.cwn-cli-path-settings form{display:flex;flex-direction:column;gap:var(--cwn-settings-action-gap);min-width:0}.cwn-cli-path-settings .cwn-cli-path-input{width:100%;min-width:0}.cwn-cli-path-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--cwn-settings-action-gap)}
6
+ @media(prefers-reduced-motion:reduce){.cwn-settings-advanced-body,.cwn-settings-advanced-toggle>svg{transition:none}}
3
7
  .cwn-worker{display:block;padding:12px;min-height:62px}
4
8
  .cwn .cwn-worker-menu-anchor{display:block;width:100%}
5
9
  .cwn-worker-layout{display:grid;grid-template-columns:minmax(0,1fr) 14px;column-gap:10px;align-items:center;min-width:0}
@@ -1 +1 @@
1
- {"version":3,"file":"management-styles.js","sourceRoot":"","sources":["../../../src/client/management-styles.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;CAcrC,CAAA"}
1
+ {"version":3,"file":"management-styles.js","sourceRoot":"","sources":["../../../src/client/management-styles.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;CAkBrC,CAAA"}
@@ -9,6 +9,8 @@ import { BrandIcon, Glyph } from "./icons.js";
9
9
  import { operationMessage } from "./operation-error.js";
10
10
  import { value } from "./workers.js";
11
11
  import { RolePresetsPane } from "./role-presets.js";
12
+ import { AccountQueryQueue } from "./account-query-queue.js";
13
+ import { CliExecutableSettings } from "./cli-executable-settings.js";
12
14
  function readEnabled(raw) {
13
15
  const parsed = JSON.parse(raw);
14
16
  if (!parsed?.enabled || CLI_IDS.some((id) => typeof parsed.enabled[id] !== 'boolean')) {
@@ -26,17 +28,17 @@ function providerLoginSummary(account) {
26
28
  const provider = typeof login.providerLabel === 'string' ? login.providerLabel.trim() : '';
27
29
  if (!provider || provider.length > 64 || unsafe.test(provider))
28
30
  return [];
29
- const identity = login.authMethod === 'oauth' && typeof login.accountLabel === 'string'
30
- ? login.accountLabel.trim()
31
- : '';
31
+ const identity = login.authMethod === 'oauth' && typeof login.accountLabel === 'string' ? login.accountLabel.trim() : '';
32
32
  const email = identity.length <= 254 && !unsafe.test(identity) && /^[^\s@]+@[^\s@]+\.[^\s@]+$/u.test(identity)
33
33
  ? identity
34
34
  : '';
35
- return [{
35
+ return [
36
+ {
36
37
  label: login.authMethod === 'api' ? `${provider} API 登录` : `${provider}账号登录`,
37
38
  authMethod: login.authMethod,
38
39
  email,
39
- }];
40
+ },
41
+ ];
40
42
  });
41
43
  if (!logins.length)
42
44
  return undefined;
@@ -59,7 +61,14 @@ function connectionStatus(enabled, account, settingsError = '') {
59
61
  if (enabled === undefined || !account || (account.loading && !account.data))
60
62
  return { state: 'pending', label: '正在检查连接' };
61
63
  if (!account.error && account.data?.state === 'unconfigured')
62
- return { state: 'unconfigured', label: account.data.installed ? '未登录' : '未安装' };
64
+ return {
65
+ state: 'unconfigured',
66
+ label: account.data.installed
67
+ ? account.data.cli === 'claude'
68
+ ? account.data.summary
69
+ : '未登录'
70
+ : '未安装',
71
+ };
63
72
  if (account.error || !account.data || ['unavailable', 'unauthenticated'].includes(account.data.state)) {
64
73
  return { state: 'failed', label: account.error || account.data?.summary || '连接失败' };
65
74
  }
@@ -91,35 +100,45 @@ function OpenSettingsDialog({ onClose, api, sessionId, initialCli, openNativeSet
91
100
  const [accounts, setAccounts] = useState({});
92
101
  const enabledRef = useRef(enabled);
93
102
  enabledRef.current = enabled;
94
- const probes = useRef(new Map());
103
+ const probes = useRef(new AccountQueryQueue());
95
104
  const toggleController = useRef();
96
- const refreshAccount = useCallback((id, replace = false) => {
105
+ const accountClose = useRef();
106
+ const leaving = useRef(false);
107
+ const leave = async (transition) => {
108
+ if (leaving.current)
109
+ return;
110
+ leaving.current = true;
111
+ try {
112
+ if (accountClose.current && !(await accountClose.current()))
113
+ return;
114
+ transition();
115
+ }
116
+ finally {
117
+ leaving.current = false;
118
+ }
119
+ };
120
+ const refreshAccount = useCallback((id, replace = false, clearPrevious = false) => {
97
121
  if (!enabledRef.current?.[id])
98
122
  return;
99
- const previous = probes.current.get(id);
100
- if (previous && !replace)
123
+ if (probes.current.has(id) && !replace)
101
124
  return;
102
- previous?.abort();
103
- const controller = new AbortController();
104
- probes.current.set(id, controller);
105
- setAccounts((old) => ({ ...old, [id]: { data: old[id]?.data, loading: true } }));
106
- void (async () => {
125
+ setAccounts((old) => ({
126
+ ...old,
127
+ [id]: { data: clearPrevious ? undefined : old[id]?.data, loading: true },
128
+ }));
129
+ probes.current.enqueue(id, async (signal) => {
107
130
  try {
108
- const next = JSON.parse(value(await api.cliworker.accountStatus(sessionId, id, controller.signal)));
131
+ const next = JSON.parse(value(await api.cliworker.accountStatus(sessionId, id, signal)));
109
132
  if (next.cli !== id)
110
133
  throw new Error('收到不匹配的 CLI 账号状态,请重试');
111
- if (!controller.signal.aborted)
134
+ if (!signal.aborted)
112
135
  setAccounts((old) => ({ ...old, [id]: { data: next, loading: false } }));
113
136
  }
114
137
  catch (error) {
115
- if (!controller.signal.aborted)
138
+ if (!signal.aborted)
116
139
  setAccounts((old) => ({ ...old, [id]: { loading: false, error: operationMessage(error) } }));
117
140
  }
118
- finally {
119
- if (probes.current.get(id) === controller)
120
- probes.current.delete(id);
121
- }
122
- })();
141
+ }, replace);
123
142
  }, [api, sessionId]);
124
143
  useEffect(() => {
125
144
  const controller = new AbortController();
@@ -142,22 +161,20 @@ function OpenSettingsDialog({ onClose, api, sessionId, initialCli, openNativeSet
142
161
  return () => {
143
162
  controller.abort();
144
163
  toggleController.current?.abort();
145
- for (const probe of probes.current.values())
146
- probe.abort();
147
164
  probes.current.clear();
148
165
  };
149
166
  }, [api, sessionId]);
150
167
  useEffect(() => {
151
168
  if (!enabled)
152
169
  return;
153
- for (const id of CLI_IDS) {
170
+ probes.current.prioritize(cli);
171
+ for (const id of [cli, ...CLI_IDS.filter((id) => id !== cli)]) {
154
172
  if (enabled[id]) {
155
173
  if (!accounts[id])
156
174
  refreshAccount(id);
157
175
  }
158
176
  else {
159
- probes.current.get(id)?.abort();
160
- probes.current.delete(id);
177
+ probes.current.cancel(id);
161
178
  if (accounts[id])
162
179
  setAccounts((old) => {
163
180
  const next = { ...old };
@@ -167,9 +184,9 @@ function OpenSettingsDialog({ onClose, api, sessionId, initialCli, openNativeSet
167
184
  }
168
185
  }
169
186
  // A completed or failed probe is cached until explicitly refreshed. This
170
- // effect runs only when enablement changes, never on each response/render.
187
+ // Selection only reprioritizes pending work; it does not repeat settled reads.
171
188
  // eslint-disable-next-line react-hooks/exhaustive-deps
172
- }, [enabled, refreshAccount]);
189
+ }, [enabled, cli, refreshAccount]);
173
190
  async function toggleCli(id, nextValue) {
174
191
  if (!enabled || toggleController.current)
175
192
  return;
@@ -195,25 +212,49 @@ function OpenSettingsDialog({ onClose, api, sessionId, initialCli, openNativeSet
195
212
  }
196
213
  }
197
214
  }
198
- return (_jsx(Modal, { open: true, onClose: onClose, title: "CLI Worker \u8BBE\u7F6E", closeLabel: "\u5173\u95ED\u8BBE\u7F6E", className: "cwn-settings-dialog", contentClassName: "cwn-settings-content", children: _jsxs("div", { className: "cwn-settings-layout", children: [_jsxs("nav", { className: "cwn-settings-nav", "aria-label": "CLI \u8BBE\u7F6E\u5BFC\u822A", children: [_jsxs(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-settings-nav-primary", "aria-label": "\u667A\u80FD\u4F53\u8BBE\u7F6E", "aria-pressed": page === 'roles', onClick: () => setPage('roles'), children: [_jsx("span", { className: "cwn-settings-nav-icon", "aria-hidden": "true", children: _jsx(IconUserOutlineRegular, { size: 20 }) }), _jsx("span", { className: "cwn-settings-nav-label", children: "\u667A\u80FD\u4F53\u8BBE\u7F6E" })] }), _jsxs(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-settings-nav-primary", "aria-label": "CLI \u8FDE\u63A5", "aria-expanded": cliExpanded, "aria-controls": cliGroupId, onClick: () => setCliExpanded((expanded) => !expanded), children: [_jsx("span", { className: "cwn-settings-nav-icon", "aria-hidden": "true", children: _jsx(IconLinkOutlineRegular, { size: 20 }) }), _jsx("span", { className: "cwn-settings-nav-label", children: "CLI \u8FDE\u63A5" }), _jsx(IconChevronDownOutlineRegular, { size: 14, className: "cwn-settings-nav-chevron" })] }), _jsx("div", { id: cliGroupId, className: "cwn-settings-cli-group", "data-expanded": cliExpanded, "aria-hidden": !cliExpanded, ...(!cliExpanded ? { inert: '' } : {}), children: _jsx("div", { className: "cwn-settings-cli-group-inner", children: order.map((id) => {
215
+ return (_jsx(Modal, { open: true, onClose: () => void leave(onClose), title: "CLI Worker \u8BBE\u7F6E", closeLabel: "\u5173\u95ED\u8BBE\u7F6E", className: "cwn-settings-dialog", contentClassName: "cwn-settings-content", children: _jsxs("div", { className: "cwn-settings-layout", children: [_jsxs("nav", { className: "cwn-settings-nav", "aria-label": "CLI \u8BBE\u7F6E\u5BFC\u822A", children: [_jsxs(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-settings-nav-primary", "aria-label": "\u667A\u80FD\u4F53\u8BBE\u7F6E", "aria-pressed": page === 'roles', onClick: () => void leave(() => setPage('roles')), children: [_jsx("span", { className: "cwn-settings-nav-icon", "aria-hidden": "true", children: _jsx(IconUserOutlineRegular, { size: 20 }) }), _jsx("span", { className: "cwn-settings-nav-label", children: "\u667A\u80FD\u4F53\u8BBE\u7F6E" })] }), _jsxs(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-settings-nav-primary", "aria-label": "CLI \u8FDE\u63A5", "aria-expanded": cliExpanded, "aria-controls": cliGroupId, onClick: () => setCliExpanded((expanded) => !expanded), children: [_jsx("span", { className: "cwn-settings-nav-icon", "aria-hidden": "true", children: _jsx(IconLinkOutlineRegular, { size: 20 }) }), _jsx("span", { className: "cwn-settings-nav-label", children: "CLI \u8FDE\u63A5" }), _jsx(IconChevronDownOutlineRegular, { size: 14, className: "cwn-settings-nav-chevron" })] }), _jsx("div", { id: cliGroupId, className: "cwn-settings-cli-group", "data-expanded": cliExpanded, "aria-hidden": !cliExpanded, ...(!cliExpanded ? { inert: '' } : {}), children: _jsx("div", { className: "cwn-settings-cli-group-inner", children: order.map((id) => {
199
216
  const connection = connectionStatus(enabled?.[id], accounts[id], settingsError);
200
- return (_jsxs(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-settings-cli-item", "aria-label": `${CLI_LABELS[id]} 设置`, "aria-pressed": page === 'cli' && cli === id, tabIndex: cliExpanded ? undefined : -1, "data-enabled": enabled?.[id] !== false, onClick: () => {
217
+ return (_jsxs(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-settings-cli-item", "aria-label": `${CLI_LABELS[id]} 设置`, "aria-pressed": page === 'cli' && cli === id, tabIndex: cliExpanded ? undefined : -1, "data-enabled": enabled?.[id] !== false, onClick: () => void leave(() => {
201
218
  setCli(id);
202
219
  setPage('cli');
203
- }, children: [_jsx(BrandIcon, { cli: id, size: 22 }), _jsx("span", { className: "cwn-settings-nav-label", children: CLI_LABELS[id] }), _jsx(Tooltip, { label: connection.label, side: "right", portal: true, children: _jsx("span", { className: "cwn-settings-nav-status", role: "img", "aria-label": connection.label, children: connection.state === 'pending' ? (_jsx(StateDot, { state: "ongoing", size: 12 })) : (_jsx("span", { className: "cwn-connection-dot", "data-state": connection.state })) }) })] }, id));
204
- }) }) })] }), page === 'roles' ? (_jsx(RolePresetsPane, { api: api, sessionId: sessionId })) : (_jsx(CliSettings, { openNativeSettings: openNativeSettings, api: api, sessionId: sessionId, cli: cli, enabled: enabled?.[cli], account: accounts[cli], connection: connectionStatus(enabled?.[cli], accounts[cli], settingsError), onRefreshAccount: (replace) => refreshAccount(cli, replace), onToggle: (next) => void toggleCli(cli, next), toggleBusy: !!togglingCli, toggling: togglingCli === cli, settingsError: settingsError, toggleError: toggleErrors[cli] || '' }, `${sessionId}:${cli}`))] }) }));
220
+ }), children: [_jsx(BrandIcon, { cli: id, size: 22 }), _jsx("span", { className: "cwn-settings-nav-label", children: CLI_LABELS[id] }), _jsx(Tooltip, { label: connection.label, side: "right", portal: true, children: _jsx("span", { className: "cwn-settings-nav-status", role: "img", "aria-label": connection.label, children: connection.state === 'pending' ? (_jsx(StateDot, { state: "ongoing", size: 12 })) : (_jsx("span", { className: "cwn-connection-dot", "data-state": connection.state })) }) })] }, id));
221
+ }) }) })] }), page === 'roles' ? (_jsx(RolePresetsPane, { api: api, sessionId: sessionId })) : (_jsx(CliSettings, { accountClose: accountClose, openNativeSettings: openNativeSettings, api: api, sessionId: sessionId, cli: cli, enabled: enabled?.[cli], account: accounts[cli], connection: connectionStatus(enabled?.[cli], accounts[cli], settingsError), onRefreshAccount: (replace, clearPrevious) => refreshAccount(cli, replace, clearPrevious), onToggle: (next) => void toggleCli(cli, next), toggleBusy: !!togglingCli, toggling: togglingCli === cli, settingsError: settingsError, toggleError: toggleErrors[cli] || '' }, `${sessionId}:${cli}`))] }) }));
205
222
  }
206
223
  function NativeChoice({ label, selected, choices, disabled, onChange, }) {
207
224
  const [open, setOpen] = useState(false);
225
+ const anchor = useRef(null);
226
+ const [anchorWidth, setAnchorWidth] = useState();
227
+ const menuClass = `cwn-settings-choice-menu-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`;
208
228
  useEffect(() => {
209
229
  if (disabled)
210
230
  setOpen(false);
211
231
  }, [disabled]);
212
- return (_jsx(Menu, { open: open && !disabled, onClose: () => setOpen(false), portal: true, align: "start", className: "cwn-settings-choice", listClassName: "cwn-settings-choice-menu", selectedId: selected, items: choices, onSelect: (id) => {
213
- onChange(id);
214
- setOpen(false);
215
- }, anchor: _jsxs(Button, { type: "button", variant: "outline", size: "md", "aria-label": label, "aria-haspopup": "menu", "aria-expanded": open && !disabled, disabled: disabled, onClick: () => setOpen((old) => !old), children: [_jsx("span", { children: choices.find((choice) => choice.id === selected)?.label ??
216
- (label === '默认思考强度' ? '选择强度' : '选择模型') }), _jsx(IconChevronDownOutlineRegular, { size: 14 })] }) }));
232
+ useEffect(() => {
233
+ const button = anchor.current;
234
+ if (!open || !button)
235
+ return;
236
+ const measure = () => {
237
+ const width = button.getBoundingClientRect().width;
238
+ if (width > 0)
239
+ setAnchorWidth(width);
240
+ };
241
+ measure();
242
+ const observer = new ResizeObserver(measure);
243
+ observer.observe(button);
244
+ return () => observer.disconnect();
245
+ }, [open]);
246
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: anchorWidth === undefined ? '' : `.${menuClass}{--cwn-settings-choice-width:${anchorWidth}px}` }), _jsx(Menu, { open: open && !disabled, onClose: () => setOpen(false), portal: true, align: "start", className: "cwn-settings-choice", listClassName: `cwn-settings-choice-menu ${menuClass}`, selectedId: selected, items: choices, onSelect: (id) => {
247
+ onChange(id);
248
+ setOpen(false);
249
+ }, anchor: _jsxs(Button, { ref: anchor, type: "button", variant: "outline", size: "md", "aria-label": label, "aria-haspopup": "menu", "aria-expanded": open && !disabled, disabled: disabled, onClick: () => {
250
+ if (!open) {
251
+ const width = anchor.current?.getBoundingClientRect().width;
252
+ if (width && width > 0)
253
+ setAnchorWidth(width);
254
+ }
255
+ setOpen((old) => !old);
256
+ }, children: [_jsx("span", { children: choices.find((choice) => choice.id === selected)?.label ??
257
+ (label === '默认思考强度' ? '选择强度' : '选择模型') }), _jsx(IconChevronDownOutlineRegular, { size: 14 })] }) })] }));
217
258
  }
218
259
  function SectionProgress({ loading, label }) {
219
260
  return (_jsx("span", { className: "cwn-section-progress", role: "status", "aria-label": loading ? label : undefined, children: loading && _jsx(StateDot, { state: "ongoing", size: 14 }) }));
@@ -242,14 +283,16 @@ function AccountSummary({ account, enabled, loading, settingsError, logout, conn
242
283
  ? authenticatedLabel(data)
243
284
  : data?.state === 'unconfigured'
244
285
  ? data.installed
245
- ? '未登录'
286
+ ? data.cli === 'claude'
287
+ ? data.summary
288
+ : '未登录'
246
289
  : '未安装'
247
290
  : data?.state === 'configured'
248
291
  ? '已配置'
249
292
  : data?.summary || '状态待确认';
250
- return (_jsx("div", { className: "cwn-account-summary", "data-account-state": current ? data?.state : undefined, "data-provider-logins": !!providerLogins, role: "status", children: _jsxs("div", { className: "cwn-account-status-line", children: [_jsxs("span", { className: "cwn-account-login", "data-state": state, children: [_jsx("span", { className: "cwn-account-status-dot", "data-state": state, "aria-hidden": "true" }), providerLogins ? (_jsx("span", { className: "cwn-account-logins", title: providerLogins.detail, "aria-label": label, children: label })) : label] }), authenticated && !data.logins?.length && !apiLogin && data.accountLabel && (_jsx("span", { className: "cwn-account-label", title: data.accountLabel, children: data.accountLabel })), authenticated && logout] }) }));
293
+ return (_jsx("div", { className: "cwn-account-summary", "data-account-state": current ? data?.state : undefined, "data-provider-logins": !!providerLogins, role: "status", children: _jsxs("div", { className: "cwn-account-status-line", children: [_jsxs("span", { className: "cwn-account-login", "data-state": state, children: [_jsx("span", { className: "cwn-account-status-dot", "data-state": state, "aria-hidden": "true" }), providerLogins ? (_jsx("span", { className: "cwn-account-logins", title: providerLogins.detail, "aria-label": label, children: label })) : (label)] }), authenticated && !data.logins?.length && !apiLogin && data.accountLabel && (_jsx("span", { className: "cwn-account-label", title: data.accountLabel, children: data.accountLabel })), authenticated && logout] }) }));
251
294
  }
252
- function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account, connection, onRefreshAccount, onToggle, toggleBusy, toggling, settingsError, toggleError, }) {
295
+ function CliSettings({ accountClose, openNativeSettings, api, sessionId, cli, enabled, account, connection, onRefreshAccount, onToggle, toggleBusy, toggling, settingsError, toggleError, }) {
253
296
  const [catalog, setCatalog] = useState();
254
297
  const [modelLoading, setModelLoading] = useState(true);
255
298
  const [saving, setSaving] = useState(false);
@@ -257,14 +300,38 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
257
300
  const [saveError, setSaveError] = useState('');
258
301
  const [saved, setSaved] = useState(false);
259
302
  const [modelRevision, refreshModels] = useState(0);
303
+ const forceCatalogRefresh = useRef(false);
260
304
  const [model, setModel] = useState('');
261
305
  const [effort, setEffort] = useState('default');
262
306
  const [action, setAction] = useState();
263
307
  const [chosenAction, setChosenAction] = useState();
264
308
  const [accountSource, setAccountSource] = useState();
265
- const saveController = useRef();
266
- useEffect(() => () => saveController.current?.abort(), []);
309
+ const [loginProvider, setLoginProvider] = useState();
310
+ const [pathChanging, setPathChanging] = useState(false);
311
+ const saves = useRef(new AccountQueryQueue(1));
312
+ const saveRevision = useRef(0);
313
+ const latestSave = useRef();
314
+ const selection = useRef({ model: '', effort: 'default' });
315
+ const mounted = useRef(true);
316
+ const cancelSaves = useCallback((updateState = true) => {
317
+ saveRevision.current++;
318
+ latestSave.current = undefined;
319
+ saves.current.clear();
320
+ if (updateState)
321
+ setSaving(false);
322
+ }, []);
323
+ useEffect(() => {
324
+ mounted.current = true;
325
+ return () => {
326
+ mounted.current = false;
327
+ cancelSaves(false);
328
+ };
329
+ }, [cancelSaves]);
267
330
  useEffect(() => {
331
+ // A refreshed account/catalog owns a new model scope. Only subsequent
332
+ // human choice events may write a preference in that scope.
333
+ cancelSaves();
334
+ selection.current = { model: '', effort: 'default' };
268
335
  setCatalog(undefined);
269
336
  setModel('');
270
337
  setEffort('default');
@@ -284,7 +351,11 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
284
351
  const controller = new AbortController();
285
352
  void (async () => {
286
353
  try {
287
- const next = JSON.parse(value(await api.cliworker.catalogForCli(sessionId, cli, controller.signal)));
354
+ const force = forceCatalogRefresh.current;
355
+ forceCatalogRefresh.current = false;
356
+ const next = JSON.parse(value(await (force
357
+ ? api.cliworker.refreshCatalogForCli(sessionId, cli, controller.signal)
358
+ : api.cliworker.catalogForCli(sessionId, cli, controller.signal))));
288
359
  if (next.cli !== cli)
289
360
  throw new Error('收到不匹配的 CLI 模型目录,请重试');
290
361
  if (controller.signal.aborted)
@@ -298,10 +369,12 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
298
369
  const chosen = next.preference ? saved : visibleModelChoices(next.models)[0];
299
370
  if (next.preference && !saved && next.models.length)
300
371
  setModelError('原默认模型已不可用,请重新选择模型');
301
- setModel(chosen?.id ?? '');
302
- setEffort(next.preference && chosen?.efforts?.includes(next.preference.effort)
372
+ const effort = next.preference && chosen?.efforts?.includes(next.preference.effort)
303
373
  ? next.preference.effort
304
- : (chosen?.efforts?.[0] ?? 'default'));
374
+ : (chosen?.efforts?.[0] ?? 'default');
375
+ selection.current = { model: chosen?.id ?? '', effort };
376
+ setModel(selection.current.model);
377
+ setEffort(effort);
305
378
  }
306
379
  catch (error) {
307
380
  if (!controller.signal.aborted) {
@@ -318,42 +391,70 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
318
391
  return () => {
319
392
  controller.abort();
320
393
  };
321
- }, [api, sessionId, cli, enabled, account, modelRevision]);
394
+ }, [api, sessionId, cli, enabled, account, modelRevision, cancelSaves]);
322
395
  const inactive = !enabled || toggling;
323
396
  const settingsPending = enabled === undefined && !settingsError;
324
397
  const accountLoading = !settingsError && enabled !== false && (!account || account.loading);
325
398
  const supportedEfforts = catalog?.models.find((item) => item.id === model)?.efforts ?? [];
326
- const validPreference = !!catalog && !!model && supportedEfforts.includes(effort);
327
- async function save() {
328
- if (inactive || saving || modelLoading || !validPreference || saveController.current)
399
+ const choiceDisabled = inactive || pathChanging || modelLoading || accountLoading || !!action || !catalog;
400
+ function savePreference(preference) {
401
+ const key = JSON.stringify(preference);
402
+ if (latestSave.current?.key === key && latestSave.current.state === 'pending')
329
403
  return;
330
- const controller = new AbortController();
331
- saveController.current = controller;
404
+ const revision = ++saveRevision.current;
405
+ latestSave.current = { key, revision, state: 'pending' };
332
406
  setSaving(true);
333
407
  setSaveError('');
334
408
  setSaved(false);
335
- try {
336
- value(await api.cliworker.configure(sessionId, JSON.stringify({ cli, model, effort }), controller.signal));
337
- if (!controller.signal.aborted)
338
- setSaved(true);
339
- }
340
- catch (error) {
341
- if (!controller.signal.aborted)
342
- setSaveError(operationMessage(error));
343
- }
344
- finally {
345
- if (!controller.signal.aborted) {
346
- saveController.current = undefined;
347
- setSaving(false);
409
+ // New events replace the waiting choice and cancel the previous request.
410
+ // The queue waits for that request to settle before starting the latest
411
+ // selection, preserving Host cleanup and preventing out-of-order writes.
412
+ saves.current.enqueue('preference', async (signal) => {
413
+ const current = () => mounted.current && !signal.aborted && latestSave.current?.revision === revision;
414
+ try {
415
+ value(await api.cliworker.configure(sessionId, JSON.stringify(preference), signal));
416
+ if (current()) {
417
+ latestSave.current.state = 'saved';
418
+ setSaved(true);
419
+ }
348
420
  }
349
- }
421
+ catch (error) {
422
+ if (current()) {
423
+ latestSave.current.state = 'failed';
424
+ setSaveError(`${operationMessage(error)};请重新选择模型或思考强度重试`);
425
+ }
426
+ }
427
+ finally {
428
+ if (current())
429
+ setSaving(false);
430
+ }
431
+ }, true);
350
432
  }
351
433
  const changeModel = (id) => {
434
+ if (choiceDisabled)
435
+ return;
436
+ const chosen = catalog?.models.find((item) => item.id === id);
437
+ if (!chosen?.efforts?.length)
438
+ return;
439
+ const effort = chosen.efforts.includes(selection.current.effort)
440
+ ? selection.current.effort
441
+ : chosen.efforts[0];
442
+ selection.current = { model: id, effort };
352
443
  setModel(id);
353
- setSaved(false);
354
- const efforts = catalog?.models.find((item) => item.id === id)?.efforts ?? ['default'];
355
- if (!efforts.includes(effort))
356
- setEffort(efforts[0] ?? 'default');
444
+ setEffort(effort);
445
+ setModelError('');
446
+ savePreference({ cli, model: id, effort });
447
+ };
448
+ const changeEffort = (id) => {
449
+ if (choiceDisabled)
450
+ return;
451
+ const chosen = catalog?.models.find((item) => item.id === selection.current.model);
452
+ const effort = chosen?.efforts?.find((effort) => effort === id);
453
+ if (!chosen || !effort)
454
+ return;
455
+ selection.current = { model: chosen.id, effort };
456
+ setEffort(effort);
457
+ savePreference({ cli, model: chosen.id, effort });
357
458
  };
358
459
  const finishedAccountAction = () => {
359
460
  onRefreshAccount(true);
@@ -361,10 +462,12 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
361
462
  const closeAccount = () => {
362
463
  setAction(undefined);
363
464
  setAccountSource(undefined);
465
+ setLoginProvider(undefined);
364
466
  onRefreshAccount(true);
365
467
  };
366
468
  const sources = chosenAction?.sources?.filter((source, index, all) => ['native', 'plugin'].includes(source.id) && all.findIndex((item) => item.id === source.id) === index);
367
469
  const choosingSource = action === 'logout' && chosenAction?.sources !== undefined && !accountSource;
470
+ const choosingLoginProvider = cli === 'zcode' && action === 'login' && !loginProvider;
368
471
  const accountAction = (id) => {
369
472
  const item = account?.data?.actions.find((candidate) => candidate.id === id);
370
473
  const label = item?.target === 'models'
@@ -387,6 +490,8 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
387
490
  accountLoading ||
388
491
  !!account?.error ||
389
492
  !!action ||
493
+ saving ||
494
+ pathChanging ||
390
495
  !item ||
391
496
  (item.target === 'models' && !openNativeSettings), onClick: () => {
392
497
  if (!inactive && item) {
@@ -395,21 +500,32 @@ function CliSettings({ openNativeSettings, api, sessionId, cli, enabled, account
395
500
  return;
396
501
  }
397
502
  setChosenAction(item);
398
- setAccountSource(id === 'logout' && item.sources?.length === 1 &&
399
- ['native', 'plugin'].includes(item.sources[0].id) ? item.sources[0].id : undefined);
503
+ setLoginProvider(undefined);
504
+ setAccountSource(id === 'logout' &&
505
+ item.sources?.length === 1 &&
506
+ ['native', 'plugin'].includes(item.sources[0].id)
507
+ ? item.sources[0].id
508
+ : undefined);
400
509
  setAction(item.id);
401
510
  }
402
511
  }, children: id === 'logout' ? (_jsxs(_Fragment, { children: [_jsx(Glyph, { name: "logout" }), "\u9000\u51FA"] })) : item?.target === 'models' ? (label) : id === 'manage' ? (_jsxs(_Fragment, { children: [_jsx(Glyph, { name: "tool" }), "\u8D26\u53F7\u7EC8\u7AEF"] })) : item?.label && item.label !== '登录 / 切换账号' ? (item.label) : account?.data?.state === 'authenticated' ? ('切换账号') : ('登录账号') }));
403
512
  };
404
- return (_jsxs("div", { className: "cwn-settings-pane", "aria-label": `${CLI_LABELS[cli]} 配置`, children: [_jsxs("div", { className: "cwn-cli-identity", "data-enabled": enabled !== false, children: [_jsxs("div", { className: "cwn-settings-cli-name", children: [_jsx(BrandIcon, { cli: cli, size: 40 }), _jsxs("div", { children: [_jsx("h2", { children: CLI_LABELS[cli] }), _jsx("p", { className: "cwn-cli-subtitle", children: "\u7BA1\u7406\u8D26\u53F7\u4E0E\u6A21\u578B\u504F\u597D" })] })] }), _jsxs("div", { className: "cwn-cli-toggle", children: [_jsx(SectionProgress, { loading: settingsPending || toggling, label: toggling ? '正在保存 CLI 开关' : '正在读取 CLI 开关' }), _jsx(Switch, { checked: enabled ?? false, onChange: onToggle, label: `启用 ${CLI_LABELS[cli]}`, disabled: enabled === undefined || toggleBusy || saving || !!action, title: action ? '请先关闭账号终端' : undefined })] })] }), _jsx("div", { className: "cwn-cli-toggle-status", role: "status", children: settingsError || toggleError || (enabled === false ? '已关闭' : '') }), _jsxs("section", { className: "cwn-settings-section", "aria-label": "\u8D26\u53F7\u4E0E\u767B\u5F55", children: [_jsxs("div", { className: "cwn-settings-section-head", children: [_jsx("h3", { children: "\u8D26\u53F7\u4E0E\u767B\u5F55" }), _jsxs("div", { className: "cwn-settings-section-tools", children: [_jsx(SectionProgress, { loading: accountLoading, label: `正在读取 ${CLI_LABELS[cli]} 账号…` }), _jsx(Tooltip, { label: "\u5237\u65B0\u767B\u5F55\u72B6\u6001", side: "top", portal: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-refresh", "aria-label": "\u5237\u65B0\u72B6\u6001", disabled: inactive || accountLoading || saving, onClick: () => onRefreshAccount(), children: _jsx(IconRefreshOutlineRegular, { size: 16 }) }) })] })] }), _jsxs("div", { className: "cwn-account-row", children: [_jsx(AccountSummary, { account: account, connection: connection, enabled: enabled, loading: accountLoading, settingsError: settingsError, logout: accountAction('logout') }), _jsxs("div", { className: "cwn-account-actions", children: [accountAction('login'), accountAction('manage')] })] }), action && enabled && (_jsx(Modal, { open: true, onClose: closeAccount, title: `${CLI_LABELS[cli]} · ${chosenAction?.label ?? '账号终端'}`, closeLabel: "\u5173\u95ED\u8D26\u53F7\u64CD\u4F5C", className: "cwn-account-dialog", contentClassName: "cwn-account-dialog-content", children: choosingSource ? (_jsxs("section", { "aria-label": "\u9009\u62E9\u9000\u51FA\u8D26\u53F7\u6765\u6E90", children: [_jsx("p", { children: sources?.length ? '选择要退出的账号来源' : '账号来源不可用,请关闭后刷新状态' }), _jsx("div", { className: "cwn-account-actions", children: sources?.map((source) => (_jsx(Button, { variant: "outline", size: "md", onClick: () => setAccountSource(source.id), children: source.label }, source.id))) })] })) : (_jsx(AccountTerminal, { api: api, sessionId: sessionId, cli: cli, action: action, source: accountSource, onClose: closeAccount, onFinished: finishedAccountAction })) }))] }), _jsxs("section", { className: "cwn-settings-section", "aria-label": "\u9879\u76EE\u9ED8\u8BA4\u8BBE\u7F6E", children: [_jsxs("div", { className: "cwn-settings-section-head", children: [_jsx("h3", { children: "\u9879\u76EE\u9ED8\u8BA4\u8BBE\u7F6E" }), _jsxs("div", { className: "cwn-settings-section-tools", children: [_jsx(SectionProgress, { loading: !settingsError && enabled !== false && (modelLoading || settingsPending), label: `正在读取 ${CLI_LABELS[cli]} 模型…` }), _jsx(Tooltip, { label: "\u5237\u65B0\u6A21\u578B\u5217\u8868", side: "top", portal: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-refresh", "aria-label": "\u5237\u65B0\u6A21\u578B", disabled: inactive || modelLoading || saving, onClick: () => refreshModels((n) => n + 1), children: _jsx(IconRefreshOutlineRegular, { size: 16 }) }) })] })] }), _jsxs("form", { className: "cwn-settings-form", onSubmit: (event) => {
513
+ return (_jsxs("div", { className: "cwn-settings-pane", "aria-label": `${CLI_LABELS[cli]} 配置`, children: [_jsxs("div", { className: "cwn-cli-identity", "data-enabled": enabled !== false, children: [_jsxs("div", { className: "cwn-settings-cli-name", children: [_jsx(BrandIcon, { cli: cli, size: 40 }), _jsxs("div", { children: [_jsx("h2", { children: CLI_LABELS[cli] }), _jsx("p", { className: "cwn-cli-subtitle", children: "\u7BA1\u7406\u8D26\u53F7\u4E0E\u6A21\u578B\u504F\u597D" })] })] }), _jsxs("div", { className: "cwn-cli-toggle", children: [_jsx(SectionProgress, { loading: settingsPending || toggling, label: toggling ? '正在保存 CLI 开关' : '正在读取 CLI 开关' }), _jsx(Switch, { checked: enabled ?? false, onChange: onToggle, label: `启用 ${CLI_LABELS[cli]}`, disabled: enabled === undefined || toggleBusy || saving || !!action || pathChanging, title: action ? '请先关闭账号终端' : undefined })] })] }), _jsx("div", { className: "cwn-cli-toggle-status", role: "status", children: settingsError || toggleError || (enabled === false ? '已关闭' : '') }), _jsxs("section", { className: "cwn-settings-section", "aria-label": "\u8D26\u53F7\u4E0E\u767B\u5F55", children: [_jsxs("div", { className: "cwn-settings-section-head", children: [_jsx("h3", { children: "\u8D26\u53F7\u4E0E\u767B\u5F55" }), _jsxs("div", { className: "cwn-settings-section-tools", children: [_jsx(SectionProgress, { loading: accountLoading, label: `正在读取 ${CLI_LABELS[cli]} 账号…` }), _jsx(Tooltip, { label: "\u5237\u65B0\u767B\u5F55\u72B6\u6001", side: "top", portal: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-refresh", "aria-label": "\u5237\u65B0\u72B6\u6001", disabled: inactive || accountLoading || saving || pathChanging, onClick: () => onRefreshAccount(), children: _jsx(IconRefreshOutlineRegular, { size: 16 }) }) })] })] }), _jsxs("div", { className: "cwn-account-row", children: [_jsx(AccountSummary, { account: account, connection: connection, enabled: enabled, loading: accountLoading, settingsError: settingsError, logout: accountAction('logout') }), _jsxs("div", { className: "cwn-account-actions", children: [accountAction('login'), accountAction('manage')] })] }), action && enabled && (_jsx(Modal, { open: true, onClose: () => {
514
+ if (accountClose.current)
515
+ void accountClose.current();
516
+ else
517
+ closeAccount();
518
+ }, title: `${CLI_LABELS[cli]} · ${chosenAction?.label ?? '账号终端'}`, closeLabel: "\u5173\u95ED\u8D26\u53F7\u64CD\u4F5C", className: "cwn-account-dialog", contentClassName: "cwn-account-dialog-content", children: choosingLoginProvider ? (_jsxs("section", { "aria-label": "\u9009\u62E9 ZCode \u6388\u6743\u6765\u6E90", children: [_jsx("p", { children: "\u9009\u62E9\u8D26\u53F7\u6240\u5C5E\u7684\u670D\u52A1\u5546" }), _jsxs("div", { className: "cwn-account-actions", children: [_jsx(Button, { variant: "outline", size: "md", onClick: () => setLoginProvider('bigmodel'), children: "\u4E2D\u56FD\u667A\u8C31 BigModel" }), _jsx(Button, { variant: "outline", size: "md", onClick: () => setLoginProvider('zai'), children: "\u6D77\u5916 Z.AI" })] })] })) : choosingSource ? (_jsxs("section", { "aria-label": "\u9009\u62E9\u9000\u51FA\u8D26\u53F7\u6765\u6E90", children: [_jsx("p", { children: sources?.length ? '选择要退出的账号来源' : '账号来源不可用,请关闭后刷新状态' }), _jsx("div", { className: "cwn-account-actions", children: sources?.map((source) => (_jsx(Button, { variant: "outline", size: "md", onClick: () => setAccountSource(source.id), children: source.label }, source.id))) })] })) : (_jsx(AccountTerminal, { closeControl: accountClose, api: api, sessionId: sessionId, cli: cli, action: action, source: accountSource, provider: loginProvider, onClose: closeAccount, onFinished: finishedAccountAction })) }))] }), _jsxs("section", { className: "cwn-settings-section", "aria-label": "\u9879\u76EE\u9ED8\u8BA4\u8BBE\u7F6E", children: [_jsxs("div", { className: "cwn-settings-section-head", children: [_jsx("h3", { children: "\u9879\u76EE\u9ED8\u8BA4\u8BBE\u7F6E" }), _jsxs("div", { className: "cwn-settings-section-tools", children: [_jsx(SectionProgress, { loading: !settingsError && enabled !== false && (modelLoading || settingsPending), label: `正在读取 ${CLI_LABELS[cli]} 模型…` }), _jsx(Tooltip, { label: "\u5237\u65B0\u6A21\u578B\u5217\u8868", side: "top", portal: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "md", className: "cwn-refresh", "aria-label": "\u5237\u65B0\u6A21\u578B", disabled: inactive || modelLoading || saving || pathChanging, onClick: () => {
519
+ forceCatalogRefresh.current = true;
520
+ refreshModels((n) => n + 1);
521
+ }, children: _jsx(IconRefreshOutlineRegular, { size: 16 }) }) })] })] }), _jsxs("form", { className: "cwn-settings-form", onSubmit: (event) => {
405
522
  event.preventDefault();
406
- void save();
407
523
  }, children: [_jsxs("label", { className: "cwn-setting-row", children: [_jsxs("span", { className: "cwn-setting-row-text", children: [_jsx("span", { children: "\u6A21\u578B" }), _jsx("span", { className: "cwn-setting-description", children: "\u65B0\u5BF9\u8BDD\u6CBF\u7528\u7684\u9ED8\u8BA4\u6A21\u578B" })] }), _jsx(NativeChoice, { label: "\u9ED8\u8BA4\u6A21\u578B", selected: model, choices: visibleModelChoices(catalog?.models ?? [], model).map((item) => ({
408
524
  id: item.id,
409
525
  label: item.label,
410
- })), disabled: inactive || modelLoading || saving || !catalog, onChange: changeModel })] }), _jsxs("label", { className: "cwn-setting-row", children: [_jsxs("span", { className: "cwn-setting-row-text", children: [_jsx("span", { children: "\u601D\u8003\u5F3A\u5EA6" }), _jsx("span", { className: "cwn-setting-description", children: "\u4EC5\u63D0\u4F9B\u5F53\u524D\u6A21\u578B\u652F\u6301\u7684\u9009\u9879" })] }), _jsx(NativeChoice, { label: "\u9ED8\u8BA4\u601D\u8003\u5F3A\u5EA6", selected: effort, choices: supportedEfforts.map((id) => ({ id, label: effortLabel(id) })), disabled: inactive || modelLoading || saving || !catalog, onChange: (id) => {
411
- setEffort(id);
412
- setSaved(false);
413
- } })] }), _jsx("p", { className: "cwn-settings-notice cwn-settings-hint", role: "status", children: modelError || '' }), _jsxs("div", { className: "cwn-settings-save", children: [_jsxs(Button, { type: "submit", variant: "primary", size: "md", disabled: inactive || modelLoading || saving || !validPreference, children: [saving && _jsx(StateDot, { state: "ongoing", size: 14 }), "\u4FDD\u5B58\u9ED8\u8BA4\u503C"] }), _jsx("span", { className: "cwn-settings-feedback-slot", role: "status", children: saveError || (saved ? '默认设置已保存' : '') })] })] })] })] }));
526
+ })), disabled: choiceDisabled, onChange: changeModel })] }), _jsxs("label", { className: "cwn-setting-row", children: [_jsxs("span", { className: "cwn-setting-row-text", children: [_jsx("span", { children: "\u601D\u8003\u5F3A\u5EA6" }), _jsx("span", { className: "cwn-setting-description", children: "\u4EC5\u63D0\u4F9B\u5F53\u524D\u6A21\u578B\u652F\u6301\u7684\u9009\u9879" })] }), _jsx(NativeChoice, { label: "\u9ED8\u8BA4\u601D\u8003\u5F3A\u5EA6", selected: effort, choices: supportedEfforts.map((id) => ({ id, label: effortLabel(id) })), disabled: choiceDisabled || !supportedEfforts.length, onChange: changeEffort })] }), _jsx("p", { className: "cwn-settings-notice cwn-settings-hint", role: "status", children: modelError || (cli === 'claude' && catalog?.notice?.includes('路由') ? catalog.notice : '') }), (saving || saved || saveError) && (_jsx("div", { className: "cwn-settings-save", children: _jsxs("span", { className: "cwn-settings-feedback-slot", role: "status", children: [saving && _jsx(StateDot, { state: "ongoing", size: 14 }), saveError || (saving ? '正在保存默认设置…' : '默认设置已保存')] }) }))] })] }), _jsx(CliExecutableSettings, { api: api, sessionId: sessionId, cli: cli, blocked: !!action || saving || toggling, accountLoading: accountLoading, accountRevision: account, onApplied: () => {
527
+ if (enabled)
528
+ onRefreshAccount(true, true);
529
+ }, onBusyChange: setPathChanging })] }));
414
530
  }
415
531
  //# sourceMappingURL=settings-dialog.js.map