dsh-ccgui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -25,8 +25,8 @@ __export(index_exports, {
25
25
  inject: () => inject
26
26
  });
27
27
  module.exports = __toCommonJS(index_exports);
28
- var import_react17 = require("react");
29
- var import_dsh_client_ui_primitives14 = require("@deepseek-ai/dsh-client-ui-primitives");
28
+ var import_react19 = require("react");
29
+ var import_dsh_client_ui_primitives15 = require("@deepseek-ai/dsh-client-ui-primitives");
30
30
 
31
31
  // src/client/add-to-chat.tsx
32
32
  var import_react = require("react");
@@ -112,6 +112,8 @@ var DEFAULT_MODEL_ID = "default";
112
112
  var GIT_ROUTE_PREFIX = "/dsh-ccgui/git";
113
113
 
114
114
  // src/client/choices.ts
115
+ var OFFICIAL_PROVIDER_ID = "deepseek-official";
116
+ var HARNESS_LABEL = "DeepSeek";
115
117
  function cliModels({ groups, current }) {
116
118
  const group = groups.find((candidate) => candidate.id === current?.provider);
117
119
  if (!group?.id.startsWith(CLI_ROUTE_PREFIX)) return void 0;
@@ -125,17 +127,31 @@ function cliModels({ groups, current }) {
125
127
  listed: group.models.some((model) => model.name !== group.name)
126
128
  };
127
129
  }
130
+ var isCli = (id) => id.startsWith(CLI_ROUTE_PREFIX);
131
+ function harnessGroup(groups) {
132
+ return groups.find((group) => group.id === OFFICIAL_PROVIDER_ID) ?? groups.find((group) => !isCli(group.id));
133
+ }
128
134
  function cliChoices({ groups, current }) {
135
+ const harness = harnessGroup(groups);
136
+ const harnessItem = harness === void 0 ? void 0 : { id: harness.id, label: HARNESS_LABEL };
137
+ const firstHarness = groups.findIndex((group) => !isCli(group.id));
138
+ const items = groups.flatMap((group, index) => {
139
+ if (isCli(group.id)) return [{ id: group.id, label: group.name }];
140
+ return index === firstHarness && harnessItem !== void 0 ? [harnessItem] : [];
141
+ });
129
142
  const selected = groups.find((group) => group.id === current?.provider);
143
+ const shown = selected === void 0 || isCli(selected.id) ? selected && { id: selected.id, label: selected.name } : harnessItem;
130
144
  return {
131
- visible: groups.some((group) => group.id.startsWith(CLI_ROUTE_PREFIX)),
132
- items: groups.map((group) => ({ id: group.id, label: group.name })),
133
- currentId: selected?.id,
134
- currentLabel: selected?.name
145
+ visible: groups.some((group) => isCli(group.id)),
146
+ items,
147
+ currentId: shown?.id,
148
+ currentLabel: shown?.label
135
149
  };
136
150
  }
137
151
  function selectionForChoice({ groups, current }, provider) {
138
152
  if (current?.provider === provider) return void 0;
153
+ const onHarness = groups.some((group) => group.id === current?.provider && !isCli(group.id));
154
+ if (onHarness && !isCli(provider)) return void 0;
139
155
  const first = groups.find((group) => group.id === provider)?.models[0];
140
156
  if (first === void 0) return void 0;
141
157
  return { provider, model: provider.startsWith(CLI_ROUTE_PREFIX) ? DEFAULT_MODEL_ID : first.id };
@@ -143,7 +159,7 @@ function selectionForChoice({ groups, current }, provider) {
143
159
 
144
160
  // src/client/cli-prefs.ts
145
161
  var CLI_PREFS_STORAGE_KEY = "dsh-ccgui.cli-prefs";
146
- var OFFICIAL_PROVIDER_ID = "deepseek-official";
162
+ var isBuiltInChoice = (id) => !id.startsWith(CLI_ROUTE_PREFIX);
147
163
  var HIDDEN_BY_DEFAULT = /* @__PURE__ */ new Set([cliRoute("codebuddy")]);
148
164
  var EMPTY = { known: [], order: [], hidden: [] };
149
165
  function isRecord(value) {
@@ -170,7 +186,7 @@ function parseCliPrefs(raw) {
170
186
  return {
171
187
  known: choices(value.known),
172
188
  order: strings(value.order),
173
- hidden: strings(value.hidden).filter((id) => id !== OFFICIAL_PROVIDER_ID)
189
+ hidden: strings(value.hidden).filter((id) => !isBuiltInChoice(id))
174
190
  };
175
191
  }
176
192
  function sortByOrder(items, order) {
@@ -182,22 +198,26 @@ function sortByOrder(items, order) {
182
198
  }
183
199
  function arrangeChoices(items, prefs) {
184
200
  return sortByOrder(
185
- items.filter((item) => item.id === OFFICIAL_PROVIDER_ID || !prefs.hidden.includes(item.id)),
201
+ items.filter((item) => isBuiltInChoice(item.id) || !prefs.hidden.includes(item.id)),
186
202
  prefs.order
187
203
  );
188
204
  }
189
205
  function listedEntries(prefs) {
190
206
  return sortByOrder(prefs.known, prefs.order).map((choice) => ({
191
207
  ...choice,
192
- enabled: choice.id === OFFICIAL_PROVIDER_ID || !prefs.hidden.includes(choice.id)
208
+ enabled: isBuiltInChoice(choice.id) || !prefs.hidden.includes(choice.id)
193
209
  }));
194
210
  }
195
211
  function rememberChoices(prefs, seen) {
196
- const renamed = prefs.known.map((known) => seen.find((choice) => choice.id === known.id) ?? known);
197
- const added = seen.filter((choice) => !prefs.known.some((known) => known.id === choice.id));
198
- const changed = added.length > 0 || renamed.some((choice, index) => choice.label !== prefs.known[index]?.label);
199
- if (!changed) return prefs;
200
- const startHidden = added.map((choice) => choice.id).filter((id) => HIDDEN_BY_DEFAULT.has(id));
212
+ if (seen.length === 0) return prefs;
213
+ const offered = new Set(seen.map((choice) => choice.id));
214
+ const known = prefs.known.filter((choice) => offered.has(choice.id));
215
+ const renamed = known.map((choice) => seen.find((candidate) => candidate.id === choice.id) ?? choice);
216
+ const added = seen.filter((choice) => !known.some((candidate) => candidate.id === choice.id));
217
+ const dropped = known.length !== prefs.known.length;
218
+ const relabelled = renamed.some((choice, index) => choice.label !== prefs.known[index]?.label);
219
+ if (!dropped && added.length === 0 && !relabelled) return prefs;
220
+ const startHidden = added.filter((choice) => HIDDEN_BY_DEFAULT.has(choice.id)).map((choice) => choice.id);
201
221
  const hidden = [...prefs.hidden, ...startHidden.filter((id) => !prefs.hidden.includes(id))];
202
222
  return { ...prefs, known: [...renamed, ...added], hidden };
203
223
  }
@@ -210,7 +230,7 @@ function moveChoice(prefs, id, delta) {
210
230
  return { ...prefs, order: ids.map((candidate, index) => index === from ? other : index === to ? id : candidate) };
211
231
  }
212
232
  function enableChoice(prefs, id, enabled) {
213
- if (id === OFFICIAL_PROVIDER_ID) return prefs;
233
+ if (isBuiltInChoice(id)) return prefs;
214
234
  const hidden = prefs.hidden.includes(id);
215
235
  if (enabled) return hidden ? { ...prefs, hidden: prefs.hidden.filter((candidate) => candidate !== id) } : prefs;
216
236
  return hidden ? prefs : { ...prefs, hidden: [...prefs.hidden, id] };
@@ -264,7 +284,8 @@ var OWN_MARKS = /* @__PURE__ */ new Map([
264
284
  [cliRoute("codex"), "codex"],
265
285
  [cliRoute("pi"), "pi"],
266
286
  [cliRoute("claude"), "claude"],
267
- [cliRoute("codebuddy"), "codebuddy"]
287
+ [cliRoute("codebuddy"), "codebuddy"],
288
+ [cliRoute("kimi"), "kimi"]
268
289
  ]);
269
290
  function markOf(provider) {
270
291
  const own = OWN_MARKS.get(provider);
@@ -288,7 +309,11 @@ var MONOCHROME = {
288
309
  "M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 0 0-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 0 1 .476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 0 1 4.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 0 1-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 0 0 5.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0 0 10.205 0a5.947 5.947 0 0 0-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 0 0 4.162 1.713z"
289
310
  ],
290
311
  pi: ["M1 1h16.5v11H12v5.5H6.5V23H1V1zm5.5 5.5V12H12V6.5H6.5z", "M17.5 12H23v11h-5.5V12z"],
291
- opencode: ["M16 6H8v12h8V6zm4 16H4V2h16v20z"]
312
+ opencode: ["M16 6H8v12h8V6zm4 16H4V2h16v20z"],
313
+ kimi: [
314
+ "M21.846 0a1.923 1.923 0 110 3.846H20.15a.226.226 0 01-.227-.226V1.923C19.923.861 20.784 0 21.846 0z",
315
+ "M11.065 11.199l7.257-7.2c.137-.136.06-.41-.116-.41H14.3a.164.164 0 00-.117.051l-7.82 7.756c-.122.12-.302.013-.302-.179V3.82c0-.127-.083-.23-.185-.23H3.186c-.103 0-.186.103-.186.23V19.77c0 .128.083.23.186.23h2.69c.103 0 .186-.102.186-.23v-3.25c0-.069.025-.135.069-.178l2.424-2.406a.158.158 0 01.205-.023l6.484 4.772a7.677 7.677 0 003.453 1.283c.108.012.2-.095.2-.23v-3.06c0-.117-.07-.212-.164-.227a5.028 5.028 0 01-2.027-.807l-5.613-4.064c-.117-.078-.132-.279-.028-.381z"
316
+ ]
292
317
  };
293
318
  var DEEPSEEK_PATH = "M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z";
294
319
  var DEEPSEEK_COLOR = "#4D6BFE";
@@ -386,11 +411,12 @@ function ProviderMark({
386
411
  }
387
412
 
388
413
  // src/client/model-menu.tsx
389
- var import_react5 = require("react");
414
+ var import_react6 = require("react");
390
415
  var import_react_dom = require("react-dom");
391
- var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primitives");
416
+ var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
392
417
 
393
- // src/client/model-card.tsx
418
+ // src/client/effort-menu.tsx
419
+ var import_react3 = require("react");
394
420
  var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
395
421
 
396
422
  // src/client/model-menu-styles.ts
@@ -408,6 +434,9 @@ var ROW_ACTIVE_CLASS = "dsh-cli-model-row-active";
408
434
  var ROW_NAME_CLASS = "dsh-cli-model-row-name";
409
435
  var ROW_CHECK_CLASS = "dsh-cli-model-row-check";
410
436
  var HINT_CLASS = "dsh-cli-model-hint";
437
+ var HEADING_CLASS = "dsh-cli-model-heading";
438
+ var GROUP_CLASS = "dsh-cli-model-group";
439
+ var EFFORT_CLASS = "dsh-cli-model-effort";
411
440
  var MODEL_MENU_STYLES = `
412
441
  [data-slot="conversation.input.right"]:has(.${ROOT_CLASS}) + [data-slot="conversation.input.model"] { display: none !important; }
413
442
  .${ROOT_CLASS} { position: relative; min-width: 0; }
@@ -518,18 +547,173 @@ var MODEL_MENU_STYLES = `
518
547
  }
519
548
  .${ROW_CHECK_CLASS} { display: grid; place-items: center; flex: 0 0 14px; color: var(--dsw-alias-label-primary); }
520
549
  .${ROW_CHECK_CLASS} svg { width: 14px; height: 14px; }
550
+ .${HEADING_CLASS} {
551
+ padding: 6px 7px 2px;
552
+ color: var(--dsw-alias-label-tertiary);
553
+ font-size: 12px;
554
+ font-weight: 500;
555
+ line-height: 18px;
556
+ }
557
+ .${GROUP_CLASS} { display: flex; align-items: center; min-width: 0; }
558
+ /* Where the composer is too narrow for the model's name, the level gives way as well. */
559
+ .${EFFORT_CLASS} { display: var(--dsh-composer-model-text-display, block); flex: 0 0 auto; }
560
+ .${EFFORT_CLASS} .${TRIGGER_CLASS} { padding: 0 4px; color: var(--dsw-alias-label-caption); }
521
561
  .${HINT_CLASS} { padding: 8px; color: var(--dsw-alias-label-tertiary); font-size: 12px; line-height: 18px; }
522
562
  `;
523
563
 
524
- // src/client/model-card.tsx
564
+ // src/client/effort-menu.tsx
525
565
  var import_jsx_runtime3 = require("react/jsx-runtime");
526
- var SEARCH_ABOVE = 4;
566
+ var UNKNOWN_ERROR_LABEL = "\u672A\u77E5\u9519\u8BEF";
567
+ var UNLISTED_LEVEL_LABEL = "\u63A8\u7406\u7B49\u7EA7";
568
+ function selectionFor(row, level) {
569
+ return {
570
+ provider: row.provider,
571
+ model: row.model,
572
+ ...level.effort === void 0 ? {} : { reasoningEffort: level.effort }
573
+ };
574
+ }
575
+ function useChooseEffort(models, select, close) {
576
+ const [failure, setFailure] = (0, import_react3.useState)();
577
+ const fail = (text) => {
578
+ setFailure((previous) => ({ seq: (previous?.seq ?? 0) + 1, text }));
579
+ };
580
+ const choose = (key) => {
581
+ close();
582
+ const level = models.efforts.find((candidate) => candidate.key === key);
583
+ if (models.current === void 0 || level === void 0 || level.key === models.effort?.key) return;
584
+ select(selectionFor(models.current, level)).then(
585
+ (result) => {
586
+ if (result.error !== void 0) fail(result.error.message ?? UNKNOWN_ERROR_LABEL);
587
+ },
588
+ (reason) => {
589
+ fail(String(reason));
590
+ }
591
+ );
592
+ };
593
+ return { failure, clearFailure: () => setFailure(void 0), choose };
594
+ }
595
+ function EffortMenu({ models, pending, locked, select }) {
596
+ const [open, setOpen] = (0, import_react3.useState)(false);
597
+ const rootRef = (0, import_react3.useRef)(null);
598
+ const { failure, clearFailure, choose } = useChooseEffort(models, select, () => {
599
+ setOpen(false);
600
+ });
601
+ if (models.current === void 0 || models.efforts.length === 0) return null;
602
+ const label = models.effort?.name ?? UNLISTED_LEVEL_LABEL;
603
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { ref: rootRef, className: EFFORT_CLASS, children: [
604
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
605
+ import_dsh_client_ui_primitives.Menu,
606
+ {
607
+ open: open && !locked,
608
+ items: models.efforts.map((level) => ({ id: level.key, label: level.name })),
609
+ selectedId: models.effort?.key,
610
+ onSelect: choose,
611
+ onClose: () => {
612
+ setOpen(false);
613
+ },
614
+ side: "top",
615
+ portal: true,
616
+ anchor: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
617
+ "button",
618
+ {
619
+ type: "button",
620
+ className: TRIGGER_CLASS,
621
+ "aria-label": `\u63A8\u7406\u7B49\u7EA7\uFF0C\u5F53\u524D ${label}`,
622
+ "aria-haspopup": "menu",
623
+ "aria-expanded": open,
624
+ title: `\u63A8\u7406\u7B49\u7EA7\uFF1A${label}`,
625
+ disabled: locked || pending !== null,
626
+ onClick: () => {
627
+ setOpen((value) => !value);
628
+ },
629
+ children: [
630
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: LABEL_CLASS, children: label }),
631
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { className: CHEVRON_CLASS, size: 14 })
632
+ ]
633
+ }
634
+ )
635
+ }
636
+ ),
637
+ failure !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
638
+ import_dsh_client_ui_primitives.Toast,
639
+ {
640
+ text: `\u5207\u6362\u63A8\u7406\u7B49\u7EA7\u5931\u8D25\uFF1A${failure.text}`,
641
+ icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dsh_client_ui_primitives.IconWarningOutlineRegular, {}),
642
+ anchor: rootRef.current?.closest("[data-composer-card]") ?? null,
643
+ onDone: clearFailure
644
+ },
645
+ failure.seq
646
+ )
647
+ ] });
648
+ }
649
+
650
+ // src/client/menu-models.ts
651
+ var ACCOUNT_PROVIDER_ID = "deepseek-account";
652
+ var OFFICIAL_PROVIDER_ID2 = "deepseek-official";
653
+ var ACCOUNT_PROVIDER_NAME = "DeepSeek \u8D26\u53F7";
527
654
  var MENU_LABEL = "\u6A21\u578B";
655
+ var PROVIDER_DEFAULT_LABEL = "Default";
656
+ var PROVIDER_DEFAULT_KEY = "provider-default";
657
+ var LOADING_STATUS = "loading";
658
+ function isRow(row, selection) {
659
+ return row.provider === selection?.provider && row.model === selection.model;
660
+ }
661
+ function rowCount(sections) {
662
+ return sections.reduce((count, section) => count + section.rows.length, 0);
663
+ }
664
+ function toSection({ id, name, models }) {
665
+ return {
666
+ id,
667
+ name: id === ACCOUNT_PROVIDER_ID ? ACCOUNT_PROVIDER_NAME : name,
668
+ rows: models.map(({ id: model, name: modelName, reasoning }) => ({
669
+ provider: id,
670
+ model,
671
+ name: modelName,
672
+ ...reasoning === void 0 ? {} : { reasoning }
673
+ }))
674
+ };
675
+ }
676
+ var providerRank = (id) => id === ACCOUNT_PROVIDER_ID ? 0 : id === OFFICIAL_PROVIDER_ID2 ? 1 : 2;
677
+ function effortLevels(reasoning) {
678
+ if (reasoning === void 0) return [];
679
+ const levels = reasoning.efforts.map(({ id, name }) => ({ key: `effort:${id}`, effort: id, name }));
680
+ if (reasoning.defaultEffort !== void 0) return levels;
681
+ return [{ key: PROVIDER_DEFAULT_KEY, effort: void 0, name: PROVIDER_DEFAULT_LABEL }, ...levels];
682
+ }
683
+ function listing(state) {
684
+ const cli = cliModels(state);
685
+ if (cli !== void 0) {
686
+ const section = toSection({ id: cli.provider, name: cli.name, models: cli.rows });
687
+ return { label: cli.name, sections: [section], headed: false, unlisted: cli.listed ? void 0 : cli.name };
688
+ }
689
+ const sections = state.groups.filter((group) => !group.id.startsWith(CLI_ROUTE_PREFIX)).map(toSection).sort((left, right) => providerRank(left.id) - providerRank(right.id));
690
+ return { label: MENU_LABEL, sections, headed: true, unlisted: void 0 };
691
+ }
692
+ function menuModels(state) {
693
+ const listed = listing(state);
694
+ const current = listed.sections.flatMap((section) => section.rows).find((row) => isRow(row, state.current));
695
+ const efforts = effortLevels(current?.reasoning);
696
+ const chosen = state.current?.reasoningEffort ?? current?.reasoning?.defaultEffort;
697
+ return {
698
+ ...listed,
699
+ current,
700
+ loading: state.status === LOADING_STATUS,
701
+ efforts,
702
+ effort: efforts.find((level) => level.effort === chosen)
703
+ };
704
+ }
705
+
706
+ // src/client/model-card.tsx
707
+ var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
708
+ var import_jsx_runtime4 = require("react/jsx-runtime");
709
+ var SEARCH_ABOVE = 4;
710
+ var MENU_LABEL2 = "\u6A21\u578B";
528
711
  var SEARCH_LABEL = "\u641C\u7D22\u6A21\u578B\u2026";
529
712
  var NO_MATCH_LABEL = "\u6CA1\u6709\u5339\u914D\u7684\u6A21\u578B\u3002";
713
+ var NO_MODELS_LABEL = "\u6682\u65E0\u53EF\u7528\u6A21\u578B";
530
714
  function ModelRow({ domId, model, selected, settling, active, busy, onHover, onChoose }) {
531
- const check = selected ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dsh_client_ui_primitives.IconCheckOutlineRegular, {}) : null;
532
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
715
+ const check = selected ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives2.IconCheckOutlineRegular, {}) : null;
716
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
533
717
  "button",
534
718
  {
535
719
  type: "button",
@@ -543,15 +727,15 @@ function ModelRow({ domId, model, selected, settling, active, busy, onHover, onC
543
727
  onMouseMove: active || busy ? void 0 : onHover,
544
728
  onClick: onChoose,
545
729
  children: [
546
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: ROW_NAME_CLASS, children: model.name }),
547
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: ROW_CHECK_CLASS, children: settling ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_dsh_client_ui_primitives.StateDot, { state: "ongoing" }) : check })
730
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: ROW_NAME_CLASS, children: model.name }),
731
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: ROW_CHECK_CLASS, children: settling ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives2.StateDot, { state: "ongoing" }) : check })
548
732
  ]
549
733
  }
550
734
  );
551
735
  }
552
736
  function ModelSearch({ id, active, query, busy, searchRef, onQuery }) {
553
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: SEARCH_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
554
- import_dsh_client_ui_primitives.Input,
737
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: SEARCH_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
738
+ import_dsh_client_ui_primitives2.Input,
555
739
  {
556
740
  ref: searchRef,
557
741
  className: SEARCH_INPUT_CLASS,
@@ -569,31 +753,41 @@ function ModelSearch({ id, active, query, busy, searchRef, onQuery }) {
569
753
  }
570
754
  ) });
571
755
  }
572
- function ModelRows({ id, models, visible, active, pending, onHighlight, onChoose }) {
573
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { id: `${id}-rows`, className: `${ROWS_CLASS} scrollable`, role: "menu", "aria-label": MENU_LABEL, children: visible.map((model, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
574
- ModelRow,
575
- {
576
- domId: `${id}-model-${index}`,
577
- model,
578
- selected: model.id === models.currentId,
579
- settling: pending?.provider === models.provider && pending.model === model.id,
580
- active: index === active,
581
- busy: pending !== null,
582
- onHover: () => {
583
- onHighlight(index);
584
- },
585
- onChoose: () => {
586
- onChoose(model.id);
587
- }
588
- },
589
- model.id
590
- )) });
756
+ function ModelRows({ id, models, sections, active, pending, onHighlight, onChoose }) {
757
+ const starts = sections.map((_section, index) => rowCount(sections.slice(0, index)));
758
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { id: `${id}-rows`, className: `${ROWS_CLASS} scrollable`, role: "menu", "aria-label": MENU_LABEL2, children: sections.map((section, sectionIndex) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { role: "none", children: [
759
+ models.headed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: HEADING_CLASS, role: "presentation", children: section.name }),
760
+ section.rows.map((row, rowIndex) => {
761
+ const index = (starts[sectionIndex] ?? 0) + rowIndex;
762
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
763
+ ModelRow,
764
+ {
765
+ domId: `${id}-model-${index}`,
766
+ model: row,
767
+ selected: isRow(row, models.current),
768
+ settling: isRow(row, pending),
769
+ active: index === active,
770
+ busy: pending !== null,
771
+ onHover: () => {
772
+ onHighlight(index);
773
+ },
774
+ onChoose: () => {
775
+ onChoose(row);
776
+ }
777
+ },
778
+ `${row.provider}/${row.model}`
779
+ );
780
+ })
781
+ ] }, section.id)) });
782
+ }
783
+ function emptyLabel(models) {
784
+ return rowCount(models.sections) === 0 ? NO_MODELS_LABEL : NO_MATCH_LABEL;
591
785
  }
592
786
  function ModelCard(props) {
593
787
  const {
594
788
  id,
595
789
  models,
596
- visible,
790
+ sections,
597
791
  active,
598
792
  pending,
599
793
  query,
@@ -605,29 +799,29 @@ function ModelCard(props) {
605
799
  onChoose
606
800
  } = props;
607
801
  const busy = pending !== null;
608
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
609
- import_dsh_client_ui_primitives.MenuSurface,
802
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
803
+ import_dsh_client_ui_primitives2.MenuSurface,
610
804
  {
611
805
  ref: cardRef,
612
806
  id: `${id}-menu`,
613
807
  className: MENU_CLASS,
614
808
  style: anchorStyle,
615
809
  role: "group",
616
- "aria-label": models.name,
810
+ "aria-label": models.label,
617
811
  children: [
618
- models.rows.length > SEARCH_ABOVE && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ModelSearch, { id, active, query, busy, searchRef, onQuery }),
619
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ModelRows, { ...{ id, models, visible, active, pending, onHighlight, onChoose } }),
620
- visible.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: HINT_CLASS, role: "status", children: NO_MATCH_LABEL }),
621
- !models.listed && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: HINT_CLASS, role: "status", children: `\u8FD8\u6CA1\u6709\u8BFB\u5230 ${models.name} \u7684\u6A21\u578B\u5217\u8868` })
812
+ rowCount(models.sections) > SEARCH_ABOVE && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ModelSearch, { id, active, query, busy, searchRef, onQuery }),
813
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ModelRows, { ...{ id, models, sections, active, pending, onHighlight, onChoose } }),
814
+ sections.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: HINT_CLASS, role: "status", children: emptyLabel(models) }),
815
+ models.unlisted !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: HINT_CLASS, role: "status", children: `\u8FD8\u6CA1\u6709\u8BFB\u5230 ${models.unlisted} \u7684\u6A21\u578B\u5217\u8868` })
622
816
  ]
623
817
  }
624
818
  );
625
819
  }
626
820
 
627
821
  // src/client/model-seat.ts
628
- var import_react3 = require("react");
629
- var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
630
- var UNKNOWN_ERROR_LABEL = "\u672A\u77E5\u9519\u8BEF";
822
+ var import_react4 = require("react");
823
+ var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primitives");
824
+ var UNKNOWN_ERROR_LABEL2 = "\u672A\u77E5\u9519\u8BEF";
631
825
  function keyAction({ key, shiftKey }) {
632
826
  if (key === "Escape" || key === "Tab" && shiftKey) return "close";
633
827
  if (key === "Enter" || key === "Tab") return "choose";
@@ -635,7 +829,7 @@ function keyAction({ key, shiftKey }) {
635
829
  return key === "ArrowUp" ? -1 : void 0;
636
830
  }
637
831
  function useCloseOnOutsidePress(open, inside, close) {
638
- (0, import_react3.useEffect)(() => {
832
+ (0, import_react4.useEffect)(() => {
639
833
  if (!open) return void 0;
640
834
  const onPress = (event) => {
641
835
  if (!inside.some((ref) => ref.current?.contains(event.target) === true)) close();
@@ -647,27 +841,28 @@ function useCloseOnOutsidePress(open, inside, close) {
647
841
  }, [open]);
648
842
  }
649
843
  function useMatchingRows(models, query, highlight) {
650
- const searchable = models.rows.length > SEARCH_ABOVE;
651
- const visible = (0, import_react3.useMemo)(
652
- () => (0, import_dsh_client_ui_primitives2.rankByName)(models.rows, searchable ? query.trim() : ""),
653
- [models.rows, searchable, query]
844
+ const searchable = rowCount(models.sections) > SEARCH_ABOVE;
845
+ const sections = (0, import_react4.useMemo)(
846
+ () => models.sections.map((section) => ({ ...section, rows: (0, import_dsh_client_ui_primitives3.rankByName)(section.rows, searchable ? query.trim() : "") })).filter((section) => section.rows.length > 0),
847
+ [models.sections, searchable, query]
654
848
  );
655
- const currentIndex = visible.findIndex((model) => model.id === models.currentId);
849
+ const visible = (0, import_react4.useMemo)(() => sections.flatMap((section) => section.rows), [sections]);
850
+ const currentIndex = visible.findIndex((row) => isRow(row, models.current));
656
851
  const active = Math.min(highlight ?? Math.max(0, currentIndex), visible.length - 1);
657
- return { searchable, visible, active };
852
+ return { searchable, sections, visible, active };
658
853
  }
659
854
  function useMenuFocus(open, searchable, activeRowId, searchRef) {
660
- (0, import_react3.useEffect)(() => {
661
- if (open && searchable && !(0, import_dsh_client_ui_primitives2.isMobileDevice)()) searchRef.current?.focus();
855
+ (0, import_react4.useEffect)(() => {
856
+ if (open && searchable && !(0, import_dsh_client_ui_primitives3.isMobileDevice)()) searchRef.current?.focus();
662
857
  }, [open, searchable, searchRef]);
663
- (0, import_react3.useLayoutEffect)(() => {
858
+ (0, import_react4.useLayoutEffect)(() => {
664
859
  if (open) document.getElementById(activeRowId)?.scrollIntoView({ block: "nearest" });
665
860
  }, [open, activeRowId]);
666
861
  }
667
862
  function useCompositionGuard() {
668
- const composition = (0, import_react3.useRef)();
669
- (0, import_react3.useEffect)(() => {
670
- const observed = (0, import_dsh_client_ui_primitives2.observeComposition)(document);
863
+ const composition = (0, import_react4.useRef)();
864
+ (0, import_react4.useEffect)(() => {
865
+ const observed = (0, import_dsh_client_ui_primitives3.observeComposition)(document);
671
866
  composition.current = observed;
672
867
  return () => {
673
868
  observed.dispose();
@@ -676,23 +871,23 @@ function useCompositionGuard() {
676
871
  return (event) => composition.current?.guards(event) ?? false;
677
872
  }
678
873
  function useChooseModel({ models, select, triggerRef, searchRef, closings, close }) {
679
- const [failure, setFailure] = (0, import_react3.useState)();
680
- const [settled, setSettled] = (0, import_react3.useState)(false);
874
+ const [failure, setFailure] = (0, import_react4.useState)();
875
+ const [settled, setSettled] = (0, import_react4.useState)(false);
681
876
  const fail = (text) => {
682
877
  setFailure((previous) => ({ seq: (previous?.seq ?? 0) + 1, text }));
683
- if (!(0, import_dsh_client_ui_primitives2.isMobileDevice)()) searchRef.current?.focus();
878
+ if (!(0, import_dsh_client_ui_primitives3.isMobileDevice)()) searchRef.current?.focus();
684
879
  };
685
- const choose = (modelId) => {
880
+ const choose = (row) => {
686
881
  setSettled(true);
687
- if (modelId === models.currentId) {
882
+ if (isRow(row, models.current)) {
688
883
  close(true);
689
884
  return;
690
885
  }
691
886
  const asked = closings.current;
692
887
  triggerRef.current?.focus();
693
- select({ provider: models.provider, model: modelId }).then(
888
+ select({ provider: row.provider, model: row.model }).then(
694
889
  (result) => {
695
- if (result.error !== void 0) fail(result.error.message ?? UNKNOWN_ERROR_LABEL);
890
+ if (result.error !== void 0) fail(result.error.message ?? UNKNOWN_ERROR_LABEL2);
696
891
  else if (closings.current === asked) close(true);
697
892
  },
698
893
  (reason) => {
@@ -717,10 +912,10 @@ function closeOnBlurOutside(inside, close) {
717
912
  };
718
913
  }
719
914
  function useMenuState(triggerRef) {
720
- const [open, setOpen] = (0, import_react3.useState)(false);
721
- const [query, setQuery] = (0, import_react3.useState)("");
722
- const [highlight, setHighlight] = (0, import_react3.useState)(null);
723
- const closings = (0, import_react3.useRef)(0);
915
+ const [open, setOpen] = (0, import_react4.useState)(false);
916
+ const [query, setQuery] = (0, import_react4.useState)("");
917
+ const [highlight, setHighlight] = (0, import_react4.useState)(null);
918
+ const closings = (0, import_react4.useRef)(0);
724
919
  const close = (restoreFocus = false) => {
725
920
  closings.current += 1;
726
921
  setOpen(false);
@@ -735,19 +930,19 @@ function useMenuState(triggerRef) {
735
930
  }
736
931
  function useSeatRefs() {
737
932
  return {
738
- rootRef: (0, import_react3.useRef)(null),
739
- triggerRef: (0, import_react3.useRef)(null),
740
- cardRef: (0, import_react3.useRef)(null),
741
- searchRef: (0, import_react3.useRef)(null)
933
+ rootRef: (0, import_react4.useRef)(null),
934
+ triggerRef: (0, import_react4.useRef)(null),
935
+ cardRef: (0, import_react4.useRef)(null),
936
+ searchRef: (0, import_react4.useRef)(null)
742
937
  };
743
938
  }
744
939
  function useModelSeat({ models, pending, locked, load, select }) {
745
940
  const refs = useSeatRefs();
746
941
  const { rootRef, triggerRef, cardRef, searchRef } = refs;
747
942
  const { open, setOpen, query, setQuery, highlight, setHighlight, closings, close } = useMenuState(triggerRef);
748
- const id = (0, import_react3.useId)();
943
+ const id = (0, import_react4.useId)();
749
944
  const showing = open && !locked;
750
- const { searchable, visible, active } = useMatchingRows(models, query, highlight);
945
+ const { searchable, sections, visible, active } = useMatchingRows(models, query, highlight);
751
946
  const composing = useCompositionGuard();
752
947
  const choosing = useChooseModel({ models, select, triggerRef, searchRef, closings, close });
753
948
  useCloseOnOutsidePress(showing, [rootRef, cardRef], close);
@@ -757,9 +952,10 @@ function useModelSeat({ models, pending, locked, load, select }) {
757
952
  const action = keyAction(event);
758
953
  if (action === void 0) return;
759
954
  event.preventDefault();
955
+ const row = visible[active];
760
956
  if (action === "close") close(true);
761
- else if (pending !== null || visible.length === 0) return;
762
- else if (action === "choose") choosing.choose(visible[active]?.id ?? "");
957
+ else if (pending !== null || row === void 0) return;
958
+ else if (action === "choose") choosing.choose(row);
763
959
  else setHighlight((active + action + visible.length) % visible.length);
764
960
  };
765
961
  const onBlur = closeOnBlurOutside([rootRef, cardRef], () => {
@@ -781,7 +977,7 @@ function useModelSeat({ models, pending, locked, load, select }) {
781
977
  query,
782
978
  setQuery,
783
979
  setHighlight,
784
- visible,
980
+ sections,
785
981
  active,
786
982
  ...refs,
787
983
  onKeyDown,
@@ -792,30 +988,31 @@ function useModelSeat({ models, pending, locked, load, select }) {
792
988
  }
793
989
 
794
990
  // src/client/store.ts
795
- var import_react4 = require("react");
991
+ var import_react5 = require("react");
796
992
  function useStore(store) {
797
- return (0, import_react4.useSyncExternalStore)(
993
+ return (0, import_react5.useSyncExternalStore)(
798
994
  (listener) => store.subscribe(listener),
799
995
  () => store.getSnapshot()
800
996
  );
801
997
  }
802
998
 
803
999
  // src/client/model-menu.tsx
804
- var import_jsx_runtime4 = require("react/jsx-runtime");
1000
+ var import_jsx_runtime5 = require("react/jsx-runtime");
805
1001
  var NO_MODEL_LABEL = "\u8BF7\u9009\u62E9\u6A21\u578B";
1002
+ var LOADING_LABEL = "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u2026";
806
1003
  function keepFocus(event) {
807
1004
  if (!(event.target instanceof HTMLInputElement)) event.preventDefault();
808
1005
  }
809
1006
  function ModelTrigger({ seat, models, pending, locked, label, anchorStyle }) {
810
1007
  const { id, showing } = seat;
811
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1008
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
812
1009
  "button",
813
1010
  {
814
1011
  ref: seat.triggerRef,
815
1012
  type: "button",
816
1013
  className: TRIGGER_CLASS,
817
1014
  style: anchorStyle,
818
- "aria-label": models.currentName === void 0 ? NO_MODEL_LABEL : `\u9009\u62E9\u6A21\u578B\uFF0C\u5F53\u524D ${label}`,
1015
+ "aria-label": models.current === void 0 ? label : `\u9009\u62E9\u6A21\u578B\uFF0C\u5F53\u524D ${label}`,
819
1016
  "aria-haspopup": "menu",
820
1017
  "aria-expanded": showing,
821
1018
  "aria-controls": showing ? `${id}-menu` : void 0,
@@ -828,9 +1025,9 @@ function ModelTrigger({ seat, models, pending, locked, label, anchorStyle }) {
828
1025
  },
829
1026
  onClick: seat.toggle,
830
1027
  children: [
831
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconDataOutlineRegular, { className: ICON_CLASS, size: 16 }),
832
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: LABEL_CLASS, children: label }),
833
- pending === null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconChevronDownOutlineRegular, { className: CHEVRON_CLASS, size: 14 }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.StateDot, { state: "ongoing" })
1028
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_dsh_client_ui_primitives4.IconDataOutlineRegular, { className: ICON_CLASS, size: 16 }),
1029
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: LABEL_CLASS, children: label }),
1030
+ pending === null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_dsh_client_ui_primitives4.IconChevronDownOutlineRegular, { className: CHEVRON_CLASS, size: 14 }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_dsh_client_ui_primitives4.StateDot, { state: "ongoing" })
834
1031
  ]
835
1032
  }
836
1033
  );
@@ -840,9 +1037,9 @@ function ModelSeat(props) {
840
1037
  const seat = useModelSeat(props);
841
1038
  const { id, showing, rootRef } = seat;
842
1039
  const anchorStyle = { "--dsh-cli-model-anchor": `--dsh-cli-model-${id.replaceAll(":", "")}` };
843
- const label = models.currentName ?? NO_MODEL_LABEL;
844
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { ref: rootRef, className: ROOT_CLASS, onKeyDown: seat.onKeyDown, onBlur: seat.onBlur, onMouseDown: keepFocus, children: [
845
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1040
+ const label = models.current?.name ?? (models.loading ? LOADING_LABEL : NO_MODEL_LABEL);
1041
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { ref: rootRef, className: ROOT_CLASS, onKeyDown: seat.onKeyDown, onBlur: seat.onBlur, onMouseDown: keepFocus, children: [
1042
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
846
1043
  ModelTrigger,
847
1044
  {
848
1045
  seat,
@@ -854,12 +1051,12 @@ function ModelSeat(props) {
854
1051
  }
855
1052
  ),
856
1053
  showing && (0, import_react_dom.createPortal)(
857
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1054
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
858
1055
  ModelCard,
859
1056
  {
860
1057
  id,
861
1058
  models,
862
- visible: seat.visible,
1059
+ sections: seat.sections,
863
1060
  active: seat.active,
864
1061
  pending,
865
1062
  query: seat.query,
@@ -876,11 +1073,11 @@ function ModelSeat(props) {
876
1073
  ),
877
1074
  document.body
878
1075
  ),
879
- seat.failure !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
880
- import_dsh_client_ui_primitives3.Toast,
1076
+ seat.failure !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1077
+ import_dsh_client_ui_primitives4.Toast,
881
1078
  {
882
1079
  text: `\u5207\u6362\u6A21\u578B\u5931\u8D25\uFF1A${seat.failure.text}`,
883
- icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconWarningOutlineRegular, {}),
1080
+ icon: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_dsh_client_ui_primitives4.IconWarningOutlineRegular, {}),
884
1081
  anchor: rootRef.current?.closest("[data-composer-card]") ?? null,
885
1082
  onDone: seat.clearFailure
886
1083
  },
@@ -889,7 +1086,7 @@ function ModelSeat(props) {
889
1086
  ] });
890
1087
  }
891
1088
  function useRemoved(session) {
892
- return (0, import_react5.useSyncExternalStore)(
1089
+ return (0, import_react6.useSyncExternalStore)(
893
1090
  (listener) => session?.subscribe(listener) ?? (() => {
894
1091
  }),
895
1092
  () => session?.getSnapshot().removed === true
@@ -898,15 +1095,19 @@ function useRemoved(session) {
898
1095
  function CliModelMenu({ available, directory, load, select, session }) {
899
1096
  const state = useStore(directory);
900
1097
  const locked = useRemoved(session);
901
- const models = available ? cliModels(state) : void 0;
902
- if (models === void 0) return null;
903
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ModelSeat, { models, pending: state.pending ?? null, locked, load, select });
1098
+ if (!available) return null;
1099
+ const models = menuModels(state);
1100
+ const pending = state.pending ?? null;
1101
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: GROUP_CLASS, children: [
1102
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ModelSeat, { models, pending, locked, load, select }),
1103
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EffortMenu, { models, pending, locked, select })
1104
+ ] });
904
1105
  }
905
1106
 
906
1107
  // src/client/session-status-mark.tsx
907
- var import_react6 = require("react");
1108
+ var import_react7 = require("react");
908
1109
  var import_react_dom2 = require("react-dom");
909
- var import_jsx_runtime5 = require("react/jsx-runtime");
1110
+ var import_jsx_runtime6 = require("react/jsx-runtime");
910
1111
  var SESSION_STATUS_SLOT = "sidebar.session.row.trailing";
911
1112
  var SESSION_STATUS_MARK_CLASS = "dsh-cli-status-mark";
912
1113
  var ROW = '[data-row-key^="session:"]';
@@ -918,8 +1119,8 @@ var MARK_GAP = "6px";
918
1119
  var HEARTBEAT = "dsh-cli-status-heartbeat";
919
1120
  var HEARTBEAT_PERIOD = "0.92s";
920
1121
  function useSessionProvider(list, sessionId) {
921
- const subscribe = (0, import_react6.useCallback)((listener) => list.subscribe(listener), [list]);
922
- return (0, import_react6.useSyncExternalStore)(subscribe, () => providerOfSession(list.getSnapshot().byId[sessionId]));
1122
+ const subscribe = (0, import_react7.useCallback)((listener) => list.subscribe(listener), [list]);
1123
+ return (0, import_react7.useSyncExternalStore)(subscribe, () => providerOfSession(list.getSnapshot().byId[sessionId]));
923
1124
  }
924
1125
  function leadingCellOf(anchor) {
925
1126
  return anchor?.closest(ROW)?.querySelector(LEADING_CELL) ?? null;
@@ -929,14 +1130,14 @@ function SessionStatusMark({
929
1130
  list
930
1131
  }) {
931
1132
  const provider = useSessionProvider(list, sessionId);
932
- const [cell, setCell] = (0, import_react6.useState)(null);
933
- const anchor = (0, import_react6.useCallback)((node) => {
1133
+ const [cell, setCell] = (0, import_react7.useState)(null);
1134
+ const anchor = (0, import_react7.useCallback)((node) => {
934
1135
  setCell(leadingCellOf(node));
935
1136
  }, []);
936
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
937
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { ref: anchor, hidden: true }),
1137
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
1138
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { ref: anchor, hidden: true }),
938
1139
  cell === null || provider === void 0 ? null : (0, import_react_dom2.createPortal)(
939
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: SESSION_STATUS_MARK_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ProviderMark, { provider, size: MARK_SIZE }) }),
1140
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: SESSION_STATUS_MARK_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ProviderMark, { provider, size: MARK_SIZE }) }),
940
1141
  cell
941
1142
  )
942
1143
  ] });
@@ -966,8 +1167,8 @@ ${STATUS_CELL} > svg[data-state="ongoing"] > * { display: none; }
966
1167
  `;
967
1168
 
968
1169
  // src/client/terminal-entry.tsx
969
- var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
970
- var import_jsx_runtime6 = require("react/jsx-runtime");
1170
+ var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
1171
+ var import_jsx_runtime7 = require("react/jsx-runtime");
971
1172
  var TERMINAL_KIND = "terminal";
972
1173
  var SLOT = "conversation.session.header.utilities";
973
1174
  var ENTRY_ORDER = -1;
@@ -994,14 +1195,14 @@ function toggleTerminal(sidebar, sessionId) {
994
1195
  if (!expanded) sidebar.toggleExpanded();
995
1196
  }
996
1197
  function TerminalGlyph() {
997
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("svg", { viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
998
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M3 4L7 8L3 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }),
999
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("path", { d: "M9 12H13", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })
1198
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("svg", { viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
1199
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M3 4L7 8L3 12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }),
1200
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M9 12H13", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })
1000
1201
  ] });
1001
1202
  }
1002
1203
  function TerminalEntry({ sessionId, sidebar }) {
1003
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_dsh_client_ui_primitives4.Tooltip, { label: TOOLTIP_LABEL, side: "bottom", delayMs: TOOLTIP_DELAY_MS, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1004
- import_dsh_client_ui_primitives4.Button,
1204
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_dsh_client_ui_primitives5.Tooltip, { label: TOOLTIP_LABEL, side: "bottom", delayMs: TOOLTIP_DELAY_MS, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1205
+ import_dsh_client_ui_primitives5.Button,
1005
1206
  {
1006
1207
  size: "sm",
1007
1208
  className: ENTRY_CLASS,
@@ -1009,7 +1210,7 @@ function TerminalEntry({ sessionId, sidebar }) {
1009
1210
  onClick: () => {
1010
1211
  toggleTerminal(sidebar, sessionId);
1011
1212
  },
1012
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(TerminalGlyph, {})
1213
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TerminalGlyph, {})
1013
1214
  }
1014
1215
  ) });
1015
1216
  }
@@ -1061,8 +1262,8 @@ function registerFilesDefault(ctx) {
1061
1262
  }
1062
1263
 
1063
1264
  // src/client/changes/changes-panel.tsx
1064
- var import_react11 = require("react");
1065
- var import_dsh_client_ui_primitives6 = require("@deepseek-ai/dsh-client-ui-primitives");
1265
+ var import_react12 = require("react");
1266
+ var import_dsh_client_ui_primitives7 = require("@deepseek-ai/dsh-client-ui-primitives");
1066
1267
 
1067
1268
  // src/client/changes/changes-api.ts
1068
1269
  var NETWORK_FAILED = "\u65E0\u6CD5\u8FDE\u63A5\u5230 DSH \u670D\u52A1";
@@ -1109,17 +1310,17 @@ function createGitApi(fetchFn, cwd) {
1109
1310
  }
1110
1311
 
1111
1312
  // src/client/changes/changes-diff.tsx
1112
- var import_react7 = require("react");
1313
+ var import_react8 = require("react");
1113
1314
 
1114
1315
  // src/client/changes/changes-icons.tsx
1115
- var import_jsx_runtime7 = require("react/jsx-runtime");
1316
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1116
1317
  var DEFAULT_SIZE = 16;
1117
1318
  function Stroke({
1118
1319
  size = DEFAULT_SIZE,
1119
1320
  className,
1120
1321
  children
1121
1322
  }) {
1122
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1323
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1123
1324
  "svg",
1124
1325
  {
1125
1326
  width: size,
@@ -1137,61 +1338,61 @@ function Stroke({
1137
1338
  );
1138
1339
  }
1139
1340
  function BranchIcon(props) {
1140
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Stroke, { ...props, children: [
1141
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "6", cy: "5", r: "2" }),
1142
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "6", cy: "19", r: "2" }),
1143
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "18", cy: "7", r: "2" }),
1144
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M6 7v10M18 9c0 5-6 4-11.4 8.6" })
1341
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Stroke, { ...props, children: [
1342
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "6", cy: "5", r: "2" }),
1343
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "6", cy: "19", r: "2" }),
1344
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "18", cy: "7", r: "2" }),
1345
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M6 7v10M18 9c0 5-6 4-11.4 8.6" })
1145
1346
  ] });
1146
1347
  }
1147
1348
  function RefreshIcon(props) {
1148
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Stroke, { ...props, children: [
1149
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M20 11a8 8 0 0 0-14.3-4.9L4 8" }),
1150
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M4 4v4h4" }),
1151
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M4 13a8 8 0 0 0 14.3 4.9L20 16" }),
1152
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M20 20v-4h-4" })
1349
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Stroke, { ...props, children: [
1350
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M20 11a8 8 0 0 0-14.3-4.9L4 8" }),
1351
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M4 4v4h4" }),
1352
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M4 13a8 8 0 0 0 14.3 4.9L20 16" }),
1353
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M20 20v-4h-4" })
1153
1354
  ] });
1154
1355
  }
1155
1356
  function Cloud({ arrow, ...props }) {
1156
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Stroke, { ...props, children: [
1157
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M7 18a4.5 4.5 0 0 1-.6-9A6 6 0 0 1 18 9.5a4 4 0 0 1 0 8.5" }),
1357
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Stroke, { ...props, children: [
1358
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M7 18a4.5 4.5 0 0 1-.6-9A6 6 0 0 1 18 9.5a4 4 0 0 1 0 8.5" }),
1158
1359
  arrow
1159
1360
  ] });
1160
1361
  }
1161
1362
  function PullIcon(props) {
1162
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Cloud, { ...props, arrow: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M12 12v9M9 18l3 3 3-3" }) });
1363
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Cloud, { ...props, arrow: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M12 12v9M9 18l3 3 3-3" }) });
1163
1364
  }
1164
1365
  function PushIcon(props) {
1165
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Cloud, { ...props, arrow: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M12 21v-9M9 15l3-3 3 3" }) });
1366
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Cloud, { ...props, arrow: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M12 21v-9M9 15l3-3 3 3" }) });
1166
1367
  }
1167
1368
  function ChevronIcon(props) {
1168
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M6 9l6 6 6-6" }) });
1369
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M6 9l6 6 6-6" }) });
1169
1370
  }
1170
1371
  function UndoIcon(props) {
1171
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Stroke, { ...props, children: [
1172
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M9 14L4 9l5-5" }),
1173
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M4 9h10.5a5.5 5.5 0 0 1 0 11H11" })
1372
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Stroke, { ...props, children: [
1373
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M9 14L4 9l5-5" }),
1374
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M4 9h10.5a5.5 5.5 0 0 1 0 11H11" })
1174
1375
  ] });
1175
1376
  }
1176
1377
  function PlusIcon2(props) {
1177
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M12 5v14M5 12h14" }) });
1378
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M12 5v14M5 12h14" }) });
1178
1379
  }
1179
1380
  function MinusIcon(props) {
1180
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M5 12h14" }) });
1381
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M5 12h14" }) });
1181
1382
  }
1182
1383
  function BackIcon(props) {
1183
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M19 12H5M11 18l-6-6 6-6" }) });
1384
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Stroke, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M19 12H5M11 18l-6-6 6-6" }) });
1184
1385
  }
1185
1386
  function ChangesIcon(props) {
1186
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Stroke, { ...props, children: [
1187
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z" }),
1188
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M12 8v6M9 11h6M9 17h6" })
1387
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Stroke, { ...props, children: [
1388
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z" }),
1389
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M12 8v6M9 11h6M9 17h6" })
1189
1390
  ] });
1190
1391
  }
1191
1392
  function SparkleIcon(props) {
1192
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Stroke, { ...props, children: [
1193
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M10 4l1.6 4.4L16 10l-4.4 1.6L10 16l-1.6-4.4L4 10l4.4-1.6z" }),
1194
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { d: "M17.5 14l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8z" })
1393
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Stroke, { ...props, children: [
1394
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M10 4l1.6 4.4L16 10l-4.4 1.6L10 16l-1.6-4.4L4 10l4.4-1.6z" }),
1395
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M17.5 14l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8z" })
1195
1396
  ] });
1196
1397
  }
1197
1398
 
@@ -1423,30 +1624,30 @@ var DIFF = `
1423
1624
  var CHANGES_STYLES = `${LAYOUT}${ROWS}${DIFF}`;
1424
1625
 
1425
1626
  // src/client/changes/changes-diff.tsx
1426
- var import_jsx_runtime8 = require("react/jsx-runtime");
1627
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1427
1628
  var SIDE_LABELS = { staged: "\u5DF2\u6682\u5B58", unstaged: "\u672A\u6682\u5B58", untracked: "\u672A\u8DDF\u8E2A" };
1428
1629
  var TRUNCATED = "Diff \u8FC7\u5927\uFF0C\u5DF2\u622A\u65AD";
1429
1630
  var NO_CHANGES = "\u6CA1\u6709\u53EF\u663E\u793A\u7684\u5DEE\u5F02";
1430
1631
  function Line({ row }) {
1431
1632
  if (row.kind === "hunk" || row.kind === "note") {
1432
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: row.kind === "hunk" ? CLS.diffHunk : CLS.diffNote, children: row.text });
1633
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: row.kind === "hunk" ? CLS.diffHunk : CLS.diffNote, children: row.text });
1433
1634
  }
1434
1635
  const oldLine = row.kind === "add" ? "" : String(row.oldLine);
1435
1636
  const newLine = row.kind === "del" ? "" : String(row.newLine);
1436
1637
  const sign = row.kind === "add" ? "+" : row.kind === "del" ? "-" : " ";
1437
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: CLS.diffLine, "data-kind": row.kind, children: [
1438
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: CLS.diffNumber, children: oldLine }),
1439
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: CLS.diffNumber, children: newLine }),
1440
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: CLS.diffText, children: [
1638
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: CLS.diffLine, "data-kind": row.kind, children: [
1639
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.diffNumber, children: oldLine }),
1640
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.diffNumber, children: newLine }),
1641
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: CLS.diffText, children: [
1441
1642
  sign,
1442
1643
  row.text
1443
1644
  ] })
1444
1645
  ] });
1445
1646
  }
1446
1647
  function useDiff(api, diff) {
1447
- const [loaded, setLoaded] = (0, import_react7.useState)({ kind: "loading" });
1648
+ const [loaded, setLoaded] = (0, import_react8.useState)({ kind: "loading" });
1448
1649
  const { entry, side } = diff;
1449
- (0, import_react7.useEffect)(() => {
1650
+ (0, import_react8.useEffect)(() => {
1450
1651
  let live = true;
1451
1652
  setLoaded({ kind: "loading" });
1452
1653
  api.diff({ path: entry.path, side, origPath: entry.origPath }).then(
@@ -1467,15 +1668,15 @@ function useDiff(api, diff) {
1467
1668
  return loaded;
1468
1669
  }
1469
1670
  function Body({ loaded }) {
1470
- if (loaded.kind === "loading") return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: CLS.empty, children: "\u52A0\u8F7D\u4E2D\u2026" });
1471
- if (loaded.kind === "error") return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: CLS.error, children: loaded.message });
1472
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: CLS.diffBody, children: [
1473
- loaded.rows.length === 0 && !loaded.truncated ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: CLS.empty, children: NO_CHANGES }) : null,
1671
+ if (loaded.kind === "loading") return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: CLS.empty, children: "\u52A0\u8F7D\u4E2D\u2026" });
1672
+ if (loaded.kind === "error") return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: CLS.error, children: loaded.message });
1673
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: CLS.diffBody, children: [
1674
+ loaded.rows.length === 0 && !loaded.truncated ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: CLS.empty, children: NO_CHANGES }) : null,
1474
1675
  loaded.rows.map((row, index) => (
1475
1676
  // Rows have no identity of their own, and one patch's rows never reorder.
1476
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Line, { row }, index)
1677
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Line, { row }, index)
1477
1678
  )),
1478
- loaded.truncated ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: CLS.diffNote, children: TRUNCATED }) : null
1679
+ loaded.truncated ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: CLS.diffNote, children: TRUNCATED }) : null
1479
1680
  ] });
1480
1681
  }
1481
1682
  function ChangesDiff({
@@ -1484,20 +1685,20 @@ function ChangesDiff({
1484
1685
  onBack
1485
1686
  }) {
1486
1687
  const loaded = useDiff(api, diff);
1487
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: CLS.diff, children: [
1488
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: CLS.diffHeader, children: [
1489
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("button", { type: "button", className: CLS.headerButton, title: "\u8FD4\u56DE", "aria-label": "\u8FD4\u56DE", onClick: onBack, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BackIcon, { size: 16 }) }),
1490
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: CLS.diffPath, title: diff.entry.path, children: diff.entry.path }),
1491
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: CLS.diffSide, children: SIDE_LABELS[diff.side] })
1688
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: CLS.diff, children: [
1689
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: CLS.diffHeader, children: [
1690
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", className: CLS.headerButton, title: "\u8FD4\u56DE", "aria-label": "\u8FD4\u56DE", onClick: onBack, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BackIcon, { size: 16 }) }),
1691
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.diffPath, title: diff.entry.path, children: diff.entry.path }),
1692
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.diffSide, children: SIDE_LABELS[diff.side] })
1492
1693
  ] }),
1493
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Body, { loaded })
1694
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Body, { loaded })
1494
1695
  ] });
1495
1696
  }
1496
1697
 
1497
1698
  // src/client/changes/changes-header.tsx
1498
- var import_react8 = require("react");
1499
- var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
1500
- var import_jsx_runtime9 = require("react/jsx-runtime");
1699
+ var import_react9 = require("react");
1700
+ var import_dsh_client_ui_primitives6 = require("@deepseek-ai/dsh-client-ui-primitives");
1701
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1501
1702
  var NEW_BRANCH_ID = "\0new";
1502
1703
  var REMOTE_PREFIX = "remote:";
1503
1704
  var LOCAL_PREFIX = "local:";
@@ -1509,7 +1710,7 @@ function HeaderButton({
1509
1710
  onClick,
1510
1711
  children
1511
1712
  }) {
1512
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1713
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1513
1714
  "button",
1514
1715
  {
1515
1716
  type: "button",
@@ -1528,9 +1729,9 @@ function branchItems(list) {
1528
1729
  ...list.local.map((name) => ({ id: `${LOCAL_PREFIX}${name}`, label: name })),
1529
1730
  ...list.remote.map((name) => ({
1530
1731
  id: `${REMOTE_PREFIX}${name}`,
1531
- label: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: CLS.remoteItem, children: [
1732
+ label: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.remoteItem, children: [
1532
1733
  name,
1533
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.remoteTag, children: "\u8FDC\u7A0B\u5206\u652F" })
1734
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.remoteTag, children: "\u8FDC\u7A0B\u5206\u652F" })
1534
1735
  ] })
1535
1736
  })),
1536
1737
  { id: NEW_BRANCH_ID, label: "\u65B0\u5EFA\u5206\u652F\u2026" }
@@ -1540,9 +1741,9 @@ function NewBranchForm({
1540
1741
  onCreate,
1541
1742
  onCancel
1542
1743
  }) {
1543
- const [name, setName] = (0, import_react8.useState)("");
1744
+ const [name, setName] = (0, import_react9.useState)("");
1544
1745
  const trimmed = name.trim();
1545
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
1746
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1546
1747
  "form",
1547
1748
  {
1548
1749
  className: CLS.branchForm,
@@ -1551,7 +1752,7 @@ function NewBranchForm({
1551
1752
  if (trimmed !== "") onCreate(trimmed);
1552
1753
  },
1553
1754
  children: [
1554
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1755
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1555
1756
  "input",
1556
1757
  {
1557
1758
  className: CLS.branchInput,
@@ -1567,15 +1768,15 @@ function NewBranchForm({
1567
1768
  }
1568
1769
  }
1569
1770
  ),
1570
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "submit", className: CLS.groupAction, disabled: trimmed === "", children: "\u65B0\u5EFA" }),
1571
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", className: CLS.groupAction, onClick: onCancel, children: "\u8FD4\u56DE" })
1771
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { type: "submit", className: CLS.groupAction, disabled: trimmed === "", children: "\u65B0\u5EFA" }),
1772
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { type: "button", className: CLS.groupAction, onClick: onCancel, children: "\u8FD4\u56DE" })
1572
1773
  ]
1573
1774
  }
1574
1775
  );
1575
1776
  }
1576
1777
  var NO_BRANCHES = { current: void 0, local: [], remote: [] };
1577
1778
  function useBranchList(api) {
1578
- const [list, setList] = (0, import_react8.useState)();
1779
+ const [list, setList] = (0, import_react9.useState)();
1579
1780
  const load = () => {
1580
1781
  setList(void 0);
1581
1782
  api.branches().then(
@@ -1599,22 +1800,22 @@ function BranchButton({
1599
1800
  busy,
1600
1801
  onClick
1601
1802
  }) {
1602
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: CLS.branchButton, "aria-label": "\u5206\u652F", disabled: busy, onClick, children: [
1603
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BranchIcon, { size: 16 }),
1604
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.branchName, children: branch ?? DETACHED_LABEL }),
1605
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ChevronIcon, { size: 16 })
1803
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("button", { type: "button", className: CLS.branchButton, "aria-label": "\u5206\u652F", disabled: busy, onClick, children: [
1804
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(BranchIcon, { size: 16 }),
1805
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.branchName, children: branch ?? DETACHED_LABEL }),
1806
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ChevronIcon, { size: 16 })
1606
1807
  ] });
1607
1808
  }
1608
1809
  function BranchPicker({ status, api, busy, actions }) {
1609
- const [open, setOpen] = (0, import_react8.useState)(false);
1610
- const [creating, setCreating] = (0, import_react8.useState)(false);
1810
+ const [open, setOpen] = (0, import_react9.useState)(false);
1811
+ const [creating, setCreating] = (0, import_react9.useState)(false);
1611
1812
  const { list, load } = useBranchList(api);
1612
1813
  if (creating) {
1613
1814
  const finish = (name) => {
1614
1815
  setCreating(false);
1615
1816
  if (name !== void 0) actions.createBranch(name);
1616
1817
  };
1617
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1818
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1618
1819
  NewBranchForm,
1619
1820
  {
1620
1821
  onCreate: finish,
@@ -1624,7 +1825,7 @@ function BranchPicker({ status, api, busy, actions }) {
1624
1825
  }
1625
1826
  );
1626
1827
  }
1627
- const anchor = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1828
+ const anchor = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1628
1829
  BranchButton,
1629
1830
  {
1630
1831
  branch: status.branch,
@@ -1635,8 +1836,8 @@ function BranchPicker({ status, api, busy, actions }) {
1635
1836
  }
1636
1837
  }
1637
1838
  );
1638
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1639
- import_dsh_client_ui_primitives5.Menu,
1839
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1840
+ import_dsh_client_ui_primitives6.Menu,
1640
1841
  {
1641
1842
  open,
1642
1843
  className: CLS.branchMenu,
@@ -1658,27 +1859,27 @@ function BranchPicker({ status, api, busy, actions }) {
1658
1859
  }
1659
1860
  function ChangesHeader({ status, api, busy, refreshing, actions }) {
1660
1861
  const tracked = status.ahead !== void 0 && status.behind !== void 0;
1661
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: CLS.header, children: [
1662
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: CLS.headerRow, children: [
1663
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: CLS.title, children: "\u53D8\u66F4" }),
1664
- tracked ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: CLS.distance, title: "\u9886\u5148 / \u843D\u540E\u4E0A\u6E38\u7684\u63D0\u4EA4\u6570", children: [
1862
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: CLS.header, children: [
1863
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: CLS.headerRow, children: [
1864
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.title, children: "\u53D8\u66F4" }),
1865
+ tracked ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.distance, title: "\u9886\u5148 / \u843D\u540E\u4E0A\u6E38\u7684\u63D0\u4EA4\u6570", children: [
1665
1866
  "\u2191",
1666
1867
  status.ahead,
1667
1868
  " \u2193",
1668
1869
  status.behind
1669
1870
  ] }) : null,
1670
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: CLS.headerButtons, children: [
1671
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(HeaderButton, { label: "\u5237\u65B0", disabled: refreshing, onClick: actions.refresh, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RefreshIcon, { size: 16, className: refreshing ? CLS.spinning : void 0 }) }),
1672
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(HeaderButton, { label: "\u62C9\u53D6", disabled: busy, onClick: actions.pull, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(PullIcon, { size: 16 }) }),
1673
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(HeaderButton, { label: "\u63A8\u9001", disabled: busy, onClick: actions.push, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(PushIcon, { size: 16 }) })
1871
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.headerButtons, children: [
1872
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(HeaderButton, { label: "\u5237\u65B0", disabled: refreshing, onClick: actions.refresh, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RefreshIcon, { size: 16, className: refreshing ? CLS.spinning : void 0 }) }),
1873
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(HeaderButton, { label: "\u62C9\u53D6", disabled: busy, onClick: actions.pull, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(PullIcon, { size: 16 }) }),
1874
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(HeaderButton, { label: "\u63A8\u9001", disabled: busy, onClick: actions.push, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(PushIcon, { size: 16 }) })
1674
1875
  ] })
1675
1876
  ] }),
1676
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BranchPicker, { status, api, busy, actions })
1877
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(BranchPicker, { status, api, busy, actions })
1677
1878
  ] });
1678
1879
  }
1679
1880
 
1680
1881
  // src/client/changes/changes-list.tsx
1681
- var import_react9 = require("react");
1882
+ var import_react10 = require("react");
1682
1883
 
1683
1884
  // src/client/changes/changes-model.ts
1684
1885
  var GROUP_IDS = ["staged", "unstaged", "untracked"];
@@ -1738,7 +1939,7 @@ var STATUS_LABELS = {
1738
1939
  };
1739
1940
 
1740
1941
  // src/client/changes/changes-row.tsx
1741
- var import_jsx_runtime10 = require("react/jsx-runtime");
1942
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1742
1943
  var BADGES = {
1743
1944
  ts: { text: "TS", tone: "blue" },
1744
1945
  tsx: { text: "TSX", tone: "blue" },
@@ -1762,8 +1963,8 @@ function badgeOf(path) {
1762
1963
  }
1763
1964
  function RowActions({ group, entry, busy, actions }) {
1764
1965
  const staged = group === "staged";
1765
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.rowActions, children: [
1766
- staged ? null : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1966
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.rowActions, children: [
1967
+ staged ? null : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1767
1968
  "button",
1768
1969
  {
1769
1970
  type: "button",
@@ -1774,10 +1975,10 @@ function RowActions({ group, entry, busy, actions }) {
1774
1975
  onClick: () => {
1775
1976
  actions.discard(group, [entry]);
1776
1977
  },
1777
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(UndoIcon, { size: 14 })
1978
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(UndoIcon, { size: 14 })
1778
1979
  }
1779
1980
  ),
1780
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1981
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1781
1982
  "button",
1782
1983
  {
1783
1984
  type: "button",
@@ -1789,14 +1990,14 @@ function RowActions({ group, entry, busy, actions }) {
1789
1990
  if (staged) actions.unstage([entry.path]);
1790
1991
  else actions.stage([entry.path]);
1791
1992
  },
1792
- children: staged ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(MinusIcon, { size: 14 }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(PlusIcon2, { size: 14 })
1993
+ children: staged ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(MinusIcon, { size: 14 }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(PlusIcon2, { size: 14 })
1793
1994
  }
1794
1995
  )
1795
1996
  ] });
1796
1997
  }
1797
1998
  function PathButton({ group, entry, actions }) {
1798
1999
  const { dir, name } = splitPath(entry.path);
1799
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
2000
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1800
2001
  "button",
1801
2002
  {
1802
2003
  type: "button",
@@ -1806,19 +2007,19 @@ function PathButton({ group, entry, actions }) {
1806
2007
  actions.open(entry, SIDE_OF[group]);
1807
2008
  },
1808
2009
  children: [
1809
- dir === "" ? null : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.dir, dir: "rtl", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("bdo", { dir: "ltr", children: dir }) }),
1810
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.name, children: name })
2010
+ dir === "" ? null : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.dir, dir: "rtl", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("bdo", { dir: "ltr", children: dir }) }),
2011
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.name, children: name })
1811
2012
  ]
1812
2013
  }
1813
2014
  );
1814
2015
  }
1815
2016
  function LineStats({ entry }) {
1816
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.stats, children: [
1817
- entry.additions === void 0 || entry.additions === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.add, children: [
2017
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.stats, children: [
2018
+ entry.additions === void 0 || entry.additions === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.add, children: [
1818
2019
  "+",
1819
2020
  entry.additions
1820
2021
  ] }),
1821
- entry.deletions === void 0 || entry.deletions === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.del, children: [
2022
+ entry.deletions === void 0 || entry.deletions === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.del, children: [
1822
2023
  "\u2212",
1823
2024
  entry.deletions
1824
2025
  ] })
@@ -1827,8 +2028,8 @@ function LineStats({ entry }) {
1827
2028
  function FileRow(props) {
1828
2029
  const { entry, selected, actions } = props;
1829
2030
  const badge = badgeOf(entry.path);
1830
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: CLS.row, "data-status": entry.status === "?" ? "untracked" : entry.status, children: [
1831
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
2031
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: CLS.row, "data-status": entry.status === "?" ? "untracked" : entry.status, children: [
2032
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1832
2033
  "input",
1833
2034
  {
1834
2035
  type: "checkbox",
@@ -1840,35 +2041,35 @@ function FileRow(props) {
1840
2041
  }
1841
2042
  }
1842
2043
  ),
1843
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.letter, title: STATUS_LABELS[entry.status], children: entry.status }),
1844
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: CLS.badge, "data-tone": badge.tone, children: badge.text }),
1845
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(PathButton, { ...props }),
1846
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(LineStats, { entry }),
1847
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RowActions, { ...props })
2044
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.letter, title: STATUS_LABELS[entry.status], children: entry.status }),
2045
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.badge, "data-tone": badge.tone, children: badge.text }),
2046
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(PathButton, { ...props }),
2047
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(LineStats, { entry }),
2048
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(RowActions, { ...props })
1848
2049
  ] });
1849
2050
  }
1850
2051
 
1851
2052
  // src/client/changes/changes-list.tsx
1852
- var import_jsx_runtime11 = require("react/jsx-runtime");
2053
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1853
2054
  function SummaryRow({
1854
2055
  status,
1855
2056
  selected
1856
2057
  }) {
1857
2058
  const { files, additions, deletions } = summarize(status);
1858
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: CLS.summary, children: [
1859
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.summaryTitle, children: [
2059
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CLS.summary, children: [
2060
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: CLS.summaryTitle, children: [
1860
2061
  files,
1861
2062
  " \u4E2A\u672A\u63D0\u4EA4\u53D8\u66F4"
1862
2063
  ] }),
1863
- additions > 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.add, children: [
2064
+ additions > 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: CLS.add, children: [
1864
2065
  "+",
1865
2066
  additions
1866
2067
  ] }) : null,
1867
- deletions > 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.del, children: [
2068
+ deletions > 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: CLS.del, children: [
1868
2069
  "\u2212",
1869
2070
  deletions
1870
2071
  ] }) : null,
1871
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: CLS.summarySelected, children: [
2072
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("span", { className: CLS.summarySelected, children: [
1872
2073
  "\u5DF2\u9009 ",
1873
2074
  selected,
1874
2075
  " \u9879"
@@ -1880,12 +2081,12 @@ function GroupCheckbox({
1880
2081
  selection,
1881
2082
  onChange
1882
2083
  }) {
1883
- const ref = (0, import_react9.useRef)(null);
2084
+ const ref = (0, import_react10.useRef)(null);
1884
2085
  const check = groupCheck(selection, entries);
1885
- (0, import_react9.useEffect)(() => {
2086
+ (0, import_react10.useEffect)(() => {
1886
2087
  if (ref.current !== null) ref.current.indeterminate = check === "some";
1887
2088
  }, [check]);
1888
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2089
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1889
2090
  "input",
1890
2091
  {
1891
2092
  ref,
@@ -1905,7 +2106,7 @@ function TextAction({
1905
2106
  busy,
1906
2107
  onClick
1907
2108
  }) {
1908
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2109
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1909
2110
  "button",
1910
2111
  {
1911
2112
  type: "button",
@@ -1924,7 +2125,7 @@ function GroupActions({
1924
2125
  }) {
1925
2126
  const paths = entries.map((entry) => entry.path);
1926
2127
  if (group === "staged")
1927
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2128
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1928
2129
  TextAction,
1929
2130
  {
1930
2131
  label: "\u5168\u90E8\u53D6\u6D88\u6682\u5B58",
@@ -1934,8 +2135,8 @@ function GroupActions({
1934
2135
  }
1935
2136
  }
1936
2137
  );
1937
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1938
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2138
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
2139
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1939
2140
  TextAction,
1940
2141
  {
1941
2142
  label: "\u5168\u90E8\u64A4\u9500",
@@ -1946,7 +2147,7 @@ function GroupActions({
1946
2147
  }
1947
2148
  }
1948
2149
  ),
1949
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2150
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1950
2151
  TextAction,
1951
2152
  {
1952
2153
  label: "\u5168\u90E8\u6682\u5B58",
@@ -1965,7 +2166,7 @@ function GroupHeader({
1965
2166
  }) {
1966
2167
  const { group, entries, selection, actions } = props;
1967
2168
  const title = GROUP_TITLES[group];
1968
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
2169
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1969
2170
  "div",
1970
2171
  {
1971
2172
  className: CLS.groupHeader,
@@ -1975,7 +2176,7 @@ function GroupHeader({
1975
2176
  onToggle();
1976
2177
  },
1977
2178
  children: [
1978
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2179
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1979
2180
  "button",
1980
2181
  {
1981
2182
  type: "button",
@@ -1983,10 +2184,10 @@ function GroupHeader({
1983
2184
  "aria-expanded": open,
1984
2185
  "aria-label": `${open ? "\u6298\u53E0" : "\u5C55\u5F00"}${title}`,
1985
2186
  onClick: onToggle,
1986
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ChevronIcon, { size: 14, className: open ? void 0 : CLS.collapsed })
2187
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ChevronIcon, { size: 14, className: open ? void 0 : CLS.collapsed })
1987
2188
  }
1988
2189
  ),
1989
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2190
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1990
2191
  GroupCheckbox,
1991
2192
  {
1992
2193
  entries,
@@ -1999,18 +2200,18 @@ function GroupHeader({
1999
2200
  }
2000
2201
  }
2001
2202
  ),
2002
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.groupTitle, children: title }),
2003
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.groupCount, children: entries.length }),
2004
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: CLS.groupActions, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(GroupActions, { ...props }) })
2203
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: CLS.groupTitle, children: title }),
2204
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: CLS.groupCount, children: entries.length }),
2205
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: CLS.groupActions, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(GroupActions, { ...props }) })
2005
2206
  ]
2006
2207
  }
2007
2208
  );
2008
2209
  }
2009
2210
  function Group(props) {
2010
- const [open, setOpen] = (0, import_react9.useState)(true);
2211
+ const [open, setOpen] = (0, import_react10.useState)(true);
2011
2212
  const { group, entries, selection, busy, actions } = props;
2012
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("section", { className: CLS.group, "aria-label": GROUP_TITLES[group], children: [
2013
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2213
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { className: CLS.group, "aria-label": GROUP_TITLES[group], children: [
2214
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2014
2215
  GroupHeader,
2015
2216
  {
2016
2217
  ...props,
@@ -2020,7 +2221,7 @@ function Group(props) {
2020
2221
  }
2021
2222
  }
2022
2223
  ),
2023
- open ? entries.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2224
+ open ? entries.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2024
2225
  FileRow,
2025
2226
  {
2026
2227
  group,
@@ -2035,12 +2236,12 @@ function Group(props) {
2035
2236
  }
2036
2237
  function ChangesList({ status, selection, busy, actions }) {
2037
2238
  const groups = GROUP_IDS.filter((group) => status[group].length > 0);
2038
- if (groups.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: CLS.empty, children: "\u6CA1\u6709\u53D8\u66F4" });
2039
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: CLS.list, children: groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Group, { group, entries: status[group], selection, busy, actions }, group)) });
2239
+ if (groups.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.empty, children: "\u6CA1\u6709\u53D8\u66F4" });
2240
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.list, children: groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Group, { group, entries: status[group], selection, busy, actions }, group)) });
2040
2241
  }
2041
2242
 
2042
2243
  // src/client/changes/use-changes.ts
2043
- var import_react10 = require("react");
2244
+ var import_react11 = require("react");
2044
2245
  var REFRESH_INTERVAL_MS = 15e3;
2045
2246
  var INITIAL = {
2046
2247
  answer: void 0,
@@ -2159,13 +2360,13 @@ function localActions(setState) {
2159
2360
  };
2160
2361
  }
2161
2362
  function useChanges(api) {
2162
- const [state, setState] = (0, import_react10.useState)(INITIAL);
2163
- const current = (0, import_react10.useRef)(state);
2164
- const generation = (0, import_react10.useRef)(0);
2165
- (0, import_react10.useEffect)(() => {
2363
+ const [state, setState] = (0, import_react11.useState)(INITIAL);
2364
+ const current = (0, import_react11.useRef)(state);
2365
+ const generation = (0, import_react11.useRef)(0);
2366
+ (0, import_react11.useEffect)(() => {
2166
2367
  current.current = state;
2167
2368
  }, [state]);
2168
- const { run, refresh } = (0, import_react10.useMemo)(() => {
2369
+ const { run, refresh } = (0, import_react11.useMemo)(() => {
2169
2370
  const refs = {
2170
2371
  current,
2171
2372
  generation: () => generation.current,
@@ -2176,11 +2377,11 @@ function useChanges(api) {
2176
2377
  return { run: createRun(api, setState, refs), refresh: createRefresh(api, setState, refs) };
2177
2378
  }, [api]);
2178
2379
  useAutoRefresh(refresh);
2179
- const actions = (0, import_react10.useMemo)(() => ({ refresh, ...localActions(setState), ...writeActions(run, current) }), [refresh, run]);
2380
+ const actions = (0, import_react11.useMemo)(() => ({ refresh, ...localActions(setState), ...writeActions(run, current) }), [refresh, run]);
2180
2381
  return { state, actions };
2181
2382
  }
2182
2383
  function useAutoRefresh(refresh) {
2183
- (0, import_react10.useEffect)(() => {
2384
+ (0, import_react11.useEffect)(() => {
2184
2385
  const whenVisible = () => {
2185
2386
  if (document.visibilityState !== "hidden") refresh();
2186
2387
  };
@@ -2204,14 +2405,14 @@ function selectedCount(state) {
2204
2405
  }
2205
2406
 
2206
2407
  // src/client/changes/changes-panel.tsx
2207
- var import_jsx_runtime12 = require("react/jsx-runtime");
2408
+ var import_jsx_runtime13 = require("react/jsx-runtime");
2208
2409
  var NO_DIRECTORY = "\u8FD9\u4E2A\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u5DE5\u4F5C\u76EE\u5F55";
2209
2410
  var NOT_A_REPO = "\u5F53\u524D\u5DE5\u4F5C\u533A\u4E0D\u662F Git \u4ED3\u5E93";
2210
2411
  var AI_LABEL = "AI \u751F\u6210\u63D0\u4EA4\u4FE1\u606F";
2211
2412
  var AI_UNAVAILABLE = "\u6682\u672A\u5F00\u653E\uFF0C\u656C\u8BF7\u671F\u5F85";
2212
2413
  function useCwd(list, sessionId) {
2213
- const subscribe = (0, import_react11.useCallback)((listener) => list.subscribe(listener), [list]);
2214
- return (0, import_react11.useSyncExternalStore)(subscribe, () => list.getSnapshot().byId[sessionId]?.cwd);
2414
+ const subscribe = (0, import_react12.useCallback)((listener) => list.subscribe(listener), [list]);
2415
+ return (0, import_react12.useSyncExternalStore)(subscribe, () => list.getSnapshot().byId[sessionId]?.cwd);
2215
2416
  }
2216
2417
  function discardText({ entries }) {
2217
2418
  const [only] = entries;
@@ -2222,18 +2423,18 @@ function DiscardDialog({
2222
2423
  onConfirm,
2223
2424
  onClose
2224
2425
  }) {
2225
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2226
- import_dsh_client_ui_primitives6.Modal,
2426
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2427
+ import_dsh_client_ui_primitives7.Modal,
2227
2428
  {
2228
2429
  open: pending !== void 0,
2229
2430
  onClose,
2230
2431
  title: "\u64A4\u9500\u66F4\u6539",
2231
2432
  closeLabel: "\u5173\u95ED",
2232
2433
  description: pending === void 0 ? void 0 : discardText(pending),
2233
- footer: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
2234
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_dsh_client_ui_primitives6.Button, { variant: "ghost", onClick: onClose, children: "\u53D6\u6D88" }),
2235
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2236
- import_dsh_client_ui_primitives6.Button,
2434
+ footer: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
2435
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_dsh_client_ui_primitives7.Button, { variant: "ghost", onClick: onClose, children: "\u53D6\u6D88" }),
2436
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2437
+ import_dsh_client_ui_primitives7.Button,
2237
2438
  {
2238
2439
  variant: "primary",
2239
2440
  onClick: () => {
@@ -2247,9 +2448,9 @@ function DiscardDialog({
2247
2448
  );
2248
2449
  }
2249
2450
  function AiCommitButton({ anchor }) {
2250
- const [showTip, setShowTip] = (0, import_react11.useState)(false);
2251
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
2252
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2451
+ const [showTip, setShowTip] = (0, import_react12.useState)(false);
2452
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
2453
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2253
2454
  "button",
2254
2455
  {
2255
2456
  type: "button",
@@ -2259,11 +2460,11 @@ function AiCommitButton({ anchor }) {
2259
2460
  onClick: () => {
2260
2461
  setShowTip(true);
2261
2462
  },
2262
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SparkleIcon, {})
2463
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SparkleIcon, {})
2263
2464
  }
2264
2465
  ),
2265
- showTip ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2266
- import_dsh_client_ui_primitives6.Toast,
2466
+ showTip ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2467
+ import_dsh_client_ui_primitives7.Toast,
2267
2468
  {
2268
2469
  text: AI_UNAVAILABLE,
2269
2470
  anchor,
@@ -2279,9 +2480,9 @@ function CommitBox({
2279
2480
  actions
2280
2481
  }) {
2281
2482
  const count = selectedCount(state);
2282
- const [box, setBox] = (0, import_react11.useState)(null);
2283
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CLS.commit, ref: setBox, children: [
2284
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2483
+ const [box, setBox] = (0, import_react12.useState)(null);
2484
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: CLS.commit, ref: setBox, children: [
2485
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2285
2486
  "textarea",
2286
2487
  {
2287
2488
  className: CLS.commitInput,
@@ -2297,9 +2498,9 @@ function CommitBox({
2297
2498
  }
2298
2499
  }
2299
2500
  ),
2300
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CLS.commitRow, children: [
2301
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { type: "button", className: CLS.commitButton, disabled: !canCommit(state), onClick: actions.commit, children: state.busy === "commit" ? "\u63D0\u4EA4\u4E2D\u2026" : `\u63D0\u4EA4 (${String(count)})` }),
2302
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(AiCommitButton, { anchor: box })
2501
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: CLS.commitRow, children: [
2502
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("button", { type: "button", className: CLS.commitButton, disabled: !canCommit(state), onClick: actions.commit, children: state.busy === "commit" ? "\u63D0\u4EA4\u4E2D\u2026" : `\u63D0\u4EA4 (${String(count)})` }),
2503
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AiCommitButton, { anchor: box })
2303
2504
  ] })
2304
2505
  ] });
2305
2506
  }
@@ -2308,9 +2509,9 @@ function ErrorBanner({
2308
2509
  onDismiss
2309
2510
  }) {
2310
2511
  if (error === void 0) return null;
2311
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: CLS.error, role: "alert", children: [
2312
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: error }),
2313
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("button", { type: "button", className: CLS.groupAction, onClick: onDismiss, children: "\u5173\u95ED" })
2512
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: CLS.error, role: "alert", children: [
2513
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: error }),
2514
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("button", { type: "button", className: CLS.groupAction, onClick: onDismiss, children: "\u5173\u95ED" })
2314
2515
  ] });
2315
2516
  }
2316
2517
  function toDiscard({ group, entries }) {
@@ -2318,7 +2519,7 @@ function toDiscard({ group, entries }) {
2318
2519
  return group === "untracked" ? { tracked: [], untracked: paths } : { tracked: paths, untracked: [] };
2319
2520
  }
2320
2521
  function RepoView({ api, state, actions, status }) {
2321
- const [pending, setPending] = (0, import_react11.useState)();
2522
+ const [pending, setPending] = (0, import_react12.useState)();
2322
2523
  const busy = state.busy !== void 0;
2323
2524
  const listActions = {
2324
2525
  select: (paths, selected) => {
@@ -2337,9 +2538,9 @@ function RepoView({ api, state, actions, status }) {
2337
2538
  actions.openDiff({ entry, side });
2338
2539
  }
2339
2540
  };
2340
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
2341
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ChangesHeader, { status, api, busy, refreshing: state.refreshing, actions }),
2342
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2541
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
2542
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChangesHeader, { status, api, busy, refreshing: state.refreshing, actions }),
2543
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2343
2544
  ErrorBanner,
2344
2545
  {
2345
2546
  error: state.error,
@@ -2348,10 +2549,10 @@ function RepoView({ api, state, actions, status }) {
2348
2549
  }
2349
2550
  }
2350
2551
  ),
2351
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SummaryRow, { status, selected: selectedCount(state) }),
2352
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.scroll, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ChangesList, { status, selection: state.selection, busy, actions: listActions }) }),
2353
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(CommitBox, { state, actions }),
2354
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2552
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SummaryRow, { status, selected: selectedCount(state) }),
2553
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: CLS.scroll, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChangesList, { status, selection: state.selection, busy, actions: listActions }) }),
2554
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(CommitBox, { state, actions }),
2555
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2355
2556
  DiscardDialog,
2356
2557
  {
2357
2558
  pending,
@@ -2369,11 +2570,11 @@ function RepoView({ api, state, actions, status }) {
2369
2570
  function Loaded({ api, state, actions }) {
2370
2571
  const { answer, diff } = state;
2371
2572
  if (answer === void 0) {
2372
- return state.error === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.empty, children: "\u52A0\u8F7D\u4E2D\u2026" }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.error, children: state.error });
2573
+ return state.error === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: CLS.empty, children: "\u52A0\u8F7D\u4E2D\u2026" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: CLS.error, children: state.error });
2373
2574
  }
2374
- if (!answer.repo) return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.empty, children: NOT_A_REPO });
2575
+ if (!answer.repo) return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: CLS.empty, children: NOT_A_REPO });
2375
2576
  if (diff !== void 0)
2376
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2577
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2377
2578
  ChangesDiff,
2378
2579
  {
2379
2580
  api,
@@ -2383,26 +2584,26 @@ function Loaded({ api, state, actions }) {
2383
2584
  }
2384
2585
  }
2385
2586
  );
2386
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RepoView, { api, state, actions, status: answer });
2587
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(RepoView, { api, state, actions, status: answer });
2387
2588
  }
2388
2589
  function Panel({ cwd, fetch }) {
2389
- const api = (0, import_react11.useMemo)(() => createGitApi(fetch, cwd), [fetch, cwd]);
2590
+ const api = (0, import_react12.useMemo)(() => createGitApi(fetch, cwd), [fetch, cwd]);
2390
2591
  const { state, actions } = useChanges(api);
2391
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: CLS.panel, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Loaded, { api, state, actions }) });
2592
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: CLS.panel, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Loaded, { api, state, actions }) });
2392
2593
  }
2393
2594
  function ChangesPanel({ sessionId, list, fetch }) {
2394
2595
  const cwd = useCwd(list, sessionId);
2395
- if (cwd === void 0 || cwd === "") return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: `${CLS.panel} ${CLS.empty}`, children: NO_DIRECTORY });
2396
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Panel, { cwd, fetch }, cwd);
2596
+ if (cwd === void 0 || cwd === "") return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: `${CLS.panel} ${CLS.empty}`, children: NO_DIRECTORY });
2597
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Panel, { cwd, fetch }, cwd);
2397
2598
  }
2398
2599
 
2399
2600
  // src/client/changes/changes-title.tsx
2400
- var import_jsx_runtime13 = require("react/jsx-runtime");
2601
+ var import_jsx_runtime14 = require("react/jsx-runtime");
2401
2602
  var CHANGES_TITLE = "\u53D8\u66F4";
2402
2603
  var GLYPH_SIZE = 16;
2403
2604
  function ChangesTitle() {
2404
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
2405
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChangesIcon, { size: GLYPH_SIZE }),
2605
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
2606
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChangesIcon, { size: GLYPH_SIZE }),
2406
2607
  CHANGES_TITLE
2407
2608
  ] });
2408
2609
  }
@@ -2739,23 +2940,23 @@ ${script.id}`;
2739
2940
  }
2740
2941
 
2741
2942
  // src/client/launch-script-entry.tsx
2742
- var import_react14 = require("react");
2743
- var import_dsh_client_ui_primitives10 = require("@deepseek-ai/dsh-client-ui-primitives");
2943
+ var import_react15 = require("react");
2944
+ var import_dsh_client_ui_primitives11 = require("@deepseek-ai/dsh-client-ui-primitives");
2744
2945
 
2745
2946
  // src/client/launch-script-dialog.tsx
2746
- var import_dsh_client_ui_primitives9 = require("@deepseek-ai/dsh-client-ui-primitives");
2947
+ var import_dsh_client_ui_primitives10 = require("@deepseek-ai/dsh-client-ui-primitives");
2747
2948
 
2748
2949
  // src/client/launch-script-form.tsx
2749
- var import_react12 = require("react");
2750
- var import_dsh_client_ui_primitives7 = require("@deepseek-ai/dsh-client-ui-primitives");
2751
- var import_jsx_runtime14 = require("react/jsx-runtime");
2950
+ var import_react13 = require("react");
2951
+ var import_dsh_client_ui_primitives8 = require("@deepseek-ai/dsh-client-ui-primitives");
2952
+ var import_jsx_runtime15 = require("react/jsx-runtime");
2752
2953
  var NAME_LABEL = "\u540D\u79F0";
2753
2954
  var NAME_PLACEHOLDER = "\u4F8B\u5982\uFF1A\u5F00\u53D1\u670D\u52A1\u5668\uFF08\u53EF\u7559\u7A7A\uFF09";
2754
2955
  var COMMAND_LABEL = "\u547D\u4EE4";
2755
2956
  var COMMAND_PLACEHOLDER = "npm run dev";
2756
2957
  var COMMAND_HINT = "\u5728\u4F1A\u8BDD\u7684\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u6267\u884C\u3002\u591A\u884C\u547D\u4EE4\u4F1A\u9010\u884C\u6267\u884C\u3002\u2318/Ctrl + Enter \u4FDD\u5B58\u3002";
2757
2958
  function useScriptForm(initial) {
2758
- const [draft, setDraft] = (0, import_react12.useState)(initial);
2959
+ const [draft, setDraft] = (0, import_react13.useState)(initial);
2759
2960
  return {
2760
2961
  draft,
2761
2962
  problem: draftProblem(draft),
@@ -2768,11 +2969,11 @@ function useScriptForm(initial) {
2768
2969
  };
2769
2970
  }
2770
2971
  function CommandField(props) {
2771
- const commandId = (0, import_react12.useId)();
2772
- const hintId = (0, import_react12.useId)();
2773
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: LS.field, children: [
2774
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { className: LS.label, htmlFor: commandId, children: COMMAND_LABEL }),
2775
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2972
+ const commandId = (0, import_react13.useId)();
2973
+ const hintId = (0, import_react13.useId)();
2974
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: LS.field, children: [
2975
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { className: LS.label, htmlFor: commandId, children: COMMAND_LABEL }),
2976
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
2776
2977
  "textarea",
2777
2978
  {
2778
2979
  id: commandId,
@@ -2790,22 +2991,22 @@ function CommandField(props) {
2790
2991
  }
2791
2992
  }
2792
2993
  ),
2793
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { id: hintId, className: LS.hint, children: COMMAND_HINT })
2994
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { id: hintId, className: LS.hint, children: COMMAND_HINT })
2794
2995
  ] });
2795
2996
  }
2796
2997
  function LaunchScriptForm(props) {
2797
2998
  const { form, error, onSubmit } = props;
2798
- const nameId = (0, import_react12.useId)();
2999
+ const nameId = (0, import_react13.useId)();
2799
3000
  const submitOnShortcut = (event) => {
2800
3001
  if (event.key !== "Enter" || !(event.metaKey || event.ctrlKey) || event.nativeEvent.isComposing) return;
2801
3002
  event.preventDefault();
2802
3003
  onSubmit();
2803
3004
  };
2804
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: LS.form, onKeyDown: submitOnShortcut, children: [
2805
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: LS.field, children: [
2806
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { className: LS.label, htmlFor: nameId, children: NAME_LABEL }),
2807
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2808
- import_dsh_client_ui_primitives7.Input,
3005
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: LS.form, onKeyDown: submitOnShortcut, children: [
3006
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: LS.field, children: [
3007
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { className: LS.label, htmlFor: nameId, children: NAME_LABEL }),
3008
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3009
+ import_dsh_client_ui_primitives8.Input,
2809
3010
  {
2810
3011
  id: nameId,
2811
3012
  value: form.draft.name,
@@ -2817,15 +3018,15 @@ function LaunchScriptForm(props) {
2817
3018
  }
2818
3019
  )
2819
3020
  ] }),
2820
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CommandField, { command: form.draft.command, onChange: form.setCommand }),
2821
- error === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { role: "alert", className: LS.error, children: error })
3021
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(CommandField, { command: form.draft.command, onChange: form.setCommand }),
3022
+ error === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { role: "alert", className: LS.error, children: error })
2822
3023
  ] });
2823
3024
  }
2824
3025
 
2825
3026
  // src/client/launch-script-list.tsx
2826
- var import_react13 = require("react");
2827
- var import_dsh_client_ui_primitives8 = require("@deepseek-ai/dsh-client-ui-primitives");
2828
- var import_jsx_runtime15 = require("react/jsx-runtime");
3027
+ var import_react14 = require("react");
3028
+ var import_dsh_client_ui_primitives9 = require("@deepseek-ai/dsh-client-ui-primitives");
3029
+ var import_jsx_runtime16 = require("react/jsx-runtime");
2829
3030
  var DEFAULT_BADGE2 = "\u9ED8\u8BA4";
2830
3031
  var RUN = "\u8FD0\u884C";
2831
3032
  var EDIT = "\u7F16\u8F91";
@@ -2835,8 +3036,8 @@ var CONFIRM_DELETE = "\u518D\u70B9\u4E00\u6B21\u5220\u9664";
2835
3036
  var EMPTY_TEXT = "\u8FD8\u6CA1\u6709\u542F\u52A8\u811A\u672C\u3002\u6DFB\u52A0\u4E00\u6761\u5E38\u7528\u547D\u4EE4\uFF0C\u4F8B\u5982\u542F\u52A8\u5F00\u53D1\u670D\u52A1\u5668\uFF0C\u4E4B\u540E\u5728\u6807\u9898\u680F\u4E00\u952E\u8FD0\u884C\u3002";
2836
3037
  var TOOLTIP_DELAY_MS2 = 500;
2837
3038
  function RowButton(props) {
2838
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_dsh_client_ui_primitives8.Tooltip, { label: props.label, side: "top", delayMs: TOOLTIP_DELAY_MS2, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
2839
- import_dsh_client_ui_primitives8.Button,
3039
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.Tooltip, { label: props.label, side: "top", delayMs: TOOLTIP_DELAY_MS2, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
3040
+ import_dsh_client_ui_primitives9.Button,
2840
3041
  {
2841
3042
  size: "sm",
2842
3043
  className: LS.iconButton,
@@ -2850,9 +3051,9 @@ function RowButton(props) {
2850
3051
  function RowActions2(props) {
2851
3052
  const { script, first, actions, confirming, onConfirm } = props;
2852
3053
  const label = scriptLabel(script);
2853
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: LS.rowActions, children: [
2854
- first ? null : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
2855
- import_dsh_client_ui_primitives8.Button,
3054
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: LS.rowActions, children: [
3055
+ first ? null : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
3056
+ import_dsh_client_ui_primitives9.Button,
2856
3057
  {
2857
3058
  size: "sm",
2858
3059
  onClick: () => {
@@ -2861,9 +3062,9 @@ function RowActions2(props) {
2861
3062
  children: MAKE_DEFAULT
2862
3063
  }
2863
3064
  ),
2864
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(RowButton, { label: `${RUN} ${label}`, onClick: () => actions.onRun(script), children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_dsh_client_ui_primitives8.IconPlayOutlineRegular, {}) }),
2865
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(RowButton, { label: `${EDIT} ${label}`, onClick: () => actions.onEdit(script), children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_dsh_client_ui_primitives8.IconEditOutlineRegular, {}) }),
2866
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3065
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(RowButton, { label: `${RUN} ${label}`, onClick: () => actions.onRun(script), children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.IconPlayOutlineRegular, {}) }),
3066
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(RowButton, { label: `${EDIT} ${label}`, onClick: () => actions.onEdit(script), children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.IconEditOutlineRegular, {}) }),
3067
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2867
3068
  RowButton,
2868
3069
  {
2869
3070
  label: confirming ? CONFIRM_DELETE : `${DELETE} ${label}`,
@@ -2872,15 +3073,15 @@ function RowActions2(props) {
2872
3073
  if (confirming) actions.onRemove(script);
2873
3074
  else onConfirm();
2874
3075
  },
2875
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_dsh_client_ui_primitives8.IconTrashOutlineRegular, {})
3076
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.IconTrashOutlineRegular, {})
2876
3077
  }
2877
3078
  )
2878
3079
  ] });
2879
3080
  }
2880
3081
  function ScriptRow(props) {
2881
3082
  const { script, first } = props;
2882
- const [confirming, setConfirming] = (0, import_react13.useState)(false);
2883
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
3083
+ const [confirming, setConfirming] = (0, import_react14.useState)(false);
3084
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
2884
3085
  "li",
2885
3086
  {
2886
3087
  className: LS.row,
@@ -2888,14 +3089,14 @@ function ScriptRow(props) {
2888
3089
  setConfirming(false);
2889
3090
  },
2890
3091
  children: [
2891
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: LS.rowText, children: [
2892
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: LS.rowName, children: [
2893
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: scriptLabel(script) }),
2894
- first ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: LS.badge, children: DEFAULT_BADGE2 }) : null
3092
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: LS.rowText, children: [
3093
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { className: LS.rowName, children: [
3094
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: scriptLabel(script) }),
3095
+ first ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: LS.badge, children: DEFAULT_BADGE2 }) : null
2895
3096
  ] }),
2896
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: LS.rowCommand, title: script.command, children: script.command })
3097
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: LS.rowCommand, title: script.command, children: script.command })
2897
3098
  ] }),
2898
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3099
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2899
3100
  RowActions2,
2900
3101
  {
2901
3102
  ...props,
@@ -2910,12 +3111,12 @@ function ScriptRow(props) {
2910
3111
  );
2911
3112
  }
2912
3113
  function LaunchScriptList(props) {
2913
- if (props.scripts.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: LS.empty, children: EMPTY_TEXT });
2914
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { className: LS.list, children: props.scripts.map((script, index) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ScriptRow, { script, first: index === 0, actions: props.actions }, script.id)) });
3114
+ if (props.scripts.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: LS.empty, children: EMPTY_TEXT });
3115
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { className: LS.list, children: props.scripts.map((script, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ScriptRow, { script, first: index === 0, actions: props.actions }, script.id)) });
2915
3116
  }
2916
3117
 
2917
3118
  // src/client/launch-script-dialog.tsx
2918
- var import_jsx_runtime16 = require("react/jsx-runtime");
3119
+ var import_jsx_runtime17 = require("react/jsx-runtime");
2919
3120
  var TITLE2 = "\u542F\u52A8\u811A\u672C";
2920
3121
  var ADD_TITLE = "\u6DFB\u52A0\u542F\u52A8\u811A\u672C";
2921
3122
  var EDIT_TITLE = "\u7F16\u8F91\u542F\u52A8\u811A\u672C";
@@ -2938,26 +3139,26 @@ function FormPage(props) {
2938
3139
  onPage(LIST_PAGE);
2939
3140
  };
2940
3141
  const shown = error ?? (form.draft.command.trim() === "" ? void 0 : form.problem);
2941
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2942
- import_dsh_client_ui_primitives9.Modal,
3142
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3143
+ import_dsh_client_ui_primitives10.Modal,
2943
3144
  {
2944
3145
  open: true,
2945
3146
  title: draft.id === void 0 ? ADD_TITLE : EDIT_TITLE,
2946
3147
  closeLabel: CLOSE,
2947
3148
  className: LS.dialog,
2948
3149
  onClose,
2949
- footer: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: LS.footer, children: [
2950
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.Button, { variant: "ghost", onClick: backToList ? () => onPage(LIST_PAGE) : onClose, children: backToList ? BACK : CANCEL }),
2951
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.Button, { variant: "primary", disabled: form.problem !== void 0, onClick: submit, children: SAVE })
3150
+ footer: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: LS.footer, children: [
3151
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.Button, { variant: "ghost", onClick: backToList ? () => onPage(LIST_PAGE) : onClose, children: backToList ? BACK : CANCEL }),
3152
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.Button, { variant: "primary", disabled: form.problem !== void 0, onClick: submit, children: SAVE })
2952
3153
  ] }),
2953
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(LaunchScriptForm, { form, error: shown, onSubmit: submit })
3154
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LaunchScriptForm, { form, error: shown, onSubmit: submit })
2954
3155
  }
2955
3156
  );
2956
3157
  }
2957
3158
  function ListPage(props) {
2958
3159
  const { scripts, error, onPage, onChange, onRun, onClose } = props;
2959
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
2960
- import_dsh_client_ui_primitives9.Modal,
3160
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
3161
+ import_dsh_client_ui_primitives10.Modal,
2961
3162
  {
2962
3163
  open: true,
2963
3164
  title: TITLE2,
@@ -2965,21 +3166,21 @@ function ListPage(props) {
2965
3166
  closeLabel: CLOSE,
2966
3167
  className: LS.dialog,
2967
3168
  onClose,
2968
- footer: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: LS.footer, children: [
2969
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2970
- import_dsh_client_ui_primitives9.Button,
3169
+ footer: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: LS.footer, children: [
3170
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3171
+ import_dsh_client_ui_primitives10.Button,
2971
3172
  {
2972
3173
  "data-leading": "",
2973
3174
  variant: "outline",
2974
- icon: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.IconPlusOutlineRegular, { size: 14 }),
3175
+ icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.IconPlusOutlineRegular, { size: 14 }),
2975
3176
  onClick: () => onPage(NEW_SCRIPT_PAGE),
2976
3177
  children: ADD
2977
3178
  }
2978
3179
  ),
2979
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_dsh_client_ui_primitives9.Button, { variant: "primary", onClick: onClose, children: DONE })
3180
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.Button, { variant: "primary", onClick: onClose, children: DONE })
2980
3181
  ] }),
2981
3182
  children: [
2982
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
3183
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
2983
3184
  LaunchScriptList,
2984
3185
  {
2985
3186
  scripts,
@@ -2991,19 +3192,19 @@ function ListPage(props) {
2991
3192
  }
2992
3193
  }
2993
3194
  ),
2994
- error === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { role: "alert", className: LS.error, children: error })
3195
+ error === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { role: "alert", className: LS.error, children: error })
2995
3196
  ]
2996
3197
  }
2997
3198
  );
2998
3199
  }
2999
3200
  function LaunchScriptDialog(props) {
3000
3201
  const { page } = props;
3001
- if (page.kind === "list") return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ListPage, { ...props });
3002
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(FormPage, { ...props, draft: page.draft }, page.draft.id ?? "new");
3202
+ if (page.kind === "list") return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ListPage, { ...props });
3203
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(FormPage, { ...props, draft: page.draft }, page.draft.id ?? "new");
3003
3204
  }
3004
3205
 
3005
3206
  // src/client/launch-script-entry.tsx
3006
- var import_jsx_runtime17 = require("react/jsx-runtime");
3207
+ var import_jsx_runtime18 = require("react/jsx-runtime");
3007
3208
  var MANAGE_ID = "dsh-ccgui.launch-scripts.manage";
3008
3209
  var SET_UP = "\u8BBE\u7F6E\u542F\u52A8\u811A\u672C";
3009
3210
  var RUN_PREFIX = "\u8FD0\u884C\uFF1A";
@@ -3015,35 +3216,35 @@ function message(error) {
3015
3216
  return error instanceof Error ? error.message : String(error);
3016
3217
  }
3017
3218
  function useWorkspaceScripts(list, book, sessionId) {
3018
- const subscribeList = (0, import_react14.useCallback)((listener) => list.subscribe(listener), [list]);
3019
- const cwd = (0, import_react14.useSyncExternalStore)(subscribeList, () => list.getSnapshot().byId[sessionId]?.cwd);
3020
- const subscribeBook = (0, import_react14.useCallback)((listener) => book.subscribe(listener), [book]);
3021
- const scripts = (0, import_react14.useSyncExternalStore)(subscribeBook, () => book.read(cwd));
3219
+ const subscribeList = (0, import_react15.useCallback)((listener) => list.subscribe(listener), [list]);
3220
+ const cwd = (0, import_react15.useSyncExternalStore)(subscribeList, () => list.getSnapshot().byId[sessionId]?.cwd);
3221
+ const subscribeBook = (0, import_react15.useCallback)((listener) => book.subscribe(listener), [book]);
3222
+ const scripts = (0, import_react15.useSyncExternalStore)(subscribeBook, () => book.read(cwd));
3022
3223
  return { cwd, scripts };
3023
3224
  }
3024
3225
  function MenuRow({ script }) {
3025
3226
  const label = scriptLabel(script);
3026
3227
  const command = script.command.trim();
3027
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: LS.menuRow, children: [
3028
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: LS.menuName, children: label }),
3029
- command === label ? null : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: LS.menuCommand, children: command })
3228
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { className: LS.menuRow, children: [
3229
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: LS.menuName, children: label }),
3230
+ command === label ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: LS.menuCommand, children: command })
3030
3231
  ] });
3031
3232
  }
3032
3233
  function menuItems(scripts) {
3033
3234
  return [
3034
3235
  ...scripts.map((script) => ({
3035
3236
  id: script.id,
3036
- label: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(MenuRow, { script }),
3037
- icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.IconPlayOutlineRegular, { size: 14 })
3237
+ label: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(MenuRow, { script }),
3238
+ icon: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.IconPlayOutlineRegular, { size: 14 })
3038
3239
  })),
3039
- { id: MANAGE_ID, label: MANAGE, icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.IconSettingsOutlineRegular, { size: 14 }) }
3240
+ { id: MANAGE_ID, label: MANAGE, icon: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.IconSettingsOutlineRegular, { size: 14 }) }
3040
3241
  ];
3041
3242
  }
3042
3243
  function useLaunchActions({ sessionId, list, book, runner }) {
3043
3244
  const { cwd, scripts } = useWorkspaceScripts(list, book, sessionId);
3044
- const [page, setPage] = (0, import_react14.useState)();
3045
- const [toast, setToast] = (0, import_react14.useState)();
3046
- const [saveError, setSaveError] = (0, import_react14.useState)();
3245
+ const [page, setPage] = (0, import_react15.useState)();
3246
+ const [toast, setToast] = (0, import_react15.useState)();
3247
+ const [saveError, setSaveError] = (0, import_react15.useState)();
3047
3248
  const openPage = (next) => {
3048
3249
  setSaveError(void 0);
3049
3250
  setPage(next);
@@ -3066,22 +3267,22 @@ function useLaunchActions({ sessionId, list, book, runner }) {
3066
3267
  }
3067
3268
  function RunButton(props) {
3068
3269
  const label = props.primary === void 0 ? SET_UP : `${RUN_PREFIX}${scriptLabel(props.primary)}`;
3069
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.Tooltip, { label, side: "bottom", delayMs: TOOLTIP_DELAY_MS3, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3070
- import_dsh_client_ui_primitives10.Button,
3270
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.Tooltip, { label, side: "bottom", delayMs: TOOLTIP_DELAY_MS3, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3271
+ import_dsh_client_ui_primitives11.Button,
3071
3272
  {
3072
3273
  size: "sm",
3073
3274
  className: LS.run,
3074
3275
  "aria-label": label,
3075
3276
  "data-has-more": props.primary === void 0 ? void 0 : "",
3076
3277
  onClick: props.onClick,
3077
- children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.IconPlayOutlineRegular, {})
3278
+ children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.IconPlayOutlineRegular, {})
3078
3279
  }
3079
3280
  ) });
3080
3281
  }
3081
3282
  function ScriptMenu(props) {
3082
- const [open, setOpen] = (0, import_react14.useState)(false);
3083
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3084
- import_dsh_client_ui_primitives10.Menu,
3283
+ const [open, setOpen] = (0, import_react15.useState)(false);
3284
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3285
+ import_dsh_client_ui_primitives11.Menu,
3085
3286
  {
3086
3287
  open,
3087
3288
  items: menuItems(props.scripts),
@@ -3095,8 +3296,8 @@ function ScriptMenu(props) {
3095
3296
  setOpen(false);
3096
3297
  },
3097
3298
  portal: true,
3098
- anchor: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3099
- import_dsh_client_ui_primitives10.Button,
3299
+ anchor: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3300
+ import_dsh_client_ui_primitives11.Button,
3100
3301
  {
3101
3302
  size: "sm",
3102
3303
  className: LS.more,
@@ -3106,7 +3307,7 @@ function ScriptMenu(props) {
3106
3307
  onClick: () => {
3107
3308
  setOpen((value) => !value);
3108
3309
  },
3109
- children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.IconChevronDownOutlineRegular, {})
3310
+ children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.IconChevronDownOutlineRegular, {})
3110
3311
  }
3111
3312
  )
3112
3313
  }
@@ -3114,10 +3315,10 @@ function ScriptMenu(props) {
3114
3315
  }
3115
3316
  function LaunchScriptEntry(props) {
3116
3317
  const { scripts, page, toast, saveError, openPage, run, change, clearToast } = useLaunchActions(props);
3117
- const [anchor, setAnchor] = (0, import_react14.useState)(null);
3318
+ const [anchor, setAnchor] = (0, import_react15.useState)(null);
3118
3319
  const primary = scripts[0];
3119
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: LS.group, ref: setAnchor, children: [
3120
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3320
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: LS.group, ref: setAnchor, children: [
3321
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3121
3322
  RunButton,
3122
3323
  {
3123
3324
  primary,
@@ -3127,8 +3328,8 @@ function LaunchScriptEntry(props) {
3127
3328
  }
3128
3329
  }
3129
3330
  ),
3130
- primary === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ScriptMenu, { scripts, onRun: run, onManage: () => openPage(LIST_PAGE) }),
3131
- page === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3331
+ primary === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ScriptMenu, { scripts, onRun: run, onManage: () => openPage(LIST_PAGE) }),
3332
+ page === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3132
3333
  LaunchScriptDialog,
3133
3334
  {
3134
3335
  page,
@@ -3143,7 +3344,7 @@ function LaunchScriptEntry(props) {
3143
3344
  newId: props.newId
3144
3345
  }
3145
3346
  ),
3146
- toast === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_dsh_client_ui_primitives10.Toast, { text: toast, anchor, onDone: clearToast })
3347
+ toast === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.Toast, { text: toast, anchor, onDone: clearToast })
3147
3348
  ] });
3148
3349
  }
3149
3350
 
@@ -3399,11 +3600,11 @@ function installCompactTabs(doc) {
3399
3600
  }
3400
3601
 
3401
3602
  // src/client/settings-page.tsx
3402
- var import_dsh_client_ui_primitives13 = require("@deepseek-ai/dsh-client-ui-primitives");
3603
+ var import_dsh_client_ui_primitives14 = require("@deepseek-ai/dsh-client-ui-primitives");
3403
3604
 
3404
3605
  // src/client/cli-prefs-section.tsx
3405
- var import_dsh_client_ui_primitives11 = require("@deepseek-ai/dsh-client-ui-primitives");
3406
- var import_jsx_runtime18 = require("react/jsx-runtime");
3606
+ var import_dsh_client_ui_primitives12 = require("@deepseek-ai/dsh-client-ui-primitives");
3607
+ var import_jsx_runtime19 = require("react/jsx-runtime");
3407
3608
  var SECTION_INTRO = "\u8F93\u5165\u6846 CLI \u5207\u6362\u83DC\u5355\u91CC\u7684\u987A\u5E8F\u548C\u663E\u793A\u7684\u9879\u3002\u5173\u95ED\u7684 CLI \u4E0D\u518D\u51FA\u73B0\u5728\u83DC\u5355\u4E2D\u3002";
3408
3609
  var EMPTY_HINT = "\u6253\u5F00\u4EFB\u4E00\u4F1A\u8BDD\u540E\uFF0C\u8FD9\u91CC\u4F1A\u5217\u51FA\u53EF\u5207\u6362\u7684 CLI\u3002";
3409
3610
  var OFF_HINT = "\u5DF2\u5173\u95ED\uFF0C\u4E0D\u5728 CLI \u83DC\u5355\u4E2D\u663E\u793A";
@@ -3431,26 +3632,26 @@ function MoveButtons({
3431
3632
  last,
3432
3633
  prefs
3433
3634
  }) {
3434
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { className: `${SECTION_CLASS}-moves`, children: [
3435
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3436
- import_dsh_client_ui_primitives11.Button,
3635
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: `${SECTION_CLASS}-moves`, children: [
3636
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3637
+ import_dsh_client_ui_primitives12.Button,
3437
3638
  {
3438
3639
  size: "sm",
3439
3640
  "aria-label": `\u4E0A\u79FB ${entry.label}`,
3440
3641
  disabled: first,
3441
- icon: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.IconChevronUpOutlineRegular, { size: ARROW_SIZE }),
3642
+ icon: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_dsh_client_ui_primitives12.IconChevronUpOutlineRegular, { size: ARROW_SIZE }),
3442
3643
  onClick: () => {
3443
3644
  prefs.move(entry.id, -1);
3444
3645
  }
3445
3646
  }
3446
3647
  ),
3447
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3448
- import_dsh_client_ui_primitives11.Button,
3648
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3649
+ import_dsh_client_ui_primitives12.Button,
3449
3650
  {
3450
3651
  size: "sm",
3451
3652
  "aria-label": `\u4E0B\u79FB ${entry.label}`,
3452
3653
  disabled: last,
3453
- icon: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_dsh_client_ui_primitives11.IconChevronDownOutlineRegular, { size: ARROW_SIZE }),
3654
+ icon: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_dsh_client_ui_primitives12.IconChevronDownOutlineRegular, { size: ARROW_SIZE }),
3454
3655
  onClick: () => {
3455
3656
  prefs.move(entry.id, 1);
3456
3657
  }
@@ -3464,16 +3665,16 @@ function CliRow({
3464
3665
  last,
3465
3666
  prefs
3466
3667
  }) {
3467
- const locked = entry.id === OFFICIAL_PROVIDER_ID;
3468
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("li", { className: `${SECTION_CLASS}-row`, "aria-label": entry.label, children: [
3469
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { className: `${SECTION_CLASS}-name`, children: [
3470
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ProviderMark, { provider: entry.id, size: MARK_SIZE2 }),
3471
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: entry.label }),
3472
- entry.enabled ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: `${SECTION_CLASS}-off`, role: "status", children: OFF_HINT })
3668
+ const locked = isBuiltInChoice(entry.id);
3669
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("li", { className: `${SECTION_CLASS}-row`, "aria-label": entry.label, children: [
3670
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: `${SECTION_CLASS}-name`, children: [
3671
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ProviderMark, { provider: entry.id, size: MARK_SIZE2 }),
3672
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { children: entry.label }),
3673
+ entry.enabled ? null : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: `${SECTION_CLASS}-off`, role: "status", children: OFF_HINT })
3473
3674
  ] }),
3474
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(MoveButtons, { entry, first, last, prefs }),
3475
- locked ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: `${SECTION_CLASS}-locked`, children: LOCKED_HINT }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3476
- import_dsh_client_ui_primitives11.Switch,
3675
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(MoveButtons, { entry, first, last, prefs }),
3676
+ locked ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: `${SECTION_CLASS}-locked`, children: LOCKED_HINT }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3677
+ import_dsh_client_ui_primitives12.Switch,
3477
3678
  {
3478
3679
  checked: entry.enabled,
3479
3680
  label: `\u542F\u7528 ${entry.label}`,
@@ -3487,9 +3688,9 @@ function CliRow({
3487
3688
  }
3488
3689
  function CliPrefsSection({ prefs }) {
3489
3690
  const entries = listedEntries(useStore(prefs));
3490
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("section", { className: SECTION_CLASS, children: [
3491
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "dsh-ccgui-settings-intro", children: entries.length === 0 ? EMPTY_HINT : SECTION_INTRO }),
3492
- entries.length === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "dsh-ccgui-settings-list", children: entries.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
3691
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("section", { className: SECTION_CLASS, children: [
3692
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "dsh-ccgui-settings-intro", children: entries.length === 0 ? EMPTY_HINT : SECTION_INTRO }),
3693
+ entries.length === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("ul", { className: "dsh-ccgui-settings-list", children: entries.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3493
3694
  CliRow,
3494
3695
  {
3495
3696
  entry,
@@ -3499,13 +3700,13 @@ function CliPrefsSection({ prefs }) {
3499
3700
  },
3500
3701
  entry.id
3501
3702
  )) }),
3502
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: `${SECTION_CLASS}-more`, children: MORE_CLIS_HINT })
3703
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: `${SECTION_CLASS}-more`, children: MORE_CLIS_HINT })
3503
3704
  ] });
3504
3705
  }
3505
3706
 
3506
3707
  // src/client/features-section.tsx
3507
- var import_dsh_client_ui_primitives12 = require("@deepseek-ai/dsh-client-ui-primitives");
3508
- var import_jsx_runtime19 = require("react/jsx-runtime");
3708
+ var import_dsh_client_ui_primitives13 = require("@deepseek-ai/dsh-client-ui-primitives");
3709
+ var import_jsx_runtime20 = require("react/jsx-runtime");
3509
3710
  var FEATURES_INTRO = "CC GUI \u5728 DeepSeek Harness \u4E0A\u52A0\u5165\u7684\u4EA4\u4E92\u3002\u5173\u95ED\u67D0\u4E00\u9879\u5373\u6062\u590D\u539F\u6765\u7684\u4EA4\u4E92\uFF0C\u7ACB\u5373\u751F\u6548\u3002";
3510
3711
  var PAGE_CLASS = "dsh-ccgui-settings";
3511
3712
  function FeatureRow({
@@ -3513,13 +3714,13 @@ function FeatureRow({
3513
3714
  enabled,
3514
3715
  settings
3515
3716
  }) {
3516
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("li", { className: `${PAGE_CLASS}-row`, children: [
3517
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
3518
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: `${PAGE_CLASS}-title`, children: feature.title }),
3519
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: `${PAGE_CLASS}-desc`, children: feature.description })
3717
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("li", { className: `${PAGE_CLASS}-row`, children: [
3718
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { children: [
3719
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: `${PAGE_CLASS}-title`, children: feature.title }),
3720
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: `${PAGE_CLASS}-desc`, children: feature.description })
3520
3721
  ] }),
3521
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
3522
- import_dsh_client_ui_primitives12.Switch,
3722
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
3723
+ import_dsh_client_ui_primitives13.Switch,
3523
3724
  {
3524
3725
  checked: enabled,
3525
3726
  label: feature.title,
@@ -3532,14 +3733,14 @@ function FeatureRow({
3532
3733
  }
3533
3734
  function FeaturesSection({ settings }) {
3534
3735
  const flags = useStore(settings);
3535
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("section", { children: [
3536
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: `${PAGE_CLASS}-intro`, children: FEATURES_INTRO }),
3537
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("ul", { className: `${PAGE_CLASS}-list`, children: FEATURES.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(FeatureRow, { feature, enabled: flags[feature.id], settings }, feature.id)) })
3736
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("section", { children: [
3737
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: `${PAGE_CLASS}-intro`, children: FEATURES_INTRO }),
3738
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("ul", { className: `${PAGE_CLASS}-list`, children: FEATURES.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(FeatureRow, { feature, enabled: flags[feature.id], settings }, feature.id)) })
3538
3739
  ] });
3539
3740
  }
3540
3741
 
3541
3742
  // src/client/more-section.tsx
3542
- var import_jsx_runtime20 = require("react/jsx-runtime");
3743
+ var import_jsx_runtime21 = require("react/jsx-runtime");
3543
3744
  var INTRO = "\u6B63\u5728\u5F00\u53D1\u7684\u529F\u80FD\uFF0C\u4F1A\u9646\u7EED\u5728\u8FD9\u91CC\u5F00\u653E\u3002";
3544
3745
  var SOON_LABEL = "\u5373\u5C06\u5F00\u653E\u2026";
3545
3746
  var SOON_CLASS = "dsh-ccgui-more-soon";
@@ -3558,30 +3759,210 @@ var MORE_SECTION_STYLES = `
3558
3759
  .${SOON_CLASS} { flex: 0 0 auto; padding: 2px 8px; border: 0.5px solid var(--dsw-alias-border-l2); border-radius: 999px; color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary)); font-size: 12px; line-height: 18px; }
3559
3760
  `;
3560
3761
  function MoreSection() {
3561
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("section", { children: [
3562
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "dsh-ccgui-settings-intro", children: INTRO }),
3563
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("ul", { className: "dsh-ccgui-settings-list", children: UPCOMING_FEATURES.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("li", { className: "dsh-ccgui-settings-row", children: [
3564
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { children: [
3565
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "dsh-ccgui-settings-title", children: feature.title }),
3566
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "dsh-ccgui-settings-desc", children: feature.description })
3762
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("section", { children: [
3763
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "dsh-ccgui-settings-intro", children: INTRO }),
3764
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "dsh-ccgui-settings-list", children: UPCOMING_FEATURES.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("li", { className: "dsh-ccgui-settings-row", children: [
3765
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
3766
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "dsh-ccgui-settings-title", children: feature.title }),
3767
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "dsh-ccgui-settings-desc", children: feature.description })
3567
3768
  ] }),
3568
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: SOON_CLASS, children: SOON_LABEL })
3769
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: SOON_CLASS, children: SOON_LABEL })
3569
3770
  ] }, feature.id)) })
3570
3771
  ] });
3571
3772
  }
3572
3773
 
3774
+ // src/client/release-notes-section.tsx
3775
+ var import_react17 = require("react");
3776
+
3777
+ // src/client/release-notes.ts
3778
+ var RELEASE_NOTES = [
3779
+ {
3780
+ version: "1.0.2",
3781
+ date: "2026-11-08",
3782
+ sections: [
3783
+ {
3784
+ heading: "\u2728 \u65B0\u529F\u80FD",
3785
+ items: [
3786
+ {
3787
+ title: "\u8BBE\u7F6E\u9875\u7248\u672C\u8BB0\u5F55",
3788
+ text: "CC GUI \u8BBE\u7F6E\u65B0\u589E\u300C\u7248\u672C\u8BB0\u5F55\u300D\u9875\u7B7E\uFF1A\u4E00\u4E2A\u7248\u672C\u4E00\u9875\uFF0C\u7528\u5DE6\u53F3\u7BAD\u5934\u6216\u5706\u70B9\u7FFB\u770B\u6BCF\u4E2A\u7248\u672C\u7684\u66F4\u65B0\u8BF4\u660E\uFF0C\u5F53\u524D\u8FD0\u884C\u7684\u7248\u672C\u4F1A\u6807\u51FA\u6765\u3002"
3789
+ },
3790
+ {
3791
+ title: "\u6253\u5305 Kimi CLI",
3792
+ text: "Kimi Code \u81EA\u5E26 `acp` \u5B50\u547D\u4EE4\uFF0C\u7528\u56FA\u5B9A\u7248\u672C `npx -y @moonshot-ai/kimi-code@2.5.2 acp` \u542F\u52A8\uFF0C\u4E0D\u9700\u8981\u9002\u914D\u5668\uFF1B\u771F\u5B9E\u8D26\u53F7\u5DF2\u9A8C\u8BC1\u3002"
3793
+ },
3794
+ {
3795
+ title: "\u6A21\u578B\u5EA7\u4F4D\u63A5\u7BA1\u6BCF\u4E2A\u4F1A\u8BDD",
3796
+ text: "CLI \u4F1A\u8BDD\u5217 CLI \u81EA\u5DF1\u7684\u6A21\u578B\uFF0C\u5176\u4ED6\u4F1A\u8BDD\u53EA\u5217 DSH \u81EA\u5DF1\u8FD0\u884C\u7684\u63D0\u4F9B\u65B9\uFF0C\u65C1\u8FB9\u662F\u63A8\u7406\u7B49\u7EA7\u83DC\u5355\uFF1B\u540C\u540D\u7684\u6A21\u578B\u7528\u8BF4\u660E\u6216 id \u533A\u5206\u3002"
3797
+ },
3798
+ {
3799
+ title: "CLI \u4F1A\u8BDD\u4E0A\u62A5 token \u7528\u91CF",
3800
+ text: "\u628A ACP \u6BCF\u6B21\u54CD\u5E94\u91CC\u7684 usage \u6620\u5C04\u6210 DSH \u7684 TokenUsage\uFF0CCLI \u4F1A\u8BDD\u4E5F\u80FD\u663E\u793A\u901F\u5EA6\u548C\u7F13\u5B58\u547D\u4E2D\u3002"
3801
+ },
3802
+ {
3803
+ title: "\u8BBE\u7F6E\u9875\u63D0\u793A\u65B0\u7248\u672C",
3804
+ text: "\u6709\u66F4\u65B0\u7684 Release \u65F6\uFF0C\u7248\u672C\u80F6\u56CA\u53D8\u6210\u6307\u5411\u8BE5 Release \u8BF4\u660E\u7684\u94FE\u63A5\u3002"
3805
+ },
3806
+ {
3807
+ title: "\u5207\u6362\u5668\u91CC harness \u53EA\u5217\u4E00\u6761",
3808
+ text: "\u6240\u6709\u975E CLI \u63D0\u4F9B\u65B9\u5408\u5E76\u6210\u4E00\u6761\u300CDeepSeek\u300D\uFF0C\u4E0D\u518D\u9010\u4E2A\u5217\u51FA\u3002"
3809
+ }
3810
+ ]
3811
+ },
3812
+ {
3813
+ heading: "\u{1F41B} \u95EE\u9898\u4FEE\u590D",
3814
+ items: [
3815
+ {
3816
+ title: "Windows \u4E0A `.cmd` \u542F\u52A8\u5668\u8D77\u4E0D\u6765",
3817
+ text: "\u8BFB\u51FA shim \u91CC\u7684\u811A\u672C\u548C\u89E3\u91CA\u5668\u76F4\u63A5\u8FD0\u884C\uFF1B\u89E3\u91CA\u5668\u4E0D\u4E00\u5B9A\u662F node\uFF0C\u4F1A\u6CBF `PATH` \u6700\u591A\u8FFD 4 \u5C42\u3002"
3818
+ },
3819
+ {
3820
+ title: "macOS / Linux \u4ECE Dock \u542F\u52A8\u65F6\u627E\u4E0D\u5230 node",
3821
+ text: "\u542F\u52A8\u65F6\u5411\u767B\u5F55 shell \u8BFB\u4E00\u6B21 `PATH`\uFF0C\u8BFB\u5230\u4E4B\u524D\u8865\u4E0A\u5E38\u89C1\u5B89\u88C5\u76EE\u5F55\uFF0C`npx` \u7CFB CLI \u4E0D\u518D\u4EE5\u9000\u51FA\u7801 127 \u5931\u8D25\u3002"
3822
+ },
3823
+ {
3824
+ title: "npx \u7F13\u5B58\u4E0D\u5B8C\u6574\u65F6\u7ED9\u51FA\u6B63\u786E\u63D0\u793A",
3825
+ text: "\u8BA4\u51FA `_npx` \u7F13\u5B58\u76EE\u5F55\u5E76\u63D0\u793A\u5220\u9664\u540E\u91CD\u8BD5\uFF0C\u800C\u4E0D\u662F\u8BA9\u7528\u6237\u91CD\u88C5\u3002"
3826
+ }
3827
+ ]
3828
+ },
3829
+ {
3830
+ heading: "\u{1F527} \u91CD\u6784",
3831
+ items: [
3832
+ { text: "\u6A21\u578B\u83DC\u5355\u62C6\u51FA `menu-models.ts` \u548C `effort-menu.tsx`\uFF0C\u6E32\u67D3\u884C\u4E3A\u4E0D\u53D8\u3002" },
3833
+ { text: "\u5207\u6362\u5668\u7684\u5185\u7F6E\u9879\u5224\u65AD\u6539\u4E3A `isBuiltInChoice`\uFF0C\u8BBE\u7F6E\u9875\u9501\u5B9A\u4E0E\u504F\u597D\u6E05\u7406\u5171\u7528\u540C\u4E00\u5957\u89C4\u5219\u3002" }
3834
+ ]
3835
+ },
3836
+ {
3837
+ heading: "\u{1F4C4} \u6587\u6863",
3838
+ items: [
3839
+ { text: "\u53D1\u7248\u7EA6\u5B9A\u5199\u8FDB AGENTS.md \u4E0E README\u3002" },
3840
+ { text: "README \u8865\u5145 Kimi CLI \u7684 Node.js 22.19 \u8981\u6C42\u4E0E\u767B\u5F55\u6B65\u9AA4\u3002" }
3841
+ ]
3842
+ }
3843
+ ]
3844
+ },
3845
+ {
3846
+ version: "1.0.1",
3847
+ date: "2026-11-08",
3848
+ sections: [
3849
+ {
3850
+ heading: "\u{1F41B} \u95EE\u9898\u4FEE\u590D",
3851
+ items: [
3852
+ {
3853
+ title: "\u8BBE\u7F6E\u9875 GitHub \u94FE\u63A5\u6307\u5411\u9519\u8BEF\u7684\u4ED3\u5E93",
3854
+ text: "GitHub \u80F6\u56CA\u539F\u672C\u6253\u5F00 desktop-cc-gui\uFF0C\u73B0\u5728\u6307\u5411\u672C\u63D2\u4EF6\u4ED3\u5E93\uFF1B\u6D4B\u8BD5\u6539\u4E3A\u4ECE `package.json` \u8BFB\u4ED3\u5E93\u5730\u5740\uFF0C\u907F\u514D\u518D\u6B21\u6F02\u79FB\u3002"
3855
+ }
3856
+ ]
3857
+ },
3858
+ {
3859
+ heading: "\u{1F527} \u7EF4\u62A4",
3860
+ items: [{ text: "\u53D1\u5E03\u6539\u7528 npm Trusted Publishing\uFF0C\u9760 `release.yml` \u7684 OIDC \u8EAB\u4EFD\u53D1\u5E03\uFF0C\u4E0D\u518D\u4FDD\u5B58\u4EE4\u724C\u3002" }]
3861
+ },
3862
+ {
3863
+ heading: "\u{1F4C4} \u6587\u6863",
3864
+ items: [{ text: "README \u8C03\u6574\u529F\u80FD\u8868\u4F4D\u7F6E\u5E76\u66F4\u65B0\u5305\u63CF\u8FF0\u3002" }]
3865
+ }
3866
+ ]
3867
+ },
3868
+ {
3869
+ version: "1.0.0",
3870
+ date: "2026-11-08",
3871
+ sections: [
3872
+ {
3873
+ heading: "\u2728 \u65B0\u529F\u80FD",
3874
+ items: [
3875
+ {
3876
+ title: "\u63A5\u5165 Agent CLI",
3877
+ text: "Claude Code\u3001Codex CLI\u3001PI CLI\u3001OMP CLI\u3001OpenCode\u3001CodeBuddy CLI \u7ECF ACP \u6CE8\u518C\u6210 DSH \u7684\u6A21\u578B\u63D0\u4F9B\u65B9\uFF0C\u5DE5\u5177\u8C03\u7528\u3001\u5BA1\u6279\u548C\u6539\u52A8\u90FD\u8D70 DSH \u539F\u751F\u754C\u9762\u3002"
3878
+ },
3879
+ {
3880
+ title: "CLI \u4E0E\u6A21\u578B\u83DC\u5355",
3881
+ text: "\u8F93\u5165\u6846\u65C1\u5207\u6362 CLI\uFF1B\u6A21\u578B\u83DC\u5355\u5217\u51FA CLI \u771F\u5B9E\u53EF\u7528\u7684\u6A21\u578B\uFF0C\u4F1A\u8BDD\u4E2D\u9014\u6362\u6A21\u578B\u4E0B\u4E00\u6761\u6D88\u606F\u751F\u6548\u3002"
3882
+ },
3883
+ {
3884
+ title: "\u53D8\u66F4\u9762\u677F",
3885
+ text: "\u53F3\u4FA7\u680F\u628A\u6539\u52A8\u5206\u6210\u5DF2\u6682\u5B58\u3001\u672A\u6682\u5B58\u3001\u672A\u8DDF\u8E2A\uFF0C\u53EF\u4EE5\u6682\u5B58\u3001\u64A4\u9500\u3001\u63D0\u4EA4\u3001\u63A8\u62C9\u3001\u5207\u6362\u5206\u652F\uFF0C\u70B9\u5F00\u6587\u4EF6\u770B\u884C\u5185 diff\u3002"
3886
+ },
3887
+ {
3888
+ title: "\u542F\u52A8\u811A\u672C\u4E0E\u7EC8\u7AEF",
3889
+ text: "\u4F1A\u8BDD\u6807\u9898\u680F\u4FDD\u5B58\u5E38\u7528\u547D\u4EE4\uFF0C\u4E00\u952E\u5728\u7EC8\u7AEF\u6807\u7B7E\u91CC\u8FD0\u884C\uFF1B\u6807\u9898\u680F\u7684\u7EC8\u7AEF\u6309\u94AE\u5F00\u5173\u53F3\u4FA7\u680F\u7EC8\u7AEF\u3002"
3890
+ },
3891
+ {
3892
+ title: "\u6587\u4EF6\u548C\u4F1A\u8BDD\u72B6\u6001",
3893
+ text: "\u5DE5\u4F5C\u533A\u6587\u4EF6\u53F3\u952E\u300C\u6DFB\u52A0\u5230\u5BF9\u8BDD\u300D\u63D2\u5165 `@\u8DEF\u5F84`\uFF1B\u4F1A\u8BDD\u5217\u8868\u663E\u793A\u6240\u7528 CLI \u7684\u56FE\u6807\u548C\u8FD0\u884C\u4E2D\u7684\u84DD\u70B9\u3002"
3894
+ },
3895
+ {
3896
+ title: "CC GUI \u8BBE\u7F6E",
3897
+ text: "CLI \u83DC\u5355\u7684\u987A\u5E8F\u548C\u5F00\u5173\u3001\u754C\u9762\u4EA4\u4E92\u5F00\u5173\u3001\u66F4\u591A\u529F\u80FD\u9884\u544A\u90FD\u96C6\u4E2D\u5728\u4E00\u4E2A\u8BBE\u7F6E\u9875\u91CC\u3002"
3898
+ }
3899
+ ]
3900
+ }
3901
+ ]
3902
+ }
3903
+ ];
3904
+
3573
3905
  // src/client/settings-about.tsx
3574
- var import_react15 = require("react");
3906
+ var import_react16 = require("react");
3575
3907
 
3576
3908
  // src/client/assets/wechat-group.png
3577
3909
  var wechat_group_default = "data:image/png;base64,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";
3578
3910
 
3911
+ // src/client/update-check.ts
3912
+ var LATEST_RELEASE_API = "https://api.github.com/repos/zhukunpenglinyutong/dsh-ccgui/releases/latest";
3913
+ var RELEASE_PAGE_PREFIX = "https://github.com/zhukunpenglinyutong/dsh-ccgui/releases/";
3914
+ var SEMVER = /^v?(\d+)\.(\d+)\.(\d+)$/;
3915
+ var CHECK_TIMEOUT_MS = 8e3;
3916
+ function parseVersion(value) {
3917
+ const match = SEMVER.exec(value.trim());
3918
+ return match ? match.slice(1).map(Number) : void 0;
3919
+ }
3920
+ function isNewerVersion(candidate, current) {
3921
+ const next = parseVersion(candidate);
3922
+ const now = parseVersion(current);
3923
+ if (!next || !now) return false;
3924
+ const index = next.findIndex((part, i) => part !== now[i]);
3925
+ return index !== -1 && (next[index] ?? 0) > (now[index] ?? 0);
3926
+ }
3927
+ function readRelease(body) {
3928
+ if (typeof body !== "object" || body === null) return void 0;
3929
+ const tag = "tag_name" in body ? body.tag_name : void 0;
3930
+ const url = "html_url" in body ? body.html_url : void 0;
3931
+ if (typeof tag !== "string") return void 0;
3932
+ const page = typeof url === "string" && url.startsWith(RELEASE_PAGE_PREFIX) ? url : `${RELEASE_PAGE_PREFIX}tag/${tag}`;
3933
+ return { tag, url: page };
3934
+ }
3935
+ async function checkForUpdate(fetchFn, current) {
3936
+ if (!parseVersion(current)) return void 0;
3937
+ try {
3938
+ const response = await fetchFn(LATEST_RELEASE_API, {
3939
+ headers: { Accept: "application/vnd.github+json" },
3940
+ signal: AbortSignal.timeout(CHECK_TIMEOUT_MS)
3941
+ });
3942
+ if (!response.ok) return void 0;
3943
+ const release = readRelease(await response.json());
3944
+ if (!release || !isNewerVersion(release.tag, current)) return void 0;
3945
+ return { version: release.tag.replace(/^v/, ""), url: release.url };
3946
+ } catch (_error) {
3947
+ return void 0;
3948
+ }
3949
+ }
3950
+ function createUpdateChecker(fetchFn, current) {
3951
+ let pending;
3952
+ return () => {
3953
+ pending ??= checkForUpdate(fetchFn, current);
3954
+ return pending;
3955
+ };
3956
+ }
3957
+
3579
3958
  // src/client/settings-about.tsx
3580
- var import_jsx_runtime21 = require("react/jsx-runtime");
3581
- var PLUGIN_VERSION = true ? "1.0.0" : "\u5F00\u53D1\u7248";
3582
- var REPO_URL = "https://github.com/zhukunpenglinyutong/desktop-cc-gui";
3959
+ var import_jsx_runtime22 = require("react/jsx-runtime");
3960
+ var PLUGIN_VERSION = true ? "1.0.2" : "\u5F00\u53D1\u7248";
3961
+ var REPO_URL = "https://github.com/zhukunpenglinyutong/dsh-ccgui";
3583
3962
  var VERSION_LABEL = "\u7248\u672C";
3584
3963
  var VERSION_VALUE = /^\d/.test(PLUGIN_VERSION) ? `v${PLUGIN_VERSION}` : PLUGIN_VERSION;
3964
+ var UPDATE_ARROW = "\u2191";
3965
+ var updateLabel = (version) => `\u6709\u65B0\u7248\u672C v${version}\uFF0C\u67E5\u770B\u66F4\u65B0\u8BF4\u660E`;
3585
3966
  var WECHAT_LABEL = "\u5FAE\u4FE1\u4EA4\u6D41\u7FA4";
3586
3967
  var WECHAT_DESC = "\u626B\u63CF\u4F5C\u8005\u4E2A\u4EBA\u516C\u4F17\u53F7\u4E8C\u7EF4\u7801\uFF0C\u83B7\u53D6\u5FAE\u4FE1\u4EA4\u6D41\u7FA4\u4E8C\u7EF4\u7801\uFF0C\u52A0\u7FA4\u83B7\u5F97\u6700\u65B0\u8D44\u8BAF\u548C\u6280\u672F\u652F\u6301";
3587
3968
  var WECHAT_TIP = "\u4F7F\u7528\u5FAE\u4FE1\u626B\u4E00\u626B";
@@ -3594,13 +3975,17 @@ var SETTINGS_ABOUT_STYLES = `
3594
3975
  .${ABOUT_CLASS}-value { color: var(--dsw-alias-label-primary); font-weight: 500; }
3595
3976
  button.${ABOUT_CLASS}-pill, a.${ABOUT_CLASS}-pill { cursor: pointer; }
3596
3977
  button.${ABOUT_CLASS}-pill:hover, a.${ABOUT_CLASS}-pill:hover, .${ABOUT_CLASS}-pill[aria-expanded="true"] { color: var(--dsw-alias-label-primary); border-color: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2)); }
3978
+ .${ABOUT_CLASS}-update { gap: 0; border-color: var(--dsw-alias-state-warning-primary, #e5a03a); }
3979
+ .${ABOUT_CLASS}-update .${ABOUT_CLASS}-value { margin-left: 6px; }
3980
+ .${ABOUT_CLASS}-next { margin-left: 8px; padding-left: 8px; border-left: 0.5px solid var(--dsw-alias-border-l2); color: var(--dsw-alias-state-warning-primary, #e5a03a); font-weight: 500; }
3981
+ a.${ABOUT_CLASS}-update:hover { border-color: var(--dsw-alias-state-warning-primary, #e5a03a); }
3597
3982
  .${ABOUT_CLASS}-anchor { position: relative; }
3598
3983
  .${ABOUT_CLASS}-qr { position: absolute; top: calc(100% + 8px); left: 0; z-index: 10; width: 240px; padding: 16px; border: 0; border-radius: 12px; background: var(--dsw-alias-bg-layer-1); --dsw-elevation-stroke-color: var(--dsw-alias-border-l1); box-shadow: var(--dsw-elevation-panel); color: var(--dsw-alias-label-secondary); font-size: 12px; line-height: 18px; text-align: center; }
3599
3984
  .${ABOUT_CLASS}-qr p { margin: 0; }
3600
3985
  .${ABOUT_CLASS}-qr img { display: block; margin: 12px auto 8px; padding: 8px; border-radius: 8px; background: #fff; }
3601
3986
  `;
3602
3987
  function useEscape(active, close) {
3603
- (0, import_react15.useEffect)(() => {
3988
+ (0, import_react16.useEffect)(() => {
3604
3989
  if (!active) return void 0;
3605
3990
  const onKey = (event) => {
3606
3991
  if (event.key === "Escape") close();
@@ -3612,12 +3997,12 @@ function useEscape(active, close) {
3612
3997
  }, [active, close]);
3613
3998
  }
3614
3999
  function WechatGroup() {
3615
- const [open, setOpen] = (0, import_react15.useState)(false);
4000
+ const [open, setOpen] = (0, import_react16.useState)(false);
3616
4001
  useEscape(open, () => {
3617
4002
  setOpen(false);
3618
4003
  });
3619
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: `${ABOUT_CLASS}-anchor`, children: [
3620
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
4004
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: `${ABOUT_CLASS}-anchor`, children: [
4005
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3621
4006
  "button",
3622
4007
  {
3623
4008
  type: "button",
@@ -3629,27 +4014,210 @@ function WechatGroup() {
3629
4014
  children: WECHAT_LABEL
3630
4015
  }
3631
4016
  ),
3632
- open ? /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: `${ABOUT_CLASS}-qr`, children: [
3633
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { children: WECHAT_DESC }),
3634
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("img", { src: wechat_group_default, alt: WECHAT_QR_ALT, width: QR_SIZE, height: QR_SIZE }),
3635
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { children: WECHAT_TIP })
4017
+ open ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: `${ABOUT_CLASS}-qr`, children: [
4018
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { children: WECHAT_DESC }),
4019
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("img", { src: wechat_group_default, alt: WECHAT_QR_ALT, width: QR_SIZE, height: QR_SIZE }),
4020
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { children: WECHAT_TIP })
3636
4021
  ] }) : null
3637
4022
  ] });
3638
4023
  }
3639
- function SettingsAbout() {
3640
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: ABOUT_CLASS, children: [
3641
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("span", { className: `${ABOUT_CLASS}-pill`, children: [
3642
- VERSION_LABEL,
3643
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: `${ABOUT_CLASS}-value`, children: VERSION_VALUE })
4024
+ var defaultCheckUpdate = createUpdateChecker((input, init) => window.fetch(input, init), PLUGIN_VERSION);
4025
+ function useLatestRelease(checkUpdate) {
4026
+ const [latest, setLatest] = (0, import_react16.useState)(void 0);
4027
+ (0, import_react16.useEffect)(() => {
4028
+ let live = true;
4029
+ void checkUpdate().then((release) => {
4030
+ if (live) setLatest(release);
4031
+ });
4032
+ return () => {
4033
+ live = false;
4034
+ };
4035
+ }, [checkUpdate]);
4036
+ return latest;
4037
+ }
4038
+ function VersionPill({ latest }) {
4039
+ const current = /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
4040
+ VERSION_LABEL,
4041
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: `${ABOUT_CLASS}-value`, children: VERSION_VALUE })
4042
+ ] });
4043
+ if (!latest) return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: `${ABOUT_CLASS}-pill`, children: current });
4044
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
4045
+ "a",
4046
+ {
4047
+ className: `${ABOUT_CLASS}-pill ${ABOUT_CLASS}-update`,
4048
+ href: latest.url,
4049
+ target: "_blank",
4050
+ rel: "noreferrer",
4051
+ "aria-label": updateLabel(latest.version),
4052
+ children: [
4053
+ current,
4054
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: `${ABOUT_CLASS}-next`, children: [
4055
+ UPDATE_ARROW,
4056
+ " v",
4057
+ latest.version
4058
+ ] })
4059
+ ]
4060
+ }
4061
+ );
4062
+ }
4063
+ function SettingsAbout({
4064
+ checkUpdate = defaultCheckUpdate
4065
+ }) {
4066
+ const latest = useLatestRelease(checkUpdate);
4067
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: ABOUT_CLASS, children: [
4068
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(VersionPill, { latest }),
4069
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(WechatGroup, {}),
4070
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { className: `${ABOUT_CLASS}-pill`, href: REPO_URL, target: "_blank", rel: "noreferrer", children: "GitHub" })
4071
+ ] });
4072
+ }
4073
+
4074
+ // src/client/release-notes-section.tsx
4075
+ var import_jsx_runtime23 = require("react/jsx-runtime");
4076
+ var INTRO2 = "\u6BCF\u4E2A\u7248\u672C\u4E00\u9875\uFF0C\u7FFB\u9875\u67E5\u770B\u5386\u53F2\u66F4\u65B0\u3002";
4077
+ var CURRENT_LABEL = "\u5F53\u524D\u7248\u672C";
4078
+ var EMPTY_TEXT2 = "\u8FD8\u6CA1\u6709\u7248\u672C\u8BB0\u5F55\u3002";
4079
+ var PREV_LABEL = "\u4E0A\u4E00\u9875";
4080
+ var NEXT_LABEL = "\u4E0B\u4E00\u9875";
4081
+ var DOTS_LABEL = "\u9009\u62E9\u7248\u672C";
4082
+ var NOTES_CLASS = "dsh-ccgui-notes";
4083
+ var pageName = (version) => `v${version} \u7248\u672C\u8BB0\u5F55`;
4084
+ var pagePosition = (index, count) => `\u7B2C ${index + 1} / ${count} \u9875`;
4085
+ var RELEASE_NOTES_STYLES = `
4086
+ .${NOTES_CLASS} { display: flex; flex-direction: column; gap: 12px; }
4087
+ .${NOTES_CLASS}-page { display: flex; flex-direction: column; gap: 14px; padding: 16px; border: 0.5px solid var(--dsw-alias-border-l2); border-radius: 12px; background: var(--dsw-alias-bg-secondary, rgba(127, 127, 127, 0.04)); }
4088
+ .${NOTES_CLASS}-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
4089
+ .${NOTES_CLASS}-version { color: var(--dsw-alias-label-primary); font-size: 15px; line-height: 22px; font-weight: 600; }
4090
+ .${NOTES_CLASS}-current { padding: 0 8px; border: 0.5px solid var(--dsw-alias-border-l2); border-radius: 999px; color: var(--dsw-alias-label-secondary); font-size: 11px; line-height: 18px; }
4091
+ .${NOTES_CLASS}-date { color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary)); font-size: 12px; line-height: 18px; }
4092
+ .${NOTES_CLASS}-pager { display: flex; align-items: center; gap: 2px; margin-left: auto; }
4093
+ .${NOTES_CLASS}-step { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; padding: 0; border: 0.5px solid var(--dsw-alias-border-l2); border-radius: 6px; background: none; color: var(--dsw-alias-label-secondary); font-size: 16px; line-height: 1; cursor: pointer; }
4094
+ .${NOTES_CLASS}-step:hover:not(:disabled) { color: var(--dsw-alias-label-primary); border-color: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2)); }
4095
+ .${NOTES_CLASS}-step:disabled { opacity: 0.35; cursor: default; }
4096
+ .${NOTES_CLASS}-count { min-width: 44px; color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary)); font-size: 12px; line-height: 18px; text-align: center; }
4097
+ .${NOTES_CLASS}-body { display: flex; flex-direction: column; gap: 14px; }
4098
+ .${NOTES_CLASS}-section { display: flex; flex-direction: column; gap: 6px; }
4099
+ .${NOTES_CLASS}-heading { color: var(--dsw-alias-label-primary); font-size: 13px; line-height: 20px; font-weight: 500; }
4100
+ .${NOTES_CLASS}-list { display: flex; flex-direction: column; gap: 6px; margin: 0; padding: 0; list-style: none; }
4101
+ .${NOTES_CLASS}-item { position: relative; padding-left: 12px; color: var(--dsw-alias-label-secondary); font-size: 13px; line-height: 20px; }
4102
+ .${NOTES_CLASS}-item::before { content: '\xB7'; position: absolute; left: 0; color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary)); }
4103
+ .${NOTES_CLASS}-item strong { color: var(--dsw-alias-label-primary); font-weight: 500; }
4104
+ .${NOTES_CLASS}-item code { padding: 1px 4px; border-radius: 4px; background: var(--dsw-alias-bg-tertiary, rgba(127, 127, 127, 0.14)); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
4105
+ .${NOTES_CLASS}-dots { display: flex; justify-content: center; gap: 2px; }
4106
+ .${NOTES_CLASS}-dot { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; padding: 0; border: none; background: none; cursor: pointer; }
4107
+ .${NOTES_CLASS}-dot::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-border-l3, #8a8a8a); }
4108
+ .${NOTES_CLASS}-dot[aria-current="page"]::before { background: var(--dsw-alias-label-primary); }
4109
+ .${NOTES_CLASS}-step:focus-visible, .${NOTES_CLASS}-dot:focus-visible { outline: 2px solid var(--dsw-alias-border-focus, currentColor); outline-offset: 2px; }
4110
+ .${NOTES_CLASS}-empty { margin: 0; color: var(--dsw-alias-label-secondary); font-size: 13px; line-height: 20px; }
4111
+ `;
4112
+ function InlineText({ text }) {
4113
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_jsx_runtime23.Fragment, { children: text.split("`").map((part, index) => index % 2 === 0 ? part : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("code", { children: part }, index)) });
4114
+ }
4115
+ function ItemRow({ item }) {
4116
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("li", { className: `${NOTES_CLASS}-item`, children: [
4117
+ item.title === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("strong", { children: [
4118
+ item.title,
4119
+ "\uFF1A"
3644
4120
  ] }),
3645
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(WechatGroup, {}),
3646
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("a", { className: `${ABOUT_CLASS}-pill`, href: REPO_URL, target: "_blank", rel: "noreferrer", children: "GitHub" })
4121
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(InlineText, { text: item.text })
4122
+ ] });
4123
+ }
4124
+ function SectionBlock({ section }) {
4125
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-section`, children: [
4126
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `${NOTES_CLASS}-heading`, children: section.heading }),
4127
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ul", { className: `${NOTES_CLASS}-list`, children: section.items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ItemRow, { item }, index)) })
4128
+ ] });
4129
+ }
4130
+ function NotesBody({ note }) {
4131
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `${NOTES_CLASS}-body`, children: note.sections.map((section) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SectionBlock, { section }, section.heading)) });
4132
+ }
4133
+ function Pager({
4134
+ index,
4135
+ count,
4136
+ onSelect
4137
+ }) {
4138
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-pager`, children: [
4139
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4140
+ "button",
4141
+ {
4142
+ type: "button",
4143
+ className: `${NOTES_CLASS}-step`,
4144
+ "aria-label": PREV_LABEL,
4145
+ disabled: index === 0,
4146
+ onClick: () => {
4147
+ onSelect(index - 1);
4148
+ },
4149
+ children: "\u2039"
4150
+ }
4151
+ ),
4152
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: `${NOTES_CLASS}-count`, "aria-live": "polite", children: pagePosition(index, count) }),
4153
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4154
+ "button",
4155
+ {
4156
+ type: "button",
4157
+ className: `${NOTES_CLASS}-step`,
4158
+ "aria-label": NEXT_LABEL,
4159
+ disabled: index === count - 1,
4160
+ onClick: () => {
4161
+ onSelect(index + 1);
4162
+ },
4163
+ children: "\u203A"
4164
+ }
4165
+ )
4166
+ ] });
4167
+ }
4168
+ function Dots({
4169
+ index,
4170
+ notes,
4171
+ onSelect
4172
+ }) {
4173
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `${NOTES_CLASS}-dots`, role: "group", "aria-label": DOTS_LABEL, children: notes.map((note, position) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
4174
+ "button",
4175
+ {
4176
+ type: "button",
4177
+ className: `${NOTES_CLASS}-dot`,
4178
+ "aria-label": `v${note.version}`,
4179
+ "aria-current": position === index ? "page" : void 0,
4180
+ onClick: () => {
4181
+ onSelect(position);
4182
+ }
4183
+ },
4184
+ note.version
4185
+ )) });
4186
+ }
4187
+ function ReleaseNotesSection({
4188
+ notes = RELEASE_NOTES,
4189
+ currentVersion = PLUGIN_VERSION
4190
+ }) {
4191
+ const [index, setIndex] = (0, import_react17.useState)(0);
4192
+ const select = (next) => {
4193
+ setIndex(Math.min(Math.max(next, 0), notes.length - 1));
4194
+ };
4195
+ const position = Math.min(Math.max(index, 0), notes.length - 1);
4196
+ const note = notes[position];
4197
+ if (note === void 0) return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: `${NOTES_CLASS}-empty`, children: EMPTY_TEXT2 });
4198
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("section", { children: [
4199
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "dsh-ccgui-settings-intro", children: INTRO2 }),
4200
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: NOTES_CLASS, children: [
4201
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-page`, role: "group", "aria-label": pageName(note.version), children: [
4202
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-head`, children: [
4203
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: `${NOTES_CLASS}-version`, children: [
4204
+ "v",
4205
+ note.version
4206
+ ] }),
4207
+ note.version === currentVersion ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: `${NOTES_CLASS}-current`, children: CURRENT_LABEL }) : null,
4208
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: `${NOTES_CLASS}-date`, children: note.date }),
4209
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Pager, { index: position, count: notes.length, onSelect: select })
4210
+ ] }),
4211
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(NotesBody, { note })
4212
+ ] }),
4213
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Dots, { index: position, notes, onSelect: select })
4214
+ ] })
3647
4215
  ] });
3648
4216
  }
3649
4217
 
3650
4218
  // src/client/settings-tabs.tsx
3651
- var import_react16 = require("react");
3652
- var import_jsx_runtime22 = require("react/jsx-runtime");
4219
+ var import_react18 = require("react");
4220
+ var import_jsx_runtime24 = require("react/jsx-runtime");
3653
4221
  var TABS_CLASS = "dsh-ccgui-tabs";
3654
4222
  var SETTINGS_TABS_STYLES = `
3655
4223
  .${TABS_CLASS} { display: flex; gap: 24px; margin: 4px 0 8px; border-bottom: 0.5px solid var(--dsw-alias-border-l2); }
@@ -3679,7 +4247,7 @@ function TabButton({
3679
4247
  active,
3680
4248
  onSelect
3681
4249
  }) {
3682
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
4250
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3683
4251
  "button",
3684
4252
  {
3685
4253
  type: "button",
@@ -3699,9 +4267,9 @@ function SettingsTabs({
3699
4267
  tabs,
3700
4268
  label
3701
4269
  }) {
3702
- const [selected, setSelected] = (0, import_react16.useState)(tabs[0]?.id);
3703
- const strip = (0, import_react16.useRef)(null);
3704
- const prefix = (0, import_react16.useId)();
4270
+ const [selected, setSelected] = (0, import_react18.useState)(tabs[0]?.id);
4271
+ const strip = (0, import_react18.useRef)(null);
4272
+ const prefix = (0, import_react18.useId)();
3705
4273
  const current = tabs.find((tab) => tab.id === selected) ?? tabs[0];
3706
4274
  const onKeyDown = (event) => {
3707
4275
  const index = tabs.findIndex((tab) => tab.id === current?.id);
@@ -3712,8 +4280,8 @@ function SettingsTabs({
3712
4280
  setSelected(target.id);
3713
4281
  strip.current?.querySelector(`[data-tab="${target.id}"]`)?.focus();
3714
4282
  };
3715
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
3716
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { ref: strip, className: TABS_CLASS, role: "tablist", "aria-label": label, onKeyDown, children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
4283
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [
4284
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { ref: strip, className: TABS_CLASS, role: "tablist", "aria-label": label, onKeyDown, children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3717
4285
  TabButton,
3718
4286
  {
3719
4287
  tab,
@@ -3725,16 +4293,17 @@ function SettingsTabs({
3725
4293
  },
3726
4294
  tab.id
3727
4295
  )) }),
3728
- current === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { role: "tabpanel", id: `${prefix}-${current.id}-panel`, "aria-labelledby": `${prefix}-${current.id}-tab`, children: current.render() })
4296
+ current === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { role: "tabpanel", id: `${prefix}-${current.id}-panel`, "aria-labelledby": `${prefix}-${current.id}-tab`, children: current.render() })
3729
4297
  ] });
3730
4298
  }
3731
4299
 
3732
4300
  // src/client/settings-page.tsx
3733
- var import_jsx_runtime23 = require("react/jsx-runtime");
4301
+ var import_jsx_runtime25 = require("react/jsx-runtime");
3734
4302
  var SETTINGS_TITLE = "CC GUI \u8BBE\u7F6E";
3735
4303
  var CLI_TAB_LABEL = "CLI \u5217\u8868";
3736
4304
  var FEATURES_TAB_LABEL = "\u754C\u9762\u4EA4\u4E92";
3737
4305
  var MORE_TAB_LABEL = "\u66F4\u591A\u529F\u80FD";
4306
+ var NOTES_TAB_LABEL = "\u7248\u672C\u8BB0\u5F55";
3738
4307
  var PAGE_CLASS2 = "dsh-ccgui-settings";
3739
4308
  var SETTINGS_PAGE_STYLES = `
3740
4309
  .${PAGE_CLASS2} { display: flex; flex-direction: column; gap: 12px; box-sizing: border-box; max-width: 720px; color: var(--dsw-alias-label-primary); }
@@ -3750,26 +4319,27 @@ var SETTINGS_PAGE_STYLES = `
3750
4319
  .${PAGE_CLASS2}-row + .${PAGE_CLASS2}-row { border-top: 0.5px solid var(--dsw-alias-border-l2); }
3751
4320
  .${PAGE_CLASS2}-title { color: var(--dsw-alias-label-primary); font-size: 13px; font-weight: 500; line-height: 20px; }
3752
4321
  .${PAGE_CLASS2}-desc { margin-top: 2px; color: var(--dsw-alias-label-secondary); font-size: 12px; line-height: 18px; }
3753
- ${SETTINGS_TABS_STYLES}${CLI_PREFS_STYLES}${SETTINGS_ABOUT_STYLES}${MORE_SECTION_STYLES}`;
4322
+ ${SETTINGS_TABS_STYLES}${CLI_PREFS_STYLES}${SETTINGS_ABOUT_STYLES}${MORE_SECTION_STYLES}${RELEASE_NOTES_STYLES}`;
3754
4323
  function SettingsPage({
3755
4324
  settings,
3756
4325
  cliPrefs
3757
4326
  }) {
3758
4327
  const tabs = [
3759
- { id: "cli", label: CLI_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CliPrefsSection, { prefs: cliPrefs }) },
3760
- { id: "features", label: FEATURES_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FeaturesSection, { settings }) },
3761
- { id: "more", label: MORE_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(MoreSection, {}) }
4328
+ { id: "cli", label: CLI_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(CliPrefsSection, { prefs: cliPrefs }) },
4329
+ { id: "features", label: FEATURES_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(FeaturesSection, { settings }) },
4330
+ { id: "more", label: MORE_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(MoreSection, {}) },
4331
+ { id: "notes", label: NOTES_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ReleaseNotesSection, {}) }
3762
4332
  ];
3763
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: PAGE_CLASS2, children: [
3764
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${PAGE_CLASS2}-header`, children: [
3765
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h1", { children: SETTINGS_TITLE }),
3766
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SettingsAbout, {})
4333
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: PAGE_CLASS2, children: [
4334
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `${PAGE_CLASS2}-header`, children: [
4335
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h1", { children: SETTINGS_TITLE }),
4336
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SettingsAbout, {})
3767
4337
  ] }),
3768
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SettingsTabs, { tabs, label: SETTINGS_TITLE })
4338
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SettingsTabs, { tabs, label: SETTINGS_TITLE })
3769
4339
  ] });
3770
4340
  }
3771
4341
  function SettingsIcon({ size }) {
3772
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_dsh_client_ui_primitives13.IconSlidersTwoOutlineRegular, { size });
4342
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_dsh_client_ui_primitives14.IconSlidersTwoOutlineRegular, { size });
3773
4343
  }
3774
4344
 
3775
4345
  // src/client/settings-register.ts
@@ -3815,7 +4385,7 @@ function gateInject(ctx, settings, id, inject2) {
3815
4385
  }
3816
4386
 
3817
4387
  // src/client/index.tsx
3818
- var import_jsx_runtime24 = require("react/jsx-runtime");
4388
+ var import_jsx_runtime26 = require("react/jsx-runtime");
3819
4389
  var SLOT3 = "conversation.input.left";
3820
4390
  var MODEL_SLOT = "conversation.input.right";
3821
4391
  var SESSION_ROW_SLOT = "sidebar.session.row.leading";
@@ -3868,7 +4438,7 @@ function installStyles() {
3868
4438
  };
3869
4439
  }
3870
4440
  function useStarted(session) {
3871
- const snapshot = (0, import_react17.useSyncExternalStore)(
4441
+ const snapshot = (0, import_react19.useSyncExternalStore)(
3872
4442
  (listener) => session?.subscribe(listener) ?? (() => {
3873
4443
  }),
3874
4444
  () => session?.getSnapshot() ?? NOT_STARTED
@@ -3876,7 +4446,7 @@ function useStarted(session) {
3876
4446
  return snapshot.blank === false;
3877
4447
  }
3878
4448
  function useChoose(state, select) {
3879
- const [error, setError] = (0, import_react17.useState)();
4449
+ const [error, setError] = (0, import_react19.useState)();
3880
4450
  const choose = (id) => {
3881
4451
  setError(void 0);
3882
4452
  const selection = selectionForChoice(state, id);
@@ -3896,23 +4466,23 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
3896
4466
  const state = useStore(directory);
3897
4467
  const started = useStarted(session);
3898
4468
  const prefsSnapshot = useStore(prefs);
3899
- const [open, setOpen] = (0, import_react17.useState)(false);
4469
+ const [open, setOpen] = (0, import_react19.useState)(false);
3900
4470
  const { error, choose } = useChoose(state, select);
3901
- (0, import_react17.useEffect)(load, [load]);
4471
+ (0, import_react19.useEffect)(load, [load]);
3902
4472
  const { visible, items: listed, currentId, currentLabel } = cliChoices(state);
3903
- (0, import_react17.useEffect)(() => {
4473
+ (0, import_react19.useEffect)(() => {
3904
4474
  prefs.remember(listed);
3905
4475
  }, [prefs, listed]);
3906
4476
  if (!visible) return null;
3907
4477
  const items = arrangeChoices(listed, prefsSnapshot);
3908
4478
  const hint = started ? "\u8981\u6362 CLI\uFF0C\u8BF7\u65B0\u5EFA\u4F1A\u8BDD" : error ?? "\u5207\u6362 CLI";
3909
4479
  const label = error === void 0 ? currentLabel ?? NO_CHOICE_LABEL : SWITCH_FAILED_LABEL;
3910
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3911
- import_dsh_client_ui_primitives14.Menu,
4480
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
4481
+ import_dsh_client_ui_primitives15.Menu,
3912
4482
  {
3913
4483
  open: open && !started,
3914
4484
  className: WRAP_CLASS,
3915
- items: items.map((item) => ({ ...item, icon: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ProviderMark, { provider: item.id, size: 14 }) })),
4485
+ items: items.map((item) => ({ ...item, icon: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ProviderMark, { provider: item.id, size: 14 }) })),
3916
4486
  selectedId: currentId,
3917
4487
  onSelect: (id) => {
3918
4488
  setOpen(false);
@@ -3923,7 +4493,7 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
3923
4493
  },
3924
4494
  side: "top",
3925
4495
  portal: true,
3926
- anchor: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
4496
+ anchor: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
3927
4497
  "button",
3928
4498
  {
3929
4499
  type: "button",
@@ -3935,9 +4505,9 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
3935
4505
  setOpen((value) => !value);
3936
4506
  },
3937
4507
  children: [
3938
- currentId === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ProviderMark, { provider: currentId, size: 14 }),
4508
+ currentId === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ProviderMark, { provider: currentId, size: 14 }),
3939
4509
  label,
3940
- started ? null : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_dsh_client_ui_primitives14.IconChevronDownOutlineRegular, { size: 14 })
4510
+ started ? null : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_dsh_client_ui_primitives15.IconChevronDownOutlineRegular, { size: 14 })
3941
4511
  ]
3942
4512
  }
3943
4513
  )
@@ -3947,7 +4517,7 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
3947
4517
  function SessionMark({ sessionId, list }) {
3948
4518
  const provider = useSessionProvider(list, sessionId);
3949
4519
  if (provider === void 0) return null;
3950
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: SESSION_MARK_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ProviderMark, { provider, size: 14 }) });
4520
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: SESSION_MARK_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ProviderMark, { provider, size: 14 }) });
3951
4521
  }
3952
4522
  function directoryFace(ctx, sessionId) {
3953
4523
  const directory = ctx.modelDirectories.directoryFor(sessionId);