dsh-livebench-panel 0.2.8 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/client.js +44 -5
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -107,6 +107,8 @@ window.__ModuleLoader__.load({
107
107
  const [homeBusy, setHomeBusy] = useState(false);
108
108
  const [results, setResults] = useState(null);
109
109
  const [pickedModels, setPickedModels] = useState(() => new Set());
110
+ const [sortBy, setSortBy] = useState(null);
111
+ const [sortDir, setSortDir] = useState("asc");
110
112
  const [modelOrder, setModelOrder] = useState(() => {
111
113
  try { return JSON.parse(localStorage.getItem("dlb_model_order_v1")) ?? []; } catch { return []; }
112
114
  });
@@ -197,7 +199,14 @@ window.__ModuleLoader__.load({
197
199
  const toggleList = (key, value) => setSel((prev) => {
198
200
  const list = prev[key];
199
201
  const next = list.includes(value) ? list.filter((v) => v !== value) : [...list, value];
200
- return { ...prev, [key]: next };
202
+ const out = { ...prev, [key]: next };
203
+ if (key === "cats") {
204
+ // 取消分类时同步清除该分类下已选的任务:否则这些任务标签
205
+ // 会从界面消失(分类不再选中)却仍在提交列表里 —— 用户只选了
206
+ // coding_completion 却连带跑了 cta 就是这个原因。
207
+ out.tasks = prev.tasks.filter((t) => next.includes(t.split("/")[0]));
208
+ }
209
+ return out;
201
210
  });
202
211
 
203
212
  // 已选模型解析(provider::model)
@@ -316,16 +325,37 @@ window.__ModuleLoader__.load({
316
325
  return { models, tasks, cells, startTimes };
317
326
  }, [results]);
318
327
  const cellOf = (model, key) => matrix.cells.get(`${model}__@__${key}`);
328
+ // 排序:sortBy=null 时用拖拽自定义顺序;点击表头在 正序/倒序 间切换
319
329
  const sortedModels = useMemo(() => {
320
330
  if (!matrix) return [];
331
+ const base = [...matrix.models];
332
+ if (sortBy === "model") {
333
+ base.sort((a, b) => (sortDir === "asc" ? a.localeCompare(b) : b.localeCompare(a)));
334
+ return base;
335
+ }
336
+ if (sortBy === "time") {
337
+ base.sort((a, b) => {
338
+ const ta = matrix.startTimes.get(a) ?? 0;
339
+ const tb = matrix.startTimes.get(b) ?? 0;
340
+ return sortDir === "asc" ? ta - tb : tb - ta;
341
+ });
342
+ return base;
343
+ }
321
344
  const indexOf = new Map(modelOrder.map((key, index) => [key, index]));
322
- return [...matrix.models].sort((a, b) => {
345
+ return base.sort((a, b) => {
323
346
  const ia = indexOf.has(a) ? indexOf.get(a) : Number.MAX_SAFE_INTEGER;
324
347
  const ib = indexOf.has(b) ? indexOf.get(b) : Number.MAX_SAFE_INTEGER;
325
348
  if (ia !== ib) return ia - ib;
326
349
  return a.localeCompare(b);
327
350
  });
328
- }, [matrix, modelOrder]);
351
+ }, [matrix, modelOrder, sortBy, sortDir]);
352
+
353
+ // 点击表头:切换排序字段(再次点击同一列则反转方向)
354
+ const toggleSort = (field) => {
355
+ if (sortBy === field) setSortDir((d) => (d === "asc" ? "desc" : "asc"));
356
+ else { setSortBy(field); setSortDir("asc"); }
357
+ };
358
+ const sortMark = (field) => (sortBy === field ? (sortDir === "asc" ? " ↑" : " ↓") : "");
329
359
 
330
360
  const persistModelOrder = (keys) => {
331
361
  setModelOrder(keys);
@@ -336,6 +366,7 @@ window.__ModuleLoader__.load({
336
366
  const sourceModel = dragKey.current;
337
367
  dragKey.current = null;
338
368
  if (!sourceModel || sourceModel === targetModel) return;
369
+ setSortBy(null); // 拖拽即回到自定义顺序
339
370
  const keys = sortedModels.slice();
340
371
  const from = keys.indexOf(sourceModel);
341
372
  const to = keys.indexOf(targetModel);
@@ -524,13 +555,21 @@ window.__ModuleLoader__.load({
524
555
  h("th", { style: { width: "30px" } },
525
556
  h("input", { type: "checkbox", checked: pickedModels.size > 0 && pickedModels.size === sortedModels.length,
526
557
  onChange: (event) => setPickedModels(event.target.checked ? new Set(sortedModels) : new Set()) })),
527
- h("th", null, "model"),
558
+ h("th", {
559
+ style: { cursor: "pointer", userSelect: "none" },
560
+ title: "点击按模型名排序(再次点击切换正序/倒序)",
561
+ onClick: () => toggleSort("model"),
562
+ }, "model" + sortMark("model")),
528
563
  matrix.tasks.map((taskKeyCol) => {
529
564
  const [cat, task] = taskKeyCol.split("/");
530
565
  return h("th", { key: taskKeyCol, title: `${cat} / ${task}` }, task);
531
566
  }),
532
567
  h("th", null, "删除"),
533
- h("th", null, "time"),
568
+ h("th", {
569
+ style: { cursor: "pointer", userSelect: "none" },
570
+ title: "点击按时间排序(再次点击切换正序/倒序)",
571
+ onClick: () => toggleSort("time"),
572
+ }, "time" + sortMark("time")),
534
573
  )),
535
574
  h("tbody", null,
536
575
  sortedModels.map((model) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-livebench-panel",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "description": "DSH web plugin: a LiveBench tab in the Trajectory view (right of 对话/轨迹). Run LiveBench evaluations against every model configured in the DeepSeek Harness — pick provider/model, category, task, release and question range from dropdowns, watch progress, and read scores in place.",
5
5
  "license": "MIT",
6
6
  "type": "module",