dsh-ccgui 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -11
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/cordis.patch.yml +4 -0
- package/lib/cli-session.js +2 -1
- package/lib/client.js +1082 -493
- package/lib/index.d.ts +1 -0
- package/lib/index.js +15 -1
- package/lib/login-path.d.ts +72 -0
- package/lib/login-path.js +143 -0
- package/lib/model-options.js +22 -2
- package/lib/session/read-step.js +13 -7
- package/lib/session/start-hint.d.ts +13 -0
- package/lib/session/start-hint.js +33 -0
- package/lib/session/turn-queue.d.ts +4 -5
- package/lib/session/turn-queue.js +2 -2
- package/lib/session/turn-usage.d.ts +30 -0
- package/lib/session/turn-usage.js +73 -0
- package/lib/stdio-transport.js +2 -2
- package/lib/transport.d.ts +8 -2
- package/lib/windows-command.d.ts +43 -0
- package/lib/windows-command.js +188 -0
- package/package.json +1 -1
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
|
|
29
|
-
var
|
|
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
|
|
132
|
-
items
|
|
133
|
-
currentId:
|
|
134
|
-
currentLabel:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
208
|
+
enabled: isBuiltInChoice(choice.id) || !prefs.hidden.includes(choice.id)
|
|
193
209
|
}));
|
|
194
210
|
}
|
|
195
211
|
function rememberChoices(prefs, seen) {
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
const
|
|
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
|
|
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
|
|
414
|
+
var import_react6 = require("react");
|
|
390
415
|
var import_react_dom = require("react-dom");
|
|
391
|
-
var
|
|
416
|
+
var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
392
417
|
|
|
393
|
-
// src/client/
|
|
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/
|
|
564
|
+
// src/client/effort-menu.tsx
|
|
525
565
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
526
|
-
var
|
|
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,
|
|
532
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
547
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
554
|
-
|
|
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,
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
{
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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
|
-
|
|
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,
|
|
609
|
-
|
|
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.
|
|
810
|
+
"aria-label": models.label,
|
|
617
811
|
children: [
|
|
618
|
-
models.
|
|
619
|
-
/* @__PURE__ */ (0,
|
|
620
|
-
|
|
621
|
-
|
|
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
|
|
629
|
-
var
|
|
630
|
-
var
|
|
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,
|
|
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.
|
|
651
|
-
const
|
|
652
|
-
() => (0,
|
|
653
|
-
[models.
|
|
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
|
|
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,
|
|
661
|
-
if (open && searchable && !(0,
|
|
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,
|
|
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,
|
|
669
|
-
(0,
|
|
670
|
-
const observed = (0,
|
|
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,
|
|
680
|
-
const [settled, setSettled] = (0,
|
|
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,
|
|
878
|
+
if (!(0, import_dsh_client_ui_primitives3.isMobileDevice)()) searchRef.current?.focus();
|
|
684
879
|
};
|
|
685
|
-
const choose = (
|
|
880
|
+
const choose = (row) => {
|
|
686
881
|
setSettled(true);
|
|
687
|
-
if (
|
|
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:
|
|
888
|
+
select({ provider: row.provider, model: row.model }).then(
|
|
694
889
|
(result) => {
|
|
695
|
-
if (result.error !== void 0) fail(result.error.message ??
|
|
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,
|
|
721
|
-
const [query, setQuery] = (0,
|
|
722
|
-
const [highlight, setHighlight] = (0,
|
|
723
|
-
const closings = (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,
|
|
739
|
-
triggerRef: (0,
|
|
740
|
-
cardRef: (0,
|
|
741
|
-
searchRef: (0,
|
|
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,
|
|
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 ||
|
|
762
|
-
else if (action === "choose") choosing.choose(
|
|
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
|
-
|
|
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
|
|
991
|
+
var import_react5 = require("react");
|
|
796
992
|
function useStore(store) {
|
|
797
|
-
return (0,
|
|
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
|
|
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,
|
|
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.
|
|
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,
|
|
832
|
-
/* @__PURE__ */ (0,
|
|
833
|
-
pending === null ? /* @__PURE__ */ (0,
|
|
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.
|
|
844
|
-
return /* @__PURE__ */ (0,
|
|
845
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1054
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
858
1055
|
ModelCard,
|
|
859
1056
|
{
|
|
860
1057
|
id,
|
|
861
1058
|
models,
|
|
862
|
-
|
|
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,
|
|
880
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
902
|
-
|
|
903
|
-
|
|
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
|
|
1108
|
+
var import_react7 = require("react");
|
|
908
1109
|
var import_react_dom2 = require("react-dom");
|
|
909
|
-
var
|
|
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,
|
|
922
|
-
return (0,
|
|
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,
|
|
933
|
-
const anchor = (0,
|
|
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,
|
|
937
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
970
|
-
var
|
|
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,
|
|
998
|
-
/* @__PURE__ */ (0,
|
|
999
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1004
|
-
|
|
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,
|
|
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
|
|
1065
|
-
var
|
|
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
|
|
1313
|
+
var import_react8 = require("react");
|
|
1113
1314
|
|
|
1114
1315
|
// src/client/changes/changes-icons.tsx
|
|
1115
|
-
var
|
|
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,
|
|
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,
|
|
1141
|
-
/* @__PURE__ */ (0,
|
|
1142
|
-
/* @__PURE__ */ (0,
|
|
1143
|
-
/* @__PURE__ */ (0,
|
|
1144
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1149
|
-
/* @__PURE__ */ (0,
|
|
1150
|
-
/* @__PURE__ */ (0,
|
|
1151
|
-
/* @__PURE__ */ (0,
|
|
1152
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1157
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1172
|
-
/* @__PURE__ */ (0,
|
|
1173
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1187
|
-
/* @__PURE__ */ (0,
|
|
1188
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1193
|
-
/* @__PURE__ */ (0,
|
|
1194
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
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,
|
|
1438
|
-
/* @__PURE__ */ (0,
|
|
1439
|
-
/* @__PURE__ */ (0,
|
|
1440
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1648
|
+
const [loaded, setLoaded] = (0, import_react8.useState)({ kind: "loading" });
|
|
1448
1649
|
const { entry, side } = diff;
|
|
1449
|
-
(0,
|
|
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,
|
|
1471
|
-
if (loaded.kind === "error") return /* @__PURE__ */ (0,
|
|
1472
|
-
return /* @__PURE__ */ (0,
|
|
1473
|
-
loaded.rows.length === 0 && !loaded.truncated ? /* @__PURE__ */ (0,
|
|
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,
|
|
1677
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Line, { row }, index)
|
|
1477
1678
|
)),
|
|
1478
|
-
loaded.truncated ? /* @__PURE__ */ (0,
|
|
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,
|
|
1488
|
-
/* @__PURE__ */ (0,
|
|
1489
|
-
/* @__PURE__ */ (0,
|
|
1490
|
-
/* @__PURE__ */ (0,
|
|
1491
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
1499
|
-
var
|
|
1500
|
-
var
|
|
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,
|
|
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,
|
|
1732
|
+
label: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: CLS.remoteItem, children: [
|
|
1532
1733
|
name,
|
|
1533
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1744
|
+
const [name, setName] = (0, import_react9.useState)("");
|
|
1544
1745
|
const trimmed = name.trim();
|
|
1545
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1571
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1603
|
-
/* @__PURE__ */ (0,
|
|
1604
|
-
/* @__PURE__ */ (0,
|
|
1605
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1610
|
-
const [creating, setCreating] = (0,
|
|
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,
|
|
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,
|
|
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,
|
|
1639
|
-
|
|
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,
|
|
1662
|
-
/* @__PURE__ */ (0,
|
|
1663
|
-
/* @__PURE__ */ (0,
|
|
1664
|
-
tracked ? /* @__PURE__ */ (0,
|
|
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,
|
|
1671
|
-
/* @__PURE__ */ (0,
|
|
1672
|
-
/* @__PURE__ */ (0,
|
|
1673
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
1766
|
-
staged ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
1978
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(UndoIcon, { size: 14 })
|
|
1778
1979
|
}
|
|
1779
1980
|
),
|
|
1780
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
1810
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1817
|
-
entry.additions === void 0 || entry.additions === 0 ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
1831
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
1844
|
-
/* @__PURE__ */ (0,
|
|
1845
|
-
/* @__PURE__ */ (0,
|
|
1846
|
-
/* @__PURE__ */ (0,
|
|
1847
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
1859
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
2084
|
+
const ref = (0, import_react10.useRef)(null);
|
|
1884
2085
|
const check = groupCheck(selection, entries);
|
|
1885
|
-
(0,
|
|
2086
|
+
(0, import_react10.useEffect)(() => {
|
|
1886
2087
|
if (ref.current !== null) ref.current.indeterminate = check === "some";
|
|
1887
2088
|
}, [check]);
|
|
1888
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
1938
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
2187
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ChevronIcon, { size: 14, className: open ? void 0 : CLS.collapsed })
|
|
1987
2188
|
}
|
|
1988
2189
|
),
|
|
1989
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2003
|
-
/* @__PURE__ */ (0,
|
|
2004
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2211
|
+
const [open, setOpen] = (0, import_react10.useState)(true);
|
|
2011
2212
|
const { group, entries, selection, busy, actions } = props;
|
|
2012
|
-
return /* @__PURE__ */ (0,
|
|
2013
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
2039
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
2163
|
-
const current = (0,
|
|
2164
|
-
const generation = (0,
|
|
2165
|
-
(0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
2214
|
-
return (0,
|
|
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,
|
|
2226
|
-
|
|
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,
|
|
2234
|
-
/* @__PURE__ */ (0,
|
|
2235
|
-
/* @__PURE__ */ (0,
|
|
2236
|
-
|
|
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,
|
|
2251
|
-
return /* @__PURE__ */ (0,
|
|
2252
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2463
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SparkleIcon, {})
|
|
2263
2464
|
}
|
|
2264
2465
|
),
|
|
2265
|
-
showTip ? /* @__PURE__ */ (0,
|
|
2266
|
-
|
|
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,
|
|
2283
|
-
return /* @__PURE__ */ (0,
|
|
2284
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2301
|
-
/* @__PURE__ */ (0,
|
|
2302
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2312
|
-
/* @__PURE__ */ (0,
|
|
2313
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
2341
|
-
/* @__PURE__ */ (0,
|
|
2342
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2352
|
-
/* @__PURE__ */ (0,
|
|
2353
|
-
/* @__PURE__ */ (0,
|
|
2354
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
2590
|
+
const api = (0, import_react12.useMemo)(() => createGitApi(fetch, cwd), [fetch, cwd]);
|
|
2390
2591
|
const { state, actions } = useChanges(api);
|
|
2391
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
2396
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
2405
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
2743
|
-
var
|
|
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
|
|
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
|
|
2750
|
-
var
|
|
2751
|
-
var
|
|
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,
|
|
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,
|
|
2772
|
-
const hintId = (0,
|
|
2773
|
-
return /* @__PURE__ */ (0,
|
|
2774
|
-
/* @__PURE__ */ (0,
|
|
2775
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
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,
|
|
2805
|
-
/* @__PURE__ */ (0,
|
|
2806
|
-
/* @__PURE__ */ (0,
|
|
2807
|
-
/* @__PURE__ */ (0,
|
|
2808
|
-
|
|
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,
|
|
2821
|
-
error === void 0 ? null : /* @__PURE__ */ (0,
|
|
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
|
|
2827
|
-
var
|
|
2828
|
-
var
|
|
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,
|
|
2839
|
-
|
|
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,
|
|
2854
|
-
first ? null : /* @__PURE__ */ (0,
|
|
2855
|
-
|
|
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,
|
|
2865
|
-
/* @__PURE__ */ (0,
|
|
2866
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
2883
|
-
return /* @__PURE__ */ (0,
|
|
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,
|
|
2892
|
-
/* @__PURE__ */ (0,
|
|
2893
|
-
/* @__PURE__ */ (0,
|
|
2894
|
-
first ? /* @__PURE__ */ (0,
|
|
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,
|
|
3097
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: LS.rowCommand, title: script.command, children: script.command })
|
|
2897
3098
|
] }),
|
|
2898
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
2914
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
2942
|
-
|
|
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,
|
|
2950
|
-
/* @__PURE__ */ (0,
|
|
2951
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
2960
|
-
|
|
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,
|
|
2969
|
-
/* @__PURE__ */ (0,
|
|
2970
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
3002
|
-
return /* @__PURE__ */ (0,
|
|
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
|
|
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,
|
|
3019
|
-
const cwd = (0,
|
|
3020
|
-
const subscribeBook = (0,
|
|
3021
|
-
const scripts = (0,
|
|
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,
|
|
3028
|
-
/* @__PURE__ */ (0,
|
|
3029
|
-
command === label ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
3037
|
-
icon: /* @__PURE__ */ (0,
|
|
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,
|
|
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,
|
|
3045
|
-
const [toast, setToast] = (0,
|
|
3046
|
-
const [saveError, setSaveError] = (0,
|
|
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,
|
|
3070
|
-
|
|
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,
|
|
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,
|
|
3083
|
-
return /* @__PURE__ */ (0,
|
|
3084
|
-
|
|
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,
|
|
3099
|
-
|
|
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,
|
|
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,
|
|
3318
|
+
const [anchor, setAnchor] = (0, import_react15.useState)(null);
|
|
3118
3319
|
const primary = scripts[0];
|
|
3119
|
-
return /* @__PURE__ */ (0,
|
|
3120
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
3131
|
-
page === void 0 ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
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
|
|
3406
|
-
var
|
|
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,
|
|
3435
|
-
/* @__PURE__ */ (0,
|
|
3436
|
-
|
|
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,
|
|
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,
|
|
3448
|
-
|
|
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,
|
|
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
|
|
3468
|
-
return /* @__PURE__ */ (0,
|
|
3469
|
-
/* @__PURE__ */ (0,
|
|
3470
|
-
/* @__PURE__ */ (0,
|
|
3471
|
-
/* @__PURE__ */ (0,
|
|
3472
|
-
entry.enabled ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
3475
|
-
locked ? /* @__PURE__ */ (0,
|
|
3476
|
-
|
|
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,
|
|
3491
|
-
/* @__PURE__ */ (0,
|
|
3492
|
-
entries.length === 0 ? null : /* @__PURE__ */ (0,
|
|
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,
|
|
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
|
|
3508
|
-
var
|
|
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,
|
|
3517
|
-
/* @__PURE__ */ (0,
|
|
3518
|
-
/* @__PURE__ */ (0,
|
|
3519
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
3522
|
-
|
|
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,
|
|
3536
|
-
/* @__PURE__ */ (0,
|
|
3537
|
-
/* @__PURE__ */ (0,
|
|
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
|
|
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,229 @@ 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,
|
|
3562
|
-
/* @__PURE__ */ (0,
|
|
3563
|
-
/* @__PURE__ */ (0,
|
|
3564
|
-
/* @__PURE__ */ (0,
|
|
3565
|
-
/* @__PURE__ */ (0,
|
|
3566
|
-
/* @__PURE__ */ (0,
|
|
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,
|
|
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.3",
|
|
3781
|
+
date: "2026-11-09",
|
|
3782
|
+
sections: [
|
|
3783
|
+
{
|
|
3784
|
+
heading: "\u{1F41B} \u95EE\u9898\u4FEE\u590D",
|
|
3785
|
+
items: [
|
|
3786
|
+
{
|
|
3787
|
+
title: "Windows \u4E0A npx \u7CFB CLI \u8D77\u4E0D\u6765",
|
|
3788
|
+
text: "Node.js \u5B89\u88C5\u5305\u81EA\u5E26\u7684 `npx.cmd` \u628A\u8DEF\u5F84\u5B58\u5728\u53D8\u91CF\u91CC\uFF0C\u63D2\u4EF6\u4E4B\u524D\u89E3\u6790\u4E0D\u51FA\u6765\uFF0CClaude Code\u3001Codex\u3001Kimi\u3001PI \u90FD\u62A5\u300C\u65E0\u6CD5\u5728\u4E0D\u7ECF\u8FC7\u547D\u4EE4\u884C\u7684\u60C5\u51B5\u4E0B\u542F\u52A8 npx.cmd\u300D\u3002\u73B0\u5728\u80FD\u8BA4\u51FA\u8FD9\u79CD\u5199\u6CD5\uFF0C\u7528\u65C1\u8FB9\u7684 `node.exe`\uFF08\u6216 `PATH` \u91CC\u7684 node\uFF09\u76F4\u63A5\u8FD0\u884C `npx-cli.js`\u3002"
|
|
3789
|
+
},
|
|
3790
|
+
{
|
|
3791
|
+
title: "\u5347\u7EA7\u63D0\u793A",
|
|
3792
|
+
text: "\u4E4B\u524D\u4E3A\u4E86\u7ED5\u8FC7\u8FD9\u4E2A\u95EE\u9898\u5728 `cordis.patch.yml` \u91CC\u6539\u6210 `cmd /c npx ...` \u7684\uFF0C\u5347\u7EA7\u540E\u53EF\u4EE5\u5220\u6389\u90A3\u6BB5\u914D\u7F6E\u3001\u6062\u590D\u9ED8\u8BA4\uFF0C\u5426\u5219\u6536\u4E0D\u5230\u4EE5\u540E\u7684\u9002\u914D\u5668\u7248\u672C\u66F4\u65B0\u3002"
|
|
3793
|
+
}
|
|
3794
|
+
]
|
|
3795
|
+
}
|
|
3796
|
+
]
|
|
3797
|
+
},
|
|
3798
|
+
{
|
|
3799
|
+
version: "1.0.2",
|
|
3800
|
+
date: "2026-11-08",
|
|
3801
|
+
sections: [
|
|
3802
|
+
{
|
|
3803
|
+
heading: "\u2728 \u65B0\u529F\u80FD",
|
|
3804
|
+
items: [
|
|
3805
|
+
{
|
|
3806
|
+
title: "\u8BBE\u7F6E\u9875\u7248\u672C\u8BB0\u5F55",
|
|
3807
|
+
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"
|
|
3808
|
+
},
|
|
3809
|
+
{
|
|
3810
|
+
title: "\u6253\u5305 Kimi CLI",
|
|
3811
|
+
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"
|
|
3812
|
+
},
|
|
3813
|
+
{
|
|
3814
|
+
title: "\u6A21\u578B\u5EA7\u4F4D\u63A5\u7BA1\u6BCF\u4E2A\u4F1A\u8BDD",
|
|
3815
|
+
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"
|
|
3816
|
+
},
|
|
3817
|
+
{
|
|
3818
|
+
title: "CLI \u4F1A\u8BDD\u4E0A\u62A5 token \u7528\u91CF",
|
|
3819
|
+
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"
|
|
3820
|
+
},
|
|
3821
|
+
{
|
|
3822
|
+
title: "\u8BBE\u7F6E\u9875\u63D0\u793A\u65B0\u7248\u672C",
|
|
3823
|
+
text: "\u6709\u66F4\u65B0\u7684 Release \u65F6\uFF0C\u7248\u672C\u80F6\u56CA\u53D8\u6210\u6307\u5411\u8BE5 Release \u8BF4\u660E\u7684\u94FE\u63A5\u3002"
|
|
3824
|
+
},
|
|
3825
|
+
{
|
|
3826
|
+
title: "\u5207\u6362\u5668\u91CC harness \u53EA\u5217\u4E00\u6761",
|
|
3827
|
+
text: "\u6240\u6709\u975E CLI \u63D0\u4F9B\u65B9\u5408\u5E76\u6210\u4E00\u6761\u300CDeepSeek\u300D\uFF0C\u4E0D\u518D\u9010\u4E2A\u5217\u51FA\u3002"
|
|
3828
|
+
}
|
|
3829
|
+
]
|
|
3830
|
+
},
|
|
3831
|
+
{
|
|
3832
|
+
heading: "\u{1F41B} \u95EE\u9898\u4FEE\u590D",
|
|
3833
|
+
items: [
|
|
3834
|
+
{
|
|
3835
|
+
title: "Windows \u4E0A `.cmd` \u542F\u52A8\u5668\u8D77\u4E0D\u6765",
|
|
3836
|
+
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"
|
|
3837
|
+
},
|
|
3838
|
+
{
|
|
3839
|
+
title: "macOS / Linux \u4ECE Dock \u542F\u52A8\u65F6\u627E\u4E0D\u5230 node",
|
|
3840
|
+
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"
|
|
3841
|
+
},
|
|
3842
|
+
{
|
|
3843
|
+
title: "npx \u7F13\u5B58\u4E0D\u5B8C\u6574\u65F6\u7ED9\u51FA\u6B63\u786E\u63D0\u793A",
|
|
3844
|
+
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"
|
|
3845
|
+
}
|
|
3846
|
+
]
|
|
3847
|
+
},
|
|
3848
|
+
{
|
|
3849
|
+
heading: "\u{1F527} \u91CD\u6784",
|
|
3850
|
+
items: [
|
|
3851
|
+
{ text: "\u6A21\u578B\u83DC\u5355\u62C6\u51FA `menu-models.ts` \u548C `effort-menu.tsx`\uFF0C\u6E32\u67D3\u884C\u4E3A\u4E0D\u53D8\u3002" },
|
|
3852
|
+
{ 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" }
|
|
3853
|
+
]
|
|
3854
|
+
},
|
|
3855
|
+
{
|
|
3856
|
+
heading: "\u{1F4C4} \u6587\u6863",
|
|
3857
|
+
items: [
|
|
3858
|
+
{ text: "\u53D1\u7248\u7EA6\u5B9A\u5199\u8FDB AGENTS.md \u4E0E README\u3002" },
|
|
3859
|
+
{ text: "README \u8865\u5145 Kimi CLI \u7684 Node.js 22.19 \u8981\u6C42\u4E0E\u767B\u5F55\u6B65\u9AA4\u3002" }
|
|
3860
|
+
]
|
|
3861
|
+
}
|
|
3862
|
+
]
|
|
3863
|
+
},
|
|
3864
|
+
{
|
|
3865
|
+
version: "1.0.1",
|
|
3866
|
+
date: "2026-11-08",
|
|
3867
|
+
sections: [
|
|
3868
|
+
{
|
|
3869
|
+
heading: "\u{1F41B} \u95EE\u9898\u4FEE\u590D",
|
|
3870
|
+
items: [
|
|
3871
|
+
{
|
|
3872
|
+
title: "\u8BBE\u7F6E\u9875 GitHub \u94FE\u63A5\u6307\u5411\u9519\u8BEF\u7684\u4ED3\u5E93",
|
|
3873
|
+
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"
|
|
3874
|
+
}
|
|
3875
|
+
]
|
|
3876
|
+
},
|
|
3877
|
+
{
|
|
3878
|
+
heading: "\u{1F527} \u7EF4\u62A4",
|
|
3879
|
+
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" }]
|
|
3880
|
+
},
|
|
3881
|
+
{
|
|
3882
|
+
heading: "\u{1F4C4} \u6587\u6863",
|
|
3883
|
+
items: [{ text: "README \u8C03\u6574\u529F\u80FD\u8868\u4F4D\u7F6E\u5E76\u66F4\u65B0\u5305\u63CF\u8FF0\u3002" }]
|
|
3884
|
+
}
|
|
3885
|
+
]
|
|
3886
|
+
},
|
|
3887
|
+
{
|
|
3888
|
+
version: "1.0.0",
|
|
3889
|
+
date: "2026-11-08",
|
|
3890
|
+
sections: [
|
|
3891
|
+
{
|
|
3892
|
+
heading: "\u2728 \u65B0\u529F\u80FD",
|
|
3893
|
+
items: [
|
|
3894
|
+
{
|
|
3895
|
+
title: "\u63A5\u5165 Agent CLI",
|
|
3896
|
+
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"
|
|
3897
|
+
},
|
|
3898
|
+
{
|
|
3899
|
+
title: "CLI \u4E0E\u6A21\u578B\u83DC\u5355",
|
|
3900
|
+
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"
|
|
3901
|
+
},
|
|
3902
|
+
{
|
|
3903
|
+
title: "\u53D8\u66F4\u9762\u677F",
|
|
3904
|
+
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"
|
|
3905
|
+
},
|
|
3906
|
+
{
|
|
3907
|
+
title: "\u542F\u52A8\u811A\u672C\u4E0E\u7EC8\u7AEF",
|
|
3908
|
+
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"
|
|
3909
|
+
},
|
|
3910
|
+
{
|
|
3911
|
+
title: "\u6587\u4EF6\u548C\u4F1A\u8BDD\u72B6\u6001",
|
|
3912
|
+
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"
|
|
3913
|
+
},
|
|
3914
|
+
{
|
|
3915
|
+
title: "CC GUI \u8BBE\u7F6E",
|
|
3916
|
+
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"
|
|
3917
|
+
}
|
|
3918
|
+
]
|
|
3919
|
+
}
|
|
3920
|
+
]
|
|
3921
|
+
}
|
|
3922
|
+
];
|
|
3923
|
+
|
|
3573
3924
|
// src/client/settings-about.tsx
|
|
3574
|
-
var
|
|
3925
|
+
var import_react16 = require("react");
|
|
3575
3926
|
|
|
3576
3927
|
// src/client/assets/wechat-group.png
|
|
3577
3928
|
var wechat_group_default = "data:image/png;base64,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";
|
|
3578
3929
|
|
|
3930
|
+
// src/client/update-check.ts
|
|
3931
|
+
var LATEST_RELEASE_API = "https://api.github.com/repos/zhukunpenglinyutong/dsh-ccgui/releases/latest";
|
|
3932
|
+
var RELEASE_PAGE_PREFIX = "https://github.com/zhukunpenglinyutong/dsh-ccgui/releases/";
|
|
3933
|
+
var SEMVER = /^v?(\d+)\.(\d+)\.(\d+)$/;
|
|
3934
|
+
var CHECK_TIMEOUT_MS = 8e3;
|
|
3935
|
+
function parseVersion(value) {
|
|
3936
|
+
const match = SEMVER.exec(value.trim());
|
|
3937
|
+
return match ? match.slice(1).map(Number) : void 0;
|
|
3938
|
+
}
|
|
3939
|
+
function isNewerVersion(candidate, current) {
|
|
3940
|
+
const next = parseVersion(candidate);
|
|
3941
|
+
const now = parseVersion(current);
|
|
3942
|
+
if (!next || !now) return false;
|
|
3943
|
+
const index = next.findIndex((part, i) => part !== now[i]);
|
|
3944
|
+
return index !== -1 && (next[index] ?? 0) > (now[index] ?? 0);
|
|
3945
|
+
}
|
|
3946
|
+
function readRelease(body) {
|
|
3947
|
+
if (typeof body !== "object" || body === null) return void 0;
|
|
3948
|
+
const tag = "tag_name" in body ? body.tag_name : void 0;
|
|
3949
|
+
const url = "html_url" in body ? body.html_url : void 0;
|
|
3950
|
+
if (typeof tag !== "string") return void 0;
|
|
3951
|
+
const page = typeof url === "string" && url.startsWith(RELEASE_PAGE_PREFIX) ? url : `${RELEASE_PAGE_PREFIX}tag/${tag}`;
|
|
3952
|
+
return { tag, url: page };
|
|
3953
|
+
}
|
|
3954
|
+
async function checkForUpdate(fetchFn, current) {
|
|
3955
|
+
if (!parseVersion(current)) return void 0;
|
|
3956
|
+
try {
|
|
3957
|
+
const response = await fetchFn(LATEST_RELEASE_API, {
|
|
3958
|
+
headers: { Accept: "application/vnd.github+json" },
|
|
3959
|
+
signal: AbortSignal.timeout(CHECK_TIMEOUT_MS)
|
|
3960
|
+
});
|
|
3961
|
+
if (!response.ok) return void 0;
|
|
3962
|
+
const release = readRelease(await response.json());
|
|
3963
|
+
if (!release || !isNewerVersion(release.tag, current)) return void 0;
|
|
3964
|
+
return { version: release.tag.replace(/^v/, ""), url: release.url };
|
|
3965
|
+
} catch (_error) {
|
|
3966
|
+
return void 0;
|
|
3967
|
+
}
|
|
3968
|
+
}
|
|
3969
|
+
function createUpdateChecker(fetchFn, current) {
|
|
3970
|
+
let pending;
|
|
3971
|
+
return () => {
|
|
3972
|
+
pending ??= checkForUpdate(fetchFn, current);
|
|
3973
|
+
return pending;
|
|
3974
|
+
};
|
|
3975
|
+
}
|
|
3976
|
+
|
|
3579
3977
|
// src/client/settings-about.tsx
|
|
3580
|
-
var
|
|
3581
|
-
var PLUGIN_VERSION = true ? "1.0.
|
|
3978
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
3979
|
+
var PLUGIN_VERSION = true ? "1.0.3" : "\u5F00\u53D1\u7248";
|
|
3582
3980
|
var REPO_URL = "https://github.com/zhukunpenglinyutong/dsh-ccgui";
|
|
3583
3981
|
var VERSION_LABEL = "\u7248\u672C";
|
|
3584
3982
|
var VERSION_VALUE = /^\d/.test(PLUGIN_VERSION) ? `v${PLUGIN_VERSION}` : PLUGIN_VERSION;
|
|
3983
|
+
var UPDATE_ARROW = "\u2191";
|
|
3984
|
+
var updateLabel = (version) => `\u6709\u65B0\u7248\u672C v${version}\uFF0C\u67E5\u770B\u66F4\u65B0\u8BF4\u660E`;
|
|
3585
3985
|
var WECHAT_LABEL = "\u5FAE\u4FE1\u4EA4\u6D41\u7FA4";
|
|
3586
3986
|
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
3987
|
var WECHAT_TIP = "\u4F7F\u7528\u5FAE\u4FE1\u626B\u4E00\u626B";
|
|
@@ -3594,13 +3994,17 @@ var SETTINGS_ABOUT_STYLES = `
|
|
|
3594
3994
|
.${ABOUT_CLASS}-value { color: var(--dsw-alias-label-primary); font-weight: 500; }
|
|
3595
3995
|
button.${ABOUT_CLASS}-pill, a.${ABOUT_CLASS}-pill { cursor: pointer; }
|
|
3596
3996
|
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)); }
|
|
3997
|
+
.${ABOUT_CLASS}-update { gap: 0; border-color: var(--dsw-alias-state-warning-primary, #e5a03a); }
|
|
3998
|
+
.${ABOUT_CLASS}-update .${ABOUT_CLASS}-value { margin-left: 6px; }
|
|
3999
|
+
.${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; }
|
|
4000
|
+
a.${ABOUT_CLASS}-update:hover { border-color: var(--dsw-alias-state-warning-primary, #e5a03a); }
|
|
3597
4001
|
.${ABOUT_CLASS}-anchor { position: relative; }
|
|
3598
4002
|
.${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
4003
|
.${ABOUT_CLASS}-qr p { margin: 0; }
|
|
3600
4004
|
.${ABOUT_CLASS}-qr img { display: block; margin: 12px auto 8px; padding: 8px; border-radius: 8px; background: #fff; }
|
|
3601
4005
|
`;
|
|
3602
4006
|
function useEscape(active, close) {
|
|
3603
|
-
(0,
|
|
4007
|
+
(0, import_react16.useEffect)(() => {
|
|
3604
4008
|
if (!active) return void 0;
|
|
3605
4009
|
const onKey = (event) => {
|
|
3606
4010
|
if (event.key === "Escape") close();
|
|
@@ -3612,12 +4016,12 @@ function useEscape(active, close) {
|
|
|
3612
4016
|
}, [active, close]);
|
|
3613
4017
|
}
|
|
3614
4018
|
function WechatGroup() {
|
|
3615
|
-
const [open, setOpen] = (0,
|
|
4019
|
+
const [open, setOpen] = (0, import_react16.useState)(false);
|
|
3616
4020
|
useEscape(open, () => {
|
|
3617
4021
|
setOpen(false);
|
|
3618
4022
|
});
|
|
3619
|
-
return /* @__PURE__ */ (0,
|
|
3620
|
-
/* @__PURE__ */ (0,
|
|
4023
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: `${ABOUT_CLASS}-anchor`, children: [
|
|
4024
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
3621
4025
|
"button",
|
|
3622
4026
|
{
|
|
3623
4027
|
type: "button",
|
|
@@ -3629,27 +4033,210 @@ function WechatGroup() {
|
|
|
3629
4033
|
children: WECHAT_LABEL
|
|
3630
4034
|
}
|
|
3631
4035
|
),
|
|
3632
|
-
open ? /* @__PURE__ */ (0,
|
|
3633
|
-
/* @__PURE__ */ (0,
|
|
3634
|
-
/* @__PURE__ */ (0,
|
|
3635
|
-
/* @__PURE__ */ (0,
|
|
4036
|
+
open ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: `${ABOUT_CLASS}-qr`, children: [
|
|
4037
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { children: WECHAT_DESC }),
|
|
4038
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("img", { src: wechat_group_default, alt: WECHAT_QR_ALT, width: QR_SIZE, height: QR_SIZE }),
|
|
4039
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { children: WECHAT_TIP })
|
|
3636
4040
|
] }) : null
|
|
3637
4041
|
] });
|
|
3638
4042
|
}
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
4043
|
+
var defaultCheckUpdate = createUpdateChecker((input, init) => window.fetch(input, init), PLUGIN_VERSION);
|
|
4044
|
+
function useLatestRelease(checkUpdate) {
|
|
4045
|
+
const [latest, setLatest] = (0, import_react16.useState)(void 0);
|
|
4046
|
+
(0, import_react16.useEffect)(() => {
|
|
4047
|
+
let live = true;
|
|
4048
|
+
void checkUpdate().then((release) => {
|
|
4049
|
+
if (live) setLatest(release);
|
|
4050
|
+
});
|
|
4051
|
+
return () => {
|
|
4052
|
+
live = false;
|
|
4053
|
+
};
|
|
4054
|
+
}, [checkUpdate]);
|
|
4055
|
+
return latest;
|
|
4056
|
+
}
|
|
4057
|
+
function VersionPill({ latest }) {
|
|
4058
|
+
const current = /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
|
|
4059
|
+
VERSION_LABEL,
|
|
4060
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: `${ABOUT_CLASS}-value`, children: VERSION_VALUE })
|
|
4061
|
+
] });
|
|
4062
|
+
if (!latest) return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: `${ABOUT_CLASS}-pill`, children: current });
|
|
4063
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
4064
|
+
"a",
|
|
4065
|
+
{
|
|
4066
|
+
className: `${ABOUT_CLASS}-pill ${ABOUT_CLASS}-update`,
|
|
4067
|
+
href: latest.url,
|
|
4068
|
+
target: "_blank",
|
|
4069
|
+
rel: "noreferrer",
|
|
4070
|
+
"aria-label": updateLabel(latest.version),
|
|
4071
|
+
children: [
|
|
4072
|
+
current,
|
|
4073
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: `${ABOUT_CLASS}-next`, children: [
|
|
4074
|
+
UPDATE_ARROW,
|
|
4075
|
+
" v",
|
|
4076
|
+
latest.version
|
|
4077
|
+
] })
|
|
4078
|
+
]
|
|
4079
|
+
}
|
|
4080
|
+
);
|
|
4081
|
+
}
|
|
4082
|
+
function SettingsAbout({
|
|
4083
|
+
checkUpdate = defaultCheckUpdate
|
|
4084
|
+
}) {
|
|
4085
|
+
const latest = useLatestRelease(checkUpdate);
|
|
4086
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: ABOUT_CLASS, children: [
|
|
4087
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(VersionPill, { latest }),
|
|
4088
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(WechatGroup, {}),
|
|
4089
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { className: `${ABOUT_CLASS}-pill`, href: REPO_URL, target: "_blank", rel: "noreferrer", children: "GitHub" })
|
|
4090
|
+
] });
|
|
4091
|
+
}
|
|
4092
|
+
|
|
4093
|
+
// src/client/release-notes-section.tsx
|
|
4094
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
4095
|
+
var INTRO2 = "\u6BCF\u4E2A\u7248\u672C\u4E00\u9875\uFF0C\u7FFB\u9875\u67E5\u770B\u5386\u53F2\u66F4\u65B0\u3002";
|
|
4096
|
+
var CURRENT_LABEL = "\u5F53\u524D\u7248\u672C";
|
|
4097
|
+
var EMPTY_TEXT2 = "\u8FD8\u6CA1\u6709\u7248\u672C\u8BB0\u5F55\u3002";
|
|
4098
|
+
var PREV_LABEL = "\u4E0A\u4E00\u9875";
|
|
4099
|
+
var NEXT_LABEL = "\u4E0B\u4E00\u9875";
|
|
4100
|
+
var DOTS_LABEL = "\u9009\u62E9\u7248\u672C";
|
|
4101
|
+
var NOTES_CLASS = "dsh-ccgui-notes";
|
|
4102
|
+
var pageName = (version) => `v${version} \u7248\u672C\u8BB0\u5F55`;
|
|
4103
|
+
var pagePosition = (index, count) => `\u7B2C ${index + 1} / ${count} \u9875`;
|
|
4104
|
+
var RELEASE_NOTES_STYLES = `
|
|
4105
|
+
.${NOTES_CLASS} { display: flex; flex-direction: column; gap: 12px; }
|
|
4106
|
+
.${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)); }
|
|
4107
|
+
.${NOTES_CLASS}-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
|
|
4108
|
+
.${NOTES_CLASS}-version { color: var(--dsw-alias-label-primary); font-size: 15px; line-height: 22px; font-weight: 600; }
|
|
4109
|
+
.${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; }
|
|
4110
|
+
.${NOTES_CLASS}-date { color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary)); font-size: 12px; line-height: 18px; }
|
|
4111
|
+
.${NOTES_CLASS}-pager { display: flex; align-items: center; gap: 2px; margin-left: auto; }
|
|
4112
|
+
.${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; }
|
|
4113
|
+
.${NOTES_CLASS}-step:hover:not(:disabled) { color: var(--dsw-alias-label-primary); border-color: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2)); }
|
|
4114
|
+
.${NOTES_CLASS}-step:disabled { opacity: 0.35; cursor: default; }
|
|
4115
|
+
.${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; }
|
|
4116
|
+
.${NOTES_CLASS}-body { display: flex; flex-direction: column; gap: 14px; }
|
|
4117
|
+
.${NOTES_CLASS}-section { display: flex; flex-direction: column; gap: 6px; }
|
|
4118
|
+
.${NOTES_CLASS}-heading { color: var(--dsw-alias-label-primary); font-size: 13px; line-height: 20px; font-weight: 500; }
|
|
4119
|
+
.${NOTES_CLASS}-list { display: flex; flex-direction: column; gap: 6px; margin: 0; padding: 0; list-style: none; }
|
|
4120
|
+
.${NOTES_CLASS}-item { position: relative; padding-left: 12px; color: var(--dsw-alias-label-secondary); font-size: 13px; line-height: 20px; }
|
|
4121
|
+
.${NOTES_CLASS}-item::before { content: '\xB7'; position: absolute; left: 0; color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary)); }
|
|
4122
|
+
.${NOTES_CLASS}-item strong { color: var(--dsw-alias-label-primary); font-weight: 500; }
|
|
4123
|
+
.${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; }
|
|
4124
|
+
.${NOTES_CLASS}-dots { display: flex; justify-content: center; gap: 2px; }
|
|
4125
|
+
.${NOTES_CLASS}-dot { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; padding: 0; border: none; background: none; cursor: pointer; }
|
|
4126
|
+
.${NOTES_CLASS}-dot::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-border-l3, #8a8a8a); }
|
|
4127
|
+
.${NOTES_CLASS}-dot[aria-current="page"]::before { background: var(--dsw-alias-label-primary); }
|
|
4128
|
+
.${NOTES_CLASS}-step:focus-visible, .${NOTES_CLASS}-dot:focus-visible { outline: 2px solid var(--dsw-alias-border-focus, currentColor); outline-offset: 2px; }
|
|
4129
|
+
.${NOTES_CLASS}-empty { margin: 0; color: var(--dsw-alias-label-secondary); font-size: 13px; line-height: 20px; }
|
|
4130
|
+
`;
|
|
4131
|
+
function InlineText({ text }) {
|
|
4132
|
+
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)) });
|
|
4133
|
+
}
|
|
4134
|
+
function ItemRow({ item }) {
|
|
4135
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("li", { className: `${NOTES_CLASS}-item`, children: [
|
|
4136
|
+
item.title === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("strong", { children: [
|
|
4137
|
+
item.title,
|
|
4138
|
+
"\uFF1A"
|
|
3644
4139
|
] }),
|
|
3645
|
-
/* @__PURE__ */ (0,
|
|
3646
|
-
|
|
4140
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(InlineText, { text: item.text })
|
|
4141
|
+
] });
|
|
4142
|
+
}
|
|
4143
|
+
function SectionBlock({ section }) {
|
|
4144
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-section`, children: [
|
|
4145
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: `${NOTES_CLASS}-heading`, children: section.heading }),
|
|
4146
|
+
/* @__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)) })
|
|
4147
|
+
] });
|
|
4148
|
+
}
|
|
4149
|
+
function NotesBody({ note }) {
|
|
4150
|
+
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)) });
|
|
4151
|
+
}
|
|
4152
|
+
function Pager({
|
|
4153
|
+
index,
|
|
4154
|
+
count,
|
|
4155
|
+
onSelect
|
|
4156
|
+
}) {
|
|
4157
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-pager`, children: [
|
|
4158
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
4159
|
+
"button",
|
|
4160
|
+
{
|
|
4161
|
+
type: "button",
|
|
4162
|
+
className: `${NOTES_CLASS}-step`,
|
|
4163
|
+
"aria-label": PREV_LABEL,
|
|
4164
|
+
disabled: index === 0,
|
|
4165
|
+
onClick: () => {
|
|
4166
|
+
onSelect(index - 1);
|
|
4167
|
+
},
|
|
4168
|
+
children: "\u2039"
|
|
4169
|
+
}
|
|
4170
|
+
),
|
|
4171
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: `${NOTES_CLASS}-count`, "aria-live": "polite", children: pagePosition(index, count) }),
|
|
4172
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
4173
|
+
"button",
|
|
4174
|
+
{
|
|
4175
|
+
type: "button",
|
|
4176
|
+
className: `${NOTES_CLASS}-step`,
|
|
4177
|
+
"aria-label": NEXT_LABEL,
|
|
4178
|
+
disabled: index === count - 1,
|
|
4179
|
+
onClick: () => {
|
|
4180
|
+
onSelect(index + 1);
|
|
4181
|
+
},
|
|
4182
|
+
children: "\u203A"
|
|
4183
|
+
}
|
|
4184
|
+
)
|
|
4185
|
+
] });
|
|
4186
|
+
}
|
|
4187
|
+
function Dots({
|
|
4188
|
+
index,
|
|
4189
|
+
notes,
|
|
4190
|
+
onSelect
|
|
4191
|
+
}) {
|
|
4192
|
+
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)(
|
|
4193
|
+
"button",
|
|
4194
|
+
{
|
|
4195
|
+
type: "button",
|
|
4196
|
+
className: `${NOTES_CLASS}-dot`,
|
|
4197
|
+
"aria-label": `v${note.version}`,
|
|
4198
|
+
"aria-current": position === index ? "page" : void 0,
|
|
4199
|
+
onClick: () => {
|
|
4200
|
+
onSelect(position);
|
|
4201
|
+
}
|
|
4202
|
+
},
|
|
4203
|
+
note.version
|
|
4204
|
+
)) });
|
|
4205
|
+
}
|
|
4206
|
+
function ReleaseNotesSection({
|
|
4207
|
+
notes = RELEASE_NOTES,
|
|
4208
|
+
currentVersion = PLUGIN_VERSION
|
|
4209
|
+
}) {
|
|
4210
|
+
const [index, setIndex] = (0, import_react17.useState)(0);
|
|
4211
|
+
const select = (next) => {
|
|
4212
|
+
setIndex(Math.min(Math.max(next, 0), notes.length - 1));
|
|
4213
|
+
};
|
|
4214
|
+
const position = Math.min(Math.max(index, 0), notes.length - 1);
|
|
4215
|
+
const note = notes[position];
|
|
4216
|
+
if (note === void 0) return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: `${NOTES_CLASS}-empty`, children: EMPTY_TEXT2 });
|
|
4217
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("section", { children: [
|
|
4218
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "dsh-ccgui-settings-intro", children: INTRO2 }),
|
|
4219
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: NOTES_CLASS, children: [
|
|
4220
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-page`, role: "group", "aria-label": pageName(note.version), children: [
|
|
4221
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: `${NOTES_CLASS}-head`, children: [
|
|
4222
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: `${NOTES_CLASS}-version`, children: [
|
|
4223
|
+
"v",
|
|
4224
|
+
note.version
|
|
4225
|
+
] }),
|
|
4226
|
+
note.version === currentVersion ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: `${NOTES_CLASS}-current`, children: CURRENT_LABEL }) : null,
|
|
4227
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: `${NOTES_CLASS}-date`, children: note.date }),
|
|
4228
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Pager, { index: position, count: notes.length, onSelect: select })
|
|
4229
|
+
] }),
|
|
4230
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(NotesBody, { note })
|
|
4231
|
+
] }),
|
|
4232
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Dots, { index: position, notes, onSelect: select })
|
|
4233
|
+
] })
|
|
3647
4234
|
] });
|
|
3648
4235
|
}
|
|
3649
4236
|
|
|
3650
4237
|
// src/client/settings-tabs.tsx
|
|
3651
|
-
var
|
|
3652
|
-
var
|
|
4238
|
+
var import_react18 = require("react");
|
|
4239
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
3653
4240
|
var TABS_CLASS = "dsh-ccgui-tabs";
|
|
3654
4241
|
var SETTINGS_TABS_STYLES = `
|
|
3655
4242
|
.${TABS_CLASS} { display: flex; gap: 24px; margin: 4px 0 8px; border-bottom: 0.5px solid var(--dsw-alias-border-l2); }
|
|
@@ -3679,7 +4266,7 @@ function TabButton({
|
|
|
3679
4266
|
active,
|
|
3680
4267
|
onSelect
|
|
3681
4268
|
}) {
|
|
3682
|
-
return /* @__PURE__ */ (0,
|
|
4269
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
3683
4270
|
"button",
|
|
3684
4271
|
{
|
|
3685
4272
|
type: "button",
|
|
@@ -3699,9 +4286,9 @@ function SettingsTabs({
|
|
|
3699
4286
|
tabs,
|
|
3700
4287
|
label
|
|
3701
4288
|
}) {
|
|
3702
|
-
const [selected, setSelected] = (0,
|
|
3703
|
-
const strip = (0,
|
|
3704
|
-
const prefix = (0,
|
|
4289
|
+
const [selected, setSelected] = (0, import_react18.useState)(tabs[0]?.id);
|
|
4290
|
+
const strip = (0, import_react18.useRef)(null);
|
|
4291
|
+
const prefix = (0, import_react18.useId)();
|
|
3705
4292
|
const current = tabs.find((tab) => tab.id === selected) ?? tabs[0];
|
|
3706
4293
|
const onKeyDown = (event) => {
|
|
3707
4294
|
const index = tabs.findIndex((tab) => tab.id === current?.id);
|
|
@@ -3712,8 +4299,8 @@ function SettingsTabs({
|
|
|
3712
4299
|
setSelected(target.id);
|
|
3713
4300
|
strip.current?.querySelector(`[data-tab="${target.id}"]`)?.focus();
|
|
3714
4301
|
};
|
|
3715
|
-
return /* @__PURE__ */ (0,
|
|
3716
|
-
/* @__PURE__ */ (0,
|
|
4302
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [
|
|
4303
|
+
/* @__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
4304
|
TabButton,
|
|
3718
4305
|
{
|
|
3719
4306
|
tab,
|
|
@@ -3725,16 +4312,17 @@ function SettingsTabs({
|
|
|
3725
4312
|
},
|
|
3726
4313
|
tab.id
|
|
3727
4314
|
)) }),
|
|
3728
|
-
current === void 0 ? null : /* @__PURE__ */ (0,
|
|
4315
|
+
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
4316
|
] });
|
|
3730
4317
|
}
|
|
3731
4318
|
|
|
3732
4319
|
// src/client/settings-page.tsx
|
|
3733
|
-
var
|
|
4320
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
3734
4321
|
var SETTINGS_TITLE = "CC GUI \u8BBE\u7F6E";
|
|
3735
4322
|
var CLI_TAB_LABEL = "CLI \u5217\u8868";
|
|
3736
4323
|
var FEATURES_TAB_LABEL = "\u754C\u9762\u4EA4\u4E92";
|
|
3737
4324
|
var MORE_TAB_LABEL = "\u66F4\u591A\u529F\u80FD";
|
|
4325
|
+
var NOTES_TAB_LABEL = "\u7248\u672C\u8BB0\u5F55";
|
|
3738
4326
|
var PAGE_CLASS2 = "dsh-ccgui-settings";
|
|
3739
4327
|
var SETTINGS_PAGE_STYLES = `
|
|
3740
4328
|
.${PAGE_CLASS2} { display: flex; flex-direction: column; gap: 12px; box-sizing: border-box; max-width: 720px; color: var(--dsw-alias-label-primary); }
|
|
@@ -3750,26 +4338,27 @@ var SETTINGS_PAGE_STYLES = `
|
|
|
3750
4338
|
.${PAGE_CLASS2}-row + .${PAGE_CLASS2}-row { border-top: 0.5px solid var(--dsw-alias-border-l2); }
|
|
3751
4339
|
.${PAGE_CLASS2}-title { color: var(--dsw-alias-label-primary); font-size: 13px; font-weight: 500; line-height: 20px; }
|
|
3752
4340
|
.${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}`;
|
|
4341
|
+
${SETTINGS_TABS_STYLES}${CLI_PREFS_STYLES}${SETTINGS_ABOUT_STYLES}${MORE_SECTION_STYLES}${RELEASE_NOTES_STYLES}`;
|
|
3754
4342
|
function SettingsPage({
|
|
3755
4343
|
settings,
|
|
3756
4344
|
cliPrefs
|
|
3757
4345
|
}) {
|
|
3758
4346
|
const tabs = [
|
|
3759
|
-
{ id: "cli", label: CLI_TAB_LABEL, render: () => /* @__PURE__ */ (0,
|
|
3760
|
-
{ id: "features", label: FEATURES_TAB_LABEL, render: () => /* @__PURE__ */ (0,
|
|
3761
|
-
{ id: "more", label: MORE_TAB_LABEL, render: () => /* @__PURE__ */ (0,
|
|
4347
|
+
{ id: "cli", label: CLI_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(CliPrefsSection, { prefs: cliPrefs }) },
|
|
4348
|
+
{ id: "features", label: FEATURES_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(FeaturesSection, { settings }) },
|
|
4349
|
+
{ id: "more", label: MORE_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(MoreSection, {}) },
|
|
4350
|
+
{ id: "notes", label: NOTES_TAB_LABEL, render: () => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ReleaseNotesSection, {}) }
|
|
3762
4351
|
];
|
|
3763
|
-
return /* @__PURE__ */ (0,
|
|
3764
|
-
/* @__PURE__ */ (0,
|
|
3765
|
-
/* @__PURE__ */ (0,
|
|
3766
|
-
/* @__PURE__ */ (0,
|
|
4352
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: PAGE_CLASS2, children: [
|
|
4353
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: `${PAGE_CLASS2}-header`, children: [
|
|
4354
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h1", { children: SETTINGS_TITLE }),
|
|
4355
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SettingsAbout, {})
|
|
3767
4356
|
] }),
|
|
3768
|
-
/* @__PURE__ */ (0,
|
|
4357
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SettingsTabs, { tabs, label: SETTINGS_TITLE })
|
|
3769
4358
|
] });
|
|
3770
4359
|
}
|
|
3771
4360
|
function SettingsIcon({ size }) {
|
|
3772
|
-
return /* @__PURE__ */ (0,
|
|
4361
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_dsh_client_ui_primitives14.IconSlidersTwoOutlineRegular, { size });
|
|
3773
4362
|
}
|
|
3774
4363
|
|
|
3775
4364
|
// src/client/settings-register.ts
|
|
@@ -3815,7 +4404,7 @@ function gateInject(ctx, settings, id, inject2) {
|
|
|
3815
4404
|
}
|
|
3816
4405
|
|
|
3817
4406
|
// src/client/index.tsx
|
|
3818
|
-
var
|
|
4407
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
3819
4408
|
var SLOT3 = "conversation.input.left";
|
|
3820
4409
|
var MODEL_SLOT = "conversation.input.right";
|
|
3821
4410
|
var SESSION_ROW_SLOT = "sidebar.session.row.leading";
|
|
@@ -3868,7 +4457,7 @@ function installStyles() {
|
|
|
3868
4457
|
};
|
|
3869
4458
|
}
|
|
3870
4459
|
function useStarted(session) {
|
|
3871
|
-
const snapshot = (0,
|
|
4460
|
+
const snapshot = (0, import_react19.useSyncExternalStore)(
|
|
3872
4461
|
(listener) => session?.subscribe(listener) ?? (() => {
|
|
3873
4462
|
}),
|
|
3874
4463
|
() => session?.getSnapshot() ?? NOT_STARTED
|
|
@@ -3876,7 +4465,7 @@ function useStarted(session) {
|
|
|
3876
4465
|
return snapshot.blank === false;
|
|
3877
4466
|
}
|
|
3878
4467
|
function useChoose(state, select) {
|
|
3879
|
-
const [error, setError] = (0,
|
|
4468
|
+
const [error, setError] = (0, import_react19.useState)();
|
|
3880
4469
|
const choose = (id) => {
|
|
3881
4470
|
setError(void 0);
|
|
3882
4471
|
const selection = selectionForChoice(state, id);
|
|
@@ -3896,23 +4485,23 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
|
|
|
3896
4485
|
const state = useStore(directory);
|
|
3897
4486
|
const started = useStarted(session);
|
|
3898
4487
|
const prefsSnapshot = useStore(prefs);
|
|
3899
|
-
const [open, setOpen] = (0,
|
|
4488
|
+
const [open, setOpen] = (0, import_react19.useState)(false);
|
|
3900
4489
|
const { error, choose } = useChoose(state, select);
|
|
3901
|
-
(0,
|
|
4490
|
+
(0, import_react19.useEffect)(load, [load]);
|
|
3902
4491
|
const { visible, items: listed, currentId, currentLabel } = cliChoices(state);
|
|
3903
|
-
(0,
|
|
4492
|
+
(0, import_react19.useEffect)(() => {
|
|
3904
4493
|
prefs.remember(listed);
|
|
3905
4494
|
}, [prefs, listed]);
|
|
3906
4495
|
if (!visible) return null;
|
|
3907
4496
|
const items = arrangeChoices(listed, prefsSnapshot);
|
|
3908
4497
|
const hint = started ? "\u8981\u6362 CLI\uFF0C\u8BF7\u65B0\u5EFA\u4F1A\u8BDD" : error ?? "\u5207\u6362 CLI";
|
|
3909
4498
|
const label = error === void 0 ? currentLabel ?? NO_CHOICE_LABEL : SWITCH_FAILED_LABEL;
|
|
3910
|
-
return /* @__PURE__ */ (0,
|
|
3911
|
-
|
|
4499
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
4500
|
+
import_dsh_client_ui_primitives15.Menu,
|
|
3912
4501
|
{
|
|
3913
4502
|
open: open && !started,
|
|
3914
4503
|
className: WRAP_CLASS,
|
|
3915
|
-
items: items.map((item) => ({ ...item, icon: /* @__PURE__ */ (0,
|
|
4504
|
+
items: items.map((item) => ({ ...item, icon: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ProviderMark, { provider: item.id, size: 14 }) })),
|
|
3916
4505
|
selectedId: currentId,
|
|
3917
4506
|
onSelect: (id) => {
|
|
3918
4507
|
setOpen(false);
|
|
@@ -3923,7 +4512,7 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
|
|
|
3923
4512
|
},
|
|
3924
4513
|
side: "top",
|
|
3925
4514
|
portal: true,
|
|
3926
|
-
anchor: /* @__PURE__ */ (0,
|
|
4515
|
+
anchor: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
3927
4516
|
"button",
|
|
3928
4517
|
{
|
|
3929
4518
|
type: "button",
|
|
@@ -3935,9 +4524,9 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
|
|
|
3935
4524
|
setOpen((value) => !value);
|
|
3936
4525
|
},
|
|
3937
4526
|
children: [
|
|
3938
|
-
currentId === void 0 ? null : /* @__PURE__ */ (0,
|
|
4527
|
+
currentId === void 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ProviderMark, { provider: currentId, size: 14 }),
|
|
3939
4528
|
label,
|
|
3940
|
-
started ? null : /* @__PURE__ */ (0,
|
|
4529
|
+
started ? null : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_dsh_client_ui_primitives15.IconChevronDownOutlineRegular, { size: 14 })
|
|
3941
4530
|
]
|
|
3942
4531
|
}
|
|
3943
4532
|
)
|
|
@@ -3947,7 +4536,7 @@ function CliSwitcher({ directory, load, select, session, prefs }) {
|
|
|
3947
4536
|
function SessionMark({ sessionId, list }) {
|
|
3948
4537
|
const provider = useSessionProvider(list, sessionId);
|
|
3949
4538
|
if (provider === void 0) return null;
|
|
3950
|
-
return /* @__PURE__ */ (0,
|
|
4539
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: SESSION_MARK_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ProviderMark, { provider, size: 14 }) });
|
|
3951
4540
|
}
|
|
3952
4541
|
function directoryFace(ctx, sessionId) {
|
|
3953
4542
|
const directory = ctx.modelDirectories.directoryFor(sessionId);
|