dsh-claude-style 0.18.3 → 0.18.5-dev.43

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.
@@ -186,7 +186,6 @@ var FONT_FILES = {
186
186
  "NotoSerifVariable.woff2": "font/woff2"
187
187
  };
188
188
  var ASSETS_PATH = `${ROUTE_PREFIX}/assets/`;
189
- var USAGE_TTL_MS = 30 * 1e3;
190
189
  var DELETE_BODY_MAX = 4096;
191
190
  function sessionDirectoryName(id) {
192
191
  if (id === ".") return "~002E";
@@ -407,12 +406,8 @@ function registerRoutes(ctx, scope) {
407
406
  handler: (req, res) => {
408
407
  if (methodRefused(req, res, ["GET", "HEAD"])) return;
409
408
  if (fenceRefused(ctx, req, res)) return;
410
- let snapshot = usage.snapshot();
411
- const stale = snapshot.value === null || snapshot.computing === true || Date.now() - (snapshot.value?.computedAt ?? 0) > USAGE_TTL_MS;
412
- if (stale) {
413
- void usage.refresh();
414
- snapshot = usage.snapshot();
415
- }
409
+ void usage.refresh();
410
+ const snapshot = usage.snapshot();
416
411
  sendJson(res, 200, {
417
412
  ok: true,
418
413
  value: snapshot.value,
@@ -102,8 +102,15 @@ function foldSession(events) {
102
102
  return { days, hours };
103
103
  }
104
104
  function newestLog(dir) {
105
+ let entries;
106
+ try {
107
+ entries = readdirSync(dir, { withFileTypes: true });
108
+ } catch (error) {
109
+ if (error.code === "ENOENT") return null;
110
+ throw error;
111
+ }
105
112
  let best = null;
106
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
113
+ for (const entry of entries) {
107
114
  if (!entry.isFile()) continue;
108
115
  const match = SESSION_LOG.exec(entry.name);
109
116
  if (match === null) continue;
@@ -115,7 +122,8 @@ function newestLog(dir) {
115
122
  }
116
123
  if (best === null) return null;
117
124
  const path = join(dir, best.name);
118
- const stat = statSync(path);
125
+ const stat = statSync(path, { throwIfNoEntry: false });
126
+ if (stat === void 0) return null;
119
127
  return { path, size: stat.size, mtimeMs: stat.mtimeMs };
120
128
  }
121
129
  function listSessionLogs(root) {
@@ -123,7 +131,14 @@ function listSessionLogs(root) {
123
131
  if (!existsSync(root)) return out;
124
132
  for (const project of readdirSync(root, { withFileTypes: true })) {
125
133
  if (!project.isDirectory()) continue;
126
- for (const session of readdirSync(join(root, project.name), { withFileTypes: true })) {
134
+ let sessions;
135
+ try {
136
+ sessions = readdirSync(join(root, project.name), { withFileTypes: true });
137
+ } catch (error) {
138
+ if (error.code === "ENOENT") continue;
139
+ throw error;
140
+ }
141
+ for (const session of sessions) {
127
142
  if (!session.isDirectory()) continue;
128
143
  const log = newestLog(join(root, project.name, session.name));
129
144
  if (log === null) continue;
package/lib/host/usage.js CHANGED
@@ -60,6 +60,14 @@ import { readLedger } from "./usage-ledger.js";
60
60
  import { mergeLedgerFold, summarize } from "./usage-summary.js";
61
61
  var LEDGER_SOURCE = "cost-meter";
62
62
  var LOCAL_SOURCE = "local";
63
+ var USAGE_TTL_MS = 30 * 1e3;
64
+ var SLOW_PASS_FACTOR = 2;
65
+ function recheckDelay(durationMs) {
66
+ return Math.max(USAGE_TTL_MS, durationMs * SLOW_PASS_FACTOR);
67
+ }
68
+ function messageOf(error) {
69
+ return String(error?.message ?? error);
70
+ }
63
71
  function hoursOf(days) {
64
72
  const hours = new Array(24).fill(0);
65
73
  for (const buckets of days.values()) {
@@ -81,12 +89,14 @@ function createUsage(ctx) {
81
89
  const home = () => harnessPath(ctx);
82
90
  let state = null;
83
91
  let pending = null;
92
+ let nextAt = 0;
84
93
  let disposed = false;
85
94
  async function computeLocal(logs, ledgerDays) {
86
95
  const record = readRecord(ctx);
87
96
  const sessions = /* @__PURE__ */ new Map();
88
97
  let read = 0;
89
98
  let failed = 0;
99
+ let firstFailure = null;
90
100
  for (const log of logs) {
91
101
  const stored = record.sessions.get(log.id);
92
102
  const fingerprint = stored?.fingerprint;
@@ -94,7 +104,15 @@ function createUsage(ctx) {
94
104
  sessions.set(log.id, stored);
95
105
  continue;
96
106
  }
97
- const events = await readEvents(ctx, PACKAGE_NAME, log.id, "the usage roll-up");
107
+ let events;
108
+ try {
109
+ events = await readEvents(ctx, PACKAGE_NAME, log.id, "the usage roll-up");
110
+ } catch (error) {
111
+ failed += 1;
112
+ firstFailure = firstFailure ?? `${log.id}: ${messageOf(error)}`;
113
+ if (stored !== void 0) sessions.set(log.id, stored);
114
+ continue;
115
+ }
98
116
  if (events === null) {
99
117
  failed += 1;
100
118
  if (stored !== void 0) sessions.set(log.id, stored);
@@ -103,6 +121,9 @@ function createUsage(ctx) {
103
121
  sessions.set(log.id, { fingerprint: { size: log.size, mtimeMs: log.mtimeMs }, days: foldSession(events).days });
104
122
  read += 1;
105
123
  }
124
+ if (firstFailure !== null) {
125
+ ctx.logger?.warn?.(`${PACKAGE_NAME}: ${failed} session log(s) left out of the usage roll-up; the rest are recorded (first: ${firstFailure})`);
126
+ }
106
127
  for (const [id, stored] of record.sessions) {
107
128
  if (!sessions.has(id) && stored.days.size > 0) sessions.set(id, { days: stored.days });
108
129
  }
@@ -137,19 +158,26 @@ function createUsage(ctx) {
137
158
  function refresh() {
138
159
  if (disposed) return Promise.resolve(null);
139
160
  if (pending !== null) return pending;
161
+ if (state !== null && Date.now() < nextAt) return Promise.resolve(state.value);
140
162
  state = state === null ? { value: null, computing: true } : { ...state, computing: true };
163
+ const startedAt = Date.now();
164
+ const finish = () => {
165
+ pending = null;
166
+ const finishedAt = Date.now();
167
+ nextAt = finishedAt + recheckDelay(finishedAt - startedAt);
168
+ };
141
169
  pending = compute((partial) => {
142
170
  if (!disposed) state = { value: partial, computing: true };
143
171
  }).then(
144
172
  (value) => {
145
- pending = null;
173
+ finish();
146
174
  if (disposed) return value;
147
175
  state = { value, computing: false };
148
176
  return value;
149
177
  },
150
178
  (error) => {
151
- pending = null;
152
- if (!disposed) state = { value: state?.value ?? null, computing: false, error: String(error?.message ?? error) };
179
+ finish();
180
+ if (!disposed) state = { value: state?.value ?? null, computing: false, error: messageOf(error) };
153
181
  return null;
154
182
  }
155
183
  );
@@ -198,7 +198,7 @@
198
198
  "match": "claude.*mythos",
199
199
  "note": "Mythos is Fable's unrestricted sibling — Anthropic's own words: Fable is the same underlying model with cybersecurity and biology safeguards added. Access to Mythos is limited to vetted organizations, so its copy leads with the audience rather than the capability.",
200
200
  "text": {
201
- "zh": "面向网络安全与生物学研究的可靠模型。",
201
+ "zh": "面向网络安全与生物学研究,仅向经过审核的机构开放。",
202
202
  "en": "Built for cybersecurity and biology research, with access limited to vetted organizations."
203
203
  }
204
204
  },
@@ -207,14 +207,14 @@
207
207
  "note": "Family copy stays version-agnostic, so it carries no superlatives: 'strongest' is only true of the current generation and would mislabel an older Opus. Superlatives belong in a rule anchored to the version. It also carries no tier prefix of ours — '旗舰档:' is our positioning, not the model's own line.",
208
208
  "text": {
209
209
  "zh": "面向复杂编程与 AI 智能体的混合推理模型。",
210
- "en": "A hybrid reasoning model built for serious coding and AI agents."
210
+ "en": "A hybrid reasoning model built for complex coding and AI agents."
211
211
  }
212
212
  },
213
213
  {
214
214
  "match": "claude.*sonnet",
215
215
  "text": {
216
- "zh": "面向实时智能体与高吞吐的混合推理模型。",
217
- "en": "Hybrid reasoning for real-time agents and high-volume work."
216
+ "zh": "面向实时智能体与高吞吐场景的混合推理模型。",
217
+ "en": "A hybrid reasoning model for real-time agents and high-volume work."
218
218
  }
219
219
  },
220
220
  {
@@ -227,8 +227,8 @@
227
227
  {
228
228
  "match": "claude",
229
229
  "text": {
230
- "zh": "Anthropic Claude 模型。",
231
- "en": "Anthropic Claude model."
230
+ "zh": "擅长编程、写作与复杂分析。",
231
+ "en": "Strong at coding, writing and complex analysis."
232
232
  }
233
233
  },
234
234
  {
@@ -240,10 +240,10 @@
240
240
  },
241
241
  {
242
242
  "match": "gpt[._-]?5[._-]?4(?!\\d)",
243
- "note": "Anchored to the 5.4 generation: the context size and the computer use are that model's, so a later GPT-5 reads the rule below.",
243
+ "note": "Anchored to the 5.4 generation: native computer use is that model's claim, so a later GPT-5 reads the rule below.",
244
244
  "text": {
245
- "zh": "面向编程与专业工作的长上下文模型。",
246
- "en": "For coding and professional work, with a 1.05M-token context and native computer use."
245
+ "zh": "面向编程与专业工作,原生支持计算机操作。",
246
+ "en": "For coding and professional work, with native computer use."
247
247
  }
248
248
  },
249
249
  {
@@ -256,22 +256,22 @@
256
256
  {
257
257
  "match": "(^|[/-])o[1-9](-|$)",
258
258
  "text": {
259
- "zh": "作答前深入思考,从 o1 到 o3 与 o4-mini。",
260
- "en": "Trained to think more deeply before responding, from o1 through o3 and o4-mini."
259
+ "zh": "作答前先深入思考,擅长多步推理。",
260
+ "en": "Trained to think before answering, strong at multi-step reasoning."
261
261
  }
262
262
  },
263
263
  {
264
264
  "match": "gpt-oss|oss-\\d",
265
265
  "text": {
266
- "zh": "OpenAI 开发的开放权重推理模型。",
267
- "en": "Open-weight reasoning models, Apache 2.0, in 120B and 20B sizes, customizable and self-hostable."
266
+ "zh": "OpenAI 的开放权重推理模型,Apache 2.0 许可,分 120B 与 20B 两种规模,可自托管。",
267
+ "en": "OpenAI's open-weight reasoning models under Apache 2.0, in 120B and 20B sizes, self-hostable."
268
268
  }
269
269
  },
270
270
  {
271
271
  "match": "gpt",
272
272
  "text": {
273
- "zh": "支持文本与图像输入、多语言。",
274
- "en": "Text and image input, multilingual."
273
+ "zh": "支持文本与图像输入,覆盖多种语言。",
274
+ "en": "Text and image input across many languages."
275
275
  }
276
276
  },
277
277
  {
@@ -312,34 +312,34 @@
312
312
  }
313
313
  },
314
314
  {
315
- "match": "glm[._-]?5[._-]?3.*flashx",
316
- "note": "Anchored to the 5.3 generation: the throughput figure is that tier's, so a later GLM Flash X reads the generic Flash rule below.",
315
+ "match": "glm.*flashx",
316
+ "note": "The Flash X tier of every generation, above the Flash rules because its id contains `flash`.",
317
317
  "text": {
318
- "zh": "GLM 5.3 flash的高吞吐版本。",
319
- "en": "A high-throughput variant running at 200 tokens/s."
318
+ "zh": "Flash 档的高吞吐版本,适合高频任务。",
319
+ "en": "The high-throughput variant of the Flash tier, for high-frequency work."
320
320
  }
321
321
  },
322
322
  {
323
323
  "match": "glm[._-]?5[._-]?3.*flash",
324
- "note": "Anchored to the 5.3 generation's Flash tier; a later GLM Flash reads the generic Flash rule below.",
324
+ "note": "Anchored to the 5.3 generation's Flash tier: 'first' and the parameter count are its own, so a later GLM Flash reads the generic Flash rule below.",
325
325
  "text": {
326
- "zh": "GLM-5系列的首个原生多模态模型。",
327
- "en": "Natively multimodal, with 320B/18B MoE, 1M context and MIT licensing at $0.045 per task."
326
+ "zh": "该系列首个原生多模态模型,320B 总参数,MIT 许可开放权重。",
327
+ "en": "The series' first natively multimodal model: 320B parameters, open weights under MIT."
328
328
  }
329
329
  },
330
330
  {
331
331
  "match": "glm[._-]?5[._-]?3(?!\\d)",
332
332
  "note": "Anchored to the 5.3 generation: the superlative is true of it alone, and the line's own rule below carries none.",
333
333
  "text": {
334
- "zh": "最强开放权重编程模型之一,拓展智能上界的可及边界。",
335
- "en": "For coding and long-horizon autonomy: 1M context, 128K output, and post-training alone makes it the most capable open-weight coding model."
334
+ "zh": "最强的开放权重编程模型之一,擅长长时间自主任务。",
335
+ "en": "One of the most capable open-weight coding models, built for long-horizon autonomy."
336
336
  }
337
337
  },
338
338
  {
339
339
  "match": "glm.*flash",
340
340
  "text": {
341
- "zh": "更快更省的多模态推理,兼顾长上下文与日常编程。",
342
- "en": "Fast, low-cost multimodal inference with long context and everyday coding."
341
+ "zh": "更快更省的多模态推理,兼顾日常编程。",
342
+ "en": "Fast, low-cost multimodal inference that handles everyday coding."
343
343
  }
344
344
  },
345
345
  {
@@ -361,16 +361,16 @@
361
361
  "match": "kimi.*(cod(e|ing)|k2[._-]?7).*highspeed",
362
362
  "note": "The coding line's high-speed tier, above the coding rule because its own id contains `coding`.",
363
363
  "text": {
364
- "zh": "面向长程编程的开放权重智能体模型高速版。",
365
- "en": "A high-speed variant at about 180 tokens/s, 5–6x the regular tier, for 2x the price."
364
+ "zh": "长程编程智能体模型的高速版本,开放权重。",
365
+ "en": "The high-speed tier of the open-weight agentic coding model, for long-horizon work."
366
366
  }
367
367
  },
368
368
  {
369
369
  "match": "kimi.*(cod(e|ing)|k2[._-]?7)",
370
370
  "note": "The coding line whatever the suffix spells: `kimi-for-coding` and `kimi-k2.7-code` both read it, and the high-speed tier above is claimed first.",
371
371
  "text": {
372
- "zh": "面向长程编程的开放权重智能体模型。",
373
- "en": "An open-weight agentic coding model for long-horizon work, 1T/32B with 256K context."
372
+ "zh": "面向长程编程的开放权重智能体模型,1T 总参数。",
373
+ "en": "An open-weight agentic coding model for long-horizon work, with 1T parameters."
374
374
  }
375
375
  },
376
376
  {
@@ -382,10 +382,10 @@
382
382
  },
383
383
  {
384
384
  "match": "qwen[._-]?3[._-]?8.*max",
385
- "note": "Anchored to the 3.8 generation: the parameter count and the context are that model's, so a later Qwen Max falls to the line rule below.",
385
+ "note": "Anchored to the 3.8 generation: the parameter count is that model's, so a later Qwen Max falls to the line rule below.",
386
386
  "text": {
387
- "zh": "面向编程与办公,2.4 万亿参数 MoE,1M 上下文、思考模式与内置工具。",
388
- "en": "A 2.4T-parameter MoE for coding and office work, with 1M context, thinking mode and built-in tools."
387
+ "zh": "面向编程与办公的 2.4 万亿参数 MoE,支持思考模式与内置工具。",
388
+ "en": "A 2.4T-parameter MoE for coding and office work, with thinking mode and built-in tools."
389
389
  }
390
390
  },
391
391
  {
@@ -398,8 +398,8 @@
398
398
  {
399
399
  "match": "qwen.*(flash|turbo)",
400
400
  "text": {
401
- "zh": "响应快、成本低,工具调用与长上下文支持完整。",
402
- "en": "Fast and cheap, with full tool calling and long-context support."
401
+ "zh": "响应快、成本低,工具调用支持完整。",
402
+ "en": "Fast and cheap, with full tool calling."
403
403
  }
404
404
  },
405
405
  {
@@ -413,8 +413,8 @@
413
413
  "match": "qwen.*a\\d+b",
414
414
  "note": "MoE ids spell out total and active parameters (`2.4t-a95b`, `235b-a22b`); the active count must win over the size rule below, which would otherwise read the trailing `95b` as a small dense model.",
415
415
  "text": {
416
- "zh": "总参大、激活参数少,单位成本低于同规模稠密模型。",
417
- "en": "Many total parameters but few active, so it costs less than a dense model of the same size."
416
+ "zh": "MoE 架构,单位成本低于同规模稠密模型。",
417
+ "en": "A mixture-of-experts model that costs less to serve than a dense model of its size."
418
418
  }
419
419
  },
420
420
  {
@@ -434,18 +434,18 @@
434
434
  },
435
435
  {
436
436
  "match": "step[._-]?5(?!\\d)",
437
- "note": "Anchored to the 5 line: the input modes and the context are its own, and the trailing-digit guard keeps a size suffix (`95b`) from reading it.",
437
+ "note": "Anchored to the 5 line: the input modes are its own, and the trailing-digit guard keeps a size suffix (`95b`) from reading it.",
438
438
  "text": {
439
- "zh": "面向编程与专业知识工作,原生图文视频输入,1M 上下文。",
440
- "en": "For programming and professional knowledge work, with native text, image and video input and a 1M-token context."
439
+ "zh": "面向编程与专业知识工作,原生支持文本、图像与视频输入。",
440
+ "en": "For coding and professional knowledge work, with native text, image and video input."
441
441
  }
442
442
  },
443
443
  {
444
444
  "match": "step[._-]?3[._-]?7.*flash",
445
- "note": "Anchored to 3.7: the parameter counts and the token rate are that tier's, so another Step Flash falls to the line rule below.",
445
+ "note": "Anchored to 3.7: the parameter count is that tier's, so another Step Flash falls to the line rule below.",
446
446
  "text": {
447
- "zh": "面向智能体与代码任务,198B/11B 稀疏 MoE,图像与视频理解,256K 上下文,最高 400 tokens/s。",
448
- "en": "For agentic and coding tasks: 198B/11B sparse MoE with image and video understanding, 256K context, up to 400 tokens/s."
447
+ "zh": "面向智能体与代码任务的 198B 稀疏 MoE,支持图像与视频理解。",
448
+ "en": "A 198B sparse MoE for agentic and coding tasks, with image and video understanding."
449
449
  }
450
450
  },
451
451
  {
@@ -459,15 +459,15 @@
459
459
  "match": "minimax.*m3|(^|[^a-z0-9])m3($|-)",
460
460
  "note": "The M3 line's own claims; the catalog's `minimax-m3-1m` is the same line at a longer context.",
461
461
  "text": {
462
- "zh": "首个集前沿编程、1M 上下文与原生多模态于一身的开放权重模型。",
463
- "en": "The first open-weight model combining frontier coding, 1M context and native multimodality."
462
+ "zh": "兼具前沿编程能力与原生多模态的开放权重模型。",
463
+ "en": "An open-weight model combining frontier coding with native multimodality."
464
464
  }
465
465
  },
466
466
  {
467
467
  "match": "minimax|(^|[^a-z0-9])m2[-.]?\\d",
468
468
  "text": {
469
- "zh": "主打智能体推理、工具调用、编程与多模态输入,面向长上下文任务。",
470
- "en": "Agentic reasoning, tool use, coding and multimodal input for long-context work."
469
+ "zh": "主打智能体推理、工具调用、编程与多模态输入。",
470
+ "en": "Agentic reasoning, tool use, coding and multimodal input."
471
471
  }
472
472
  },
473
473
  {
@@ -478,14 +478,6 @@
478
478
  "en": "Small and fast by design, natively multimodal, powering Meta AI."
479
479
  }
480
480
  },
481
- {
482
- "match": "celeris[._-]?1(-|$)",
483
- "note": "Anchored to Celeris-1: the numbers are that model's, so a future Celeris reads the line rule below.",
484
- "text": {
485
- "zh": "生成速度 1,664 tokens/s,超过 Mercury 2 的 5 倍,MMLU-Pro 75.9%。",
486
- "en": "Generates 1,664 tokens/s, over 5x Mercury 2, at 75.9% MMLU-Pro."
487
- }
488
- },
489
481
  {
490
482
  "match": "celeris",
491
483
  "note": "Diffusion LLM, so the copy leads with latency rather than the usual capability framing.",
@@ -497,29 +489,29 @@
497
489
  {
498
490
  "match": "mercury-?\\d|inception",
499
491
  "text": {
500
- "zh": "面向代码生成,H100 上超 1,000 tokens/s,速度最高为同类模型的 10 倍。",
501
- "en": "Built for code, over 1,000 tokens/s on H100, up to 10x faster than speed-optimized LLMs."
492
+ "zh": "扩散架构,面向代码生成,以极快的生成速度见长。",
493
+ "en": "Diffusion-based and built for code, with very fast generation."
502
494
  }
503
495
  },
504
496
  {
505
497
  "match": "apodex",
506
498
  "text": {
507
- "zh": "面向复杂专业工作、金融与科研,1.1 mini 为 35B、可本地部署。",
508
- "en": "For complex professional work, finance and science; the 35B 1.1 mini runs locally."
499
+ "zh": "面向复杂专业工作、金融与科研。",
500
+ "en": "For complex professional work, finance and science."
509
501
  }
510
502
  },
511
503
  {
512
504
  "match": "motif",
513
505
  "text": {
514
- "zh": "MIT 许可,314B 总参 / 13.2B 激活,256K 上下文。",
515
- "en": "MIT-licensed, 314B total / 13.2B active, 256K context."
506
+ "zh": "MIT 许可的开放权重 MoE 模型。",
507
+ "en": "An MIT-licensed open-weight MoE model."
516
508
  }
517
509
  },
518
510
  {
519
511
  "match": "grok[._-]?4(?!\\d)",
520
512
  "note": "Anchored to the Grok 4 line, so every 4.x build reads the same sentence and another line falls to the rule below.",
521
513
  "text": {
522
- "zh": "全球最智能的模型之一,支持原生工具使用以及实时搜索功能。",
514
+ "zh": "全球最智能的模型之一,原生支持工具调用与实时搜索。",
523
515
  "en": "One of the most intelligent models in the world, with native tool use and real-time search."
524
516
  }
525
517
  },
@@ -534,15 +526,15 @@
534
526
  "match": "doubao.*2[._-]?1(?!\\d)|seed[._-]?2[._-]?1(?!\\d)",
535
527
  "note": "Anchored to Seed 2.1: the tiers it names are that generation's, so another Seed reads the vendor rule below.",
536
528
  "text": {
537
- "zh": "分 Pro 与 Turbo 两档的新一代生产力智能体,以通用任务与代码见长。",
538
- "en": "Pro and Turbo tiers of a next-generation productivity agent, strong at general agentic and coding tasks."
529
+ "zh": "分 Pro 与 Turbo 两档的生产力智能体模型,擅长通用任务与代码。",
530
+ "en": "A productivity agent model in Pro and Turbo tiers, strong at general agentic and coding tasks."
539
531
  }
540
532
  },
541
533
  {
542
534
  "match": "doubao|seed-?\\d|volc",
543
535
  "text": {
544
- "zh": "经 50+ 内部业务场景验证,每日千亿级 token 用量打磨,支持多模态。",
545
- "en": "Validated across 50+ internal scenarios and hundreds of billions of daily tokens, with multimodal support."
536
+ "zh": "覆盖对话、编程与多模态,经大规模线上业务验证。",
537
+ "en": "Chat, coding and multimodal work, proven across large-scale production use."
546
538
  }
547
539
  },
548
540
  {
@@ -571,16 +563,16 @@
571
563
  {
572
564
  "match": "codestral",
573
565
  "text": {
574
- "zh": "面向补全、FIM 与生成,128K 上下文。",
575
- "en": "Built for completion, FIM and generation, with 128K context."
566
+ "zh": "面向代码补全、FIM 与生成。",
567
+ "en": "Built for code completion, FIM and generation."
576
568
  }
577
569
  },
578
570
  {
579
571
  "match": "mistral.*large[._-]?3(?!\\d)",
580
- "note": "Anchored to Large 3: the licence and the parameter counts are that model's, so another Mistral reads the line rule below.",
572
+ "note": "Anchored to Large 3: the licence and the parameter count are that model's, so another Mistral reads the line rule below.",
581
573
  "text": {
582
- "zh": "Apache 2.0 开放权重多模态模型,细粒度 MoE,675B 总参 / 41B 激活,256K 上下文。",
583
- "en": "Apache-2.0 open-weight multimodal MoE with 675B total / 41B active parameters and 256K context."
574
+ "zh": "Apache 2.0 许可的开放权重多模态 MoE,675B 总参数。",
575
+ "en": "An Apache 2.0 open-weight multimodal MoE with 675B parameters."
584
576
  }
585
577
  },
586
578
  {
@@ -600,37 +592,37 @@
600
592
  {
601
593
  "match": "north",
602
594
  "text": {
603
- "zh": "整合大模型、搜索与自动化成一个企业级安全工作空间。",
595
+ "zh": "把大模型、搜索与自动化整合进同一个企业级安全工作空间。",
604
596
  "en": "LLMs, search and automation combined into one secure enterprise workspace."
605
597
  }
606
598
  },
607
599
  {
608
600
  "match": "command-?[ar]|cohere",
609
601
  "text": {
610
- "zh": "面向工具调用、RAG 与多语言,Command A 为 111B/256K。",
611
- "en": "For tool use, RAG and multilingual work; Command A is 111B with 256K context."
602
+ "zh": "面向工具调用、RAG 与多语言任务。",
603
+ "en": "For tool use, RAG and multilingual work."
612
604
  }
613
605
  },
614
606
  {
615
607
  "match": "phi-?\\d",
616
608
  "text": {
617
- "zh": "面向边缘与本地部署,Phi-4 以 14B 专注推理、数学与代码。",
618
- "en": "For edge and local use; Phi-4 (14B) targets reasoning, math and code."
609
+ "zh": "面向边缘与本地部署的小模型,擅长推理、数学与代码。",
610
+ "en": "Small models for edge and local use, strong at reasoning, math and code."
619
611
  }
620
612
  },
621
613
  {
622
614
  "match": "(^|[^a-z0-9])nova(-|$)",
623
615
  "note": "Every mention of the line reads the same boundary as the lockup rule: unanchored, this rule gives `sensenova-6.8-flash-lite` Amazon Nova's description.",
624
616
  "text": {
625
- "zh": "Micro/Lite/Pro/Premier 四档,支持文本、图像与视频输入。",
626
- "en": "Micro, Lite, Pro and Premier tiers taking text, image and video."
617
+ "zh": "亚马逊的多模态模型,支持文本、图像与视频输入。",
618
+ "en": "Amazon's multimodal models, taking text, image and video input."
627
619
  }
628
620
  },
629
621
  {
630
622
  "match": "sonar|perplexity",
631
623
  "text": {
632
- "zh": "结合实时网络信息与引用的搜索 API,从轻量 Sonar 到多步深研 Sonar Pro。",
633
- "en": "Search APIs answering with fresh web data and citations, from light Sonar to deep-research Sonar Pro."
624
+ "zh": "结合实时网络信息作答并附上引用来源,覆盖轻量问答到多步深度研究。",
625
+ "en": "Search APIs answering with fresh web data and citations, from quick answers to multi-step deep research."
634
626
  }
635
627
  }
636
628
  ],
@@ -653,8 +645,8 @@
653
645
  "match": "a\\d+b",
654
646
  "note": "MoE active-parameter suffix (`a95b`, `a23b`); tried before the dense rule so the active count is not mistaken for a total.",
655
647
  "text": {
656
- "zh": "总参大、激活参数少,单位成本低于同规模稠密模型。",
657
- "en": "Many total parameters but few active, so it costs less than a dense model of the same size."
648
+ "zh": "MoE 架构,单位成本低于同规模稠密模型。",
649
+ "en": "A mixture-of-experts model that costs less to serve than a dense model of its size."
658
650
  }
659
651
  },
660
652
  {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-claude-style",
3
3
  "description": "Claude Code Desktop theme for DeepSeek Harness (dsh) web GUI — visual & interaction overhaul",
4
- "version": "0.18.3",
4
+ "version": "0.18.5-dev.43",
5
5
  "type": "module",
6
6
  "main": "lib/host/index.js",
7
7
  "icon": "lib/claude-mark.svg",
Binary file
Binary file