dsh-whale-widget-ja 0.1.1 → 0.1.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.en.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # dsh-whale-widget-ja
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/dsh-whale-widget-ja)](https://www.npmjs.com/package/dsh-whale-widget-ja)
4
+
3
5
  **Unofficial Japanese localization + JPY display patch for
4
6
  [`dsh-whale-widget`](https://github.com/MeteorNOX/DeepSeek-Balance-Whale-Widget)** —
5
7
  the DeepSeek balance whale widget for DSH (DeepSeek Harness).
@@ -16,6 +18,7 @@ the DeepSeek balance whale widget for DSH (DeepSeek Harness).
16
18
  |---|---|
17
19
  | Language | Japanese for menus, settings panels, notifications, dialogs, errors and default bubble texts (~1,300 strings / 1,600 occurrences) |
18
20
  | Money | Everything shown in **JPY (¥)**, converted from USD / CNY |
21
+ | GLM peak | Detects GLM Coding Plan peak hours (**Mon–Fri 15:00–19:00 JST** = 14:00–18:00 UTC+8; off-peak costs 50% credits). Quota/plan bubble modules accept `{glm_status}` `{glm_countdown}` `{glm_until}` |
19
22
  | FX rate | Fetched **every 6 hours** (also once at page load). Falls back to the last value, then to a built-in default (157 JPY/USD) |
20
23
  | Dates | `zh-CN` → `ja-JP` |
21
24
  | Logic | Two places that used Chinese text as a condition are adjusted (self-check result check, update-check timeout check) |
@@ -32,17 +35,20 @@ dsh plugin --profile web add dsh-whale-widget
32
35
 
33
36
  ## Usage
34
37
 
38
+ ```bash
39
+ npx dsh-whale-widget-ja apply
40
+ # then hard-reload the page (Cmd/Ctrl + Shift + R)
41
+ ```
42
+
43
+ Or clone it if you prefer to run from source:
44
+
35
45
  ```bash
36
46
  git clone https://github.com/qnosuke/dsh-whale-widget-ja.git
37
47
  cd dsh-whale-widget-ja
38
48
  npm install # acorn is used for AST-based rewriting
39
-
40
- node bin/cli.mjs apply # backups → rewrite → syntax validation
41
- # then hard-reload the page (Cmd/Ctrl + Shift + R)
49
+ node bin/cli.mjs apply
42
50
  ```
43
51
 
44
- If the package is published to npm: `npx dsh-whale-widget-ja apply`.
45
-
46
52
  ### When does it take effect?
47
53
 
48
54
  * **Client side** (most of the UI): after a hard reload.
package/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # dsh-whale-widget-ja
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/dsh-whale-widget-ja)](https://www.npmjs.com/package/dsh-whale-widget-ja)
4
+ [![test](https://github.com/qnosuke/dsh-whale-widget-ja/actions/workflows/test.yml/badge.svg)](https://github.com/qnosuke/dsh-whale-widget-ja/actions/workflows/test.yml)
5
+
3
6
  [English README](README.en.md)
4
7
 
5
8
  DSH(DeepSeek Harness)Web 画面右下の **小鲸鱼ウィジェット** [`dsh-whale-widget`](https://github.com/MeteorNOX/DeepSeek-Balance-Whale-Widget) を
@@ -16,6 +19,7 @@ DSH(DeepSeek Harness)Web 画面右下の **小鲸鱼ウィジェット** [`d
16
19
  | 言語 | メニュー・設定パネル・通知・確認ダイアログ・エラー・既定のふきだし文言まで日本語(約 1,300 文言 / 1,600 箇所) |
17
20
  | 金額 | すべて **日本円(¥)** 表示。USD / CNY 建ての金額を換算 |
18
21
  | 為替 | **6 時間ごとに自動取得**(画面を開いた直後にも 1 回)。取得できなければ前回値 → 既定値(157 円/USD) |
22
+ | GLM ピーク | GLM Coding Plan のピーク帯(**平日 15:00–19:00 JST**、オフピークはクレジット消費 50%)を判定。クォータ/plan モジュールで `{glm_status}` `{glm_countdown}` `{glm_until}` が使える |
19
23
  | 日時 | `zh-CN` → `ja-JP` |
20
24
  | ロジック | 中国語を条件に使っていた 2 か所(セルフチェックの成否判定・更新確認のタイムアウト判定)を日本語に合わせて調整 |
21
25
 
@@ -32,19 +36,19 @@ dsh plugin --profile web add dsh-whale-widget
32
36
  ## 使い方
33
37
 
34
38
  ```bash
35
- # 1) このリポジトリを取得して依存を入れる(構文解析に acorn を使います)
39
+ npx dsh-whale-widget-ja apply
40
+ # 画面をハードリロード(Cmd / Ctrl + Shift + R)
41
+ ```
42
+
43
+ これだけです(バックアップは自動で作成されます)。npm 未使用の環境や中身を確認したい場合は clone して実行もできます。
44
+
45
+ ```bash
36
46
  git clone https://github.com/qnosuke/dsh-whale-widget-ja.git
37
47
  cd dsh-whale-widget-ja
38
48
  npm install
39
-
40
- # 2) 適用(バックアップ自動作成)
41
49
  node bin/cli.mjs apply
42
-
43
- # 3) 画面をハードリロード(Cmd/Ctrl + Shift + R)
44
50
  ```
45
51
 
46
- npm に公開されていれば `npx dsh-whale-widget-ja apply` でも実行できます。
47
-
48
52
  ### 反映のタイミング
49
53
 
50
54
  * **画面側**(メニュー・設定・通知など大部分): ハードリロードで即反映
@@ -97,6 +101,22 @@ test/parse.mjs … 辞書とパッチ定義の健全性チェック(CI で
97
101
  * 100 円未満は小数 2 桁、1,000 円以上は 3 桁区切り
98
102
  * しきい値(残高アラート・今日の予算)の**入力は USD のまま**。ふきだし内の表示だけ円換算します
99
103
 
104
+ ### GLM Coding Plan のピーク表示
105
+
106
+ z.ai 公式: ピークは **月曜〜金曜 14:00–18:00 SGT (UTC+8)** = 日本時間 **15:00–19:00**。
107
+ ピーク中はクレジット消費が標準レート、オフピークは **50%**。
108
+ (出典: https://docs.z.ai/devpack/overview — "During off-peak hours, model usage is charged at 50% of the standard credit rate")
109
+
110
+ GLM モデルのクォータ(plan)モジュールのテンプレートに次のプレースホルダが使えます:
111
+
112
+ | 変数 | 表示例 |
113
+ |---|---|
114
+ | `{glm_status}` | `ピーク` / `オフピーク` |
115
+ | `{glm_countdown}` | `2時間5分`(次の切替まで) |
116
+ | `{glm_until}` | `ピーク終了まで 2時間5分` |
117
+
118
+ テンプレート例: `【{glm_status}】{plan} · {plan_reset}`
119
+
100
120
  ### 為替レート
101
121
 
102
122
  1. ホストの `/dsh-whale/fx.json`(6 時間キャッシュ、`$DSH_HOME/.dshw-fx.json`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-whale-widget-ja",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "非公式パッチ: DSH の小鲸鱼ウィジェット (dsh-whale-widget) を日本語 + 日本円表示にする",
5
5
  "type": "module",
6
6
  "bin": {
package/src/postpatch.mjs CHANGED
@@ -61,6 +61,40 @@ function dshwThresholdText(v) {
61
61
  if (v === null || v === undefined || v === '') return ''
62
62
  var n = dshwToDisplay(v, 'USD')
63
63
  return isFinite(n) ? dshwFmtNum(n) : String(v)
64
+ // ===== GLM Coding Plan のピーク判定 =====
65
+ // 公式: ピーク = 月〜金 14:00-18:00 SGT (UTC+8)。オフピークはクレジット消費が 50%。
66
+ // ふきだしの plan/クォータ モジュールで {glm_status} {glm_countdown} {glm_until} が使える。
67
+ function dshwGlmPeakInfo() {
68
+ var now = new Date()
69
+ var day = now.getUTCDay() // 0=日 6=土
70
+ var mins = now.getUTCHours() * 60 + now.getUTCMinutes()
71
+ var peakStart = 6 * 60 // 06:00 UTC = 14:00 UTC+8 = 15:00 日本時間
72
+ var peakEnd = 10 * 60 // 10:00 UTC = 18:00 UTC+8 = 19:00 日本時間
73
+ var weekday = day >= 1 && day <= 5
74
+ var isPeak = weekday && mins >= peakStart && mins < peakEnd
75
+ function minsUntil(targetMin, targetDay) {
76
+ var t = (targetDay - day + 7) % 7
77
+ var diff = t * 1440 + targetMin - mins
78
+ if (diff <= 0) diff += 7 * 1440
79
+ return diff
80
+ }
81
+ var diff = isPeak ? minsUntil(peakEnd, day) : (weekday && mins < peakStart ? minsUntil(peakStart, day) : minsUntil(peakStart, (day + 1) % 7))
82
+ var hh = Math.floor(diff / 60), mm = diff % 60
83
+ var cd = (hh > 0 ? hh + '時間' : '') + mm + '分'
84
+ return {
85
+ isPeak: isPeak,
86
+ status: isPeak ? 'ピーク' : 'オフピーク',
87
+ countdown: cd,
88
+ until: isPeak ? 'ピーク終了まで ' + cd : 'ピーク開始まで ' + cd,
89
+ }
90
+ }
91
+ function dshwGlmPeakText(key) {
92
+ var i = dshwGlmPeakInfo()
93
+ if (key === 'glm_status') return i.status
94
+ if (key === 'glm_countdown') return i.countdown
95
+ if (key === 'glm_until') return i.until
96
+ return ''
97
+ }
64
98
  }`
65
99
 
66
100
  const ORIG_FMT_MONEY = [
@@ -259,4 +293,85 @@ async function readFxRates(force) {
259
293
  { rel: 'assets/whale-widget.js', from: "/^通过/.test(aboutSelfResult)", to: "/^成功/.test(aboutSelfResult)", required: true },
260
294
  // アップデート確認のタイムアウト判定:メッセージが「タイムアウト」になった
261
295
  { rel: 'lib/index.js', from: "/超时/.test(String(err1.message || ''))", to: "/超时|タイムアウト|timeout/i.test(String(err1.message || ''))", required: true },
296
+ // plan/クォータ モジュールのプレースホルダに GLM ピーク情報を追加
297
+ {
298
+ rel: 'assets/whale-widget.js',
299
+ from: [
300
+ " var pwin = bubblePlanWinOf(m)",
301
+ " map['plan'] = apiPlanUsedText(m.modelId, pwin)",
302
+ " map['plan_used'] = map['plan']",
303
+ " map['plan_left'] = apiPlanLeftText(m.modelId, pwin)",
304
+ " map['plan_reset'] = apiPlanResetText(m.modelId, pwin)",
305
+ " return map",
306
+ ].join('\n'),
307
+ to: [
308
+ " var pwin = bubblePlanWinOf(m)",
309
+ " map['plan'] = apiPlanUsedText(m.modelId, pwin)",
310
+ " map['plan_used'] = map['plan']",
311
+ " map['plan_left'] = apiPlanLeftText(m.modelId, pwin)",
312
+ " map['plan_reset'] = apiPlanResetText(m.modelId, pwin)",
313
+ " // GLM Coding Plan のピーク/オフピーク(公式: 平日 14-18時 UTC+8、オフピークは 50%)",
314
+ " map['glm_status'] = dshwGlmPeakText('glm_status')",
315
+ " map['glm_countdown'] = dshwGlmPeakText('glm_countdown')",
316
+ " map['glm_until'] = dshwGlmPeakText('glm_until')",
317
+ " return map",
318
+ ].join('\n'),
319
+ required: true,
320
+ },
321
+ // ふきだしモジュールのヘルプ(? アイコン・入力欄例示)に GLM ピークのプレースホルダを載せる
322
+ {
323
+ rel: 'assets/whale-widget.js',
324
+ from: [
325
+ " add('plan', 'サブスククォータの使用率(複数ウィンドウのプロバイダーでは「表示スタイル」で選んだウィンドウ、ウィンドウラベル付き)')",
326
+ " add('plan_left', 'サブスククォータの残量率(同上)')",
327
+ " add('plan_reset', 'サブスククォータ更新までのカウントダウン(同上。全ウィンドウ時はコンパクト表示)')",
328
+ " return arr",
329
+ ].join('\n'),
330
+ to: [
331
+ " add('plan', 'サブスククォータの使用率(複数ウィンドウのプロバイダーでは「表示スタイル」で選んだウィンドウ、ウィンドウラベル付き)')",
332
+ " add('plan_left', 'サブスククォータの残量率(同上)')",
333
+ " add('plan_reset', 'サブスククォータ更新までのカウントダウン(同上。全ウィンドウ時はコンパクト表示)')",
334
+ " add('glm_status', 'GLM ピーク状態(ピーク=平日 15:00–19:00 JST / オフピークは消費 50%)')",
335
+ " add('glm_countdown', 'GLM ピーク⇔オフピーク 切替までのカウントダウン')",
336
+ " add('glm_until', 'GLM ピークの開始/終了まで(ラベル付き)')",
337
+ " return arr",
338
+ ].join('\n'),
339
+ oldFrom: [
340
+ " add('plan', '订阅额度已用百分比(多窗口厂商按「显示样式」所选窗口,带窗口标签)')",
341
+ " add('plan_left', '订阅额度剩余百分比(同上)')",
342
+ " add('plan_reset', '订阅额度刷新倒计时(同上;全部窗口时为紧凑倒计时)')",
343
+ " return arr",
344
+ ].join('\n'),
345
+ oldTo: [
346
+ " add('plan', '订阅额度已用百分比(多窗口厂商按「显示样式」所选窗口,带窗口标签)')",
347
+ " add('plan_left', '订阅额度剩余百分比(同上)')",
348
+ " add('plan_reset', '订阅额度刷新倒计时(同上;全部窗口时为紧凑倒计时)')",
349
+ " add('glm_status', 'GLM ピーク状態(ピーク=平日 15:00–19:00 JST / オフピークは消費 50%)')",
350
+ " add('glm_countdown', 'GLM ピーク⇔オフピーク 切替までのカウントダウン')",
351
+ " add('glm_until', 'GLM ピークの開始/終了まで(ラベル付き)')",
352
+ " return arr",
353
+ ].join('\n'),
354
+ required: true,
355
+ },
356
+ {
357
+ rel: 'assets/whale-widget.js',
358
+ from: "inp.placeholder = isModelPlan ? '例: {plan} クォータ ・ {plan_reset} リセット時刻'",
359
+ oldFrom: "inp.placeholder = isModelPlan ? '例: {plan} 额度 ・ {plan_reset} 重置倒计时'",
360
+ to: "inp.placeholder = isModelPlan ? '例: 【{glm_status}】{plan} クォータ ・ {plan_reset} リセット時刻'",
361
+ required: true,
362
+ },
363
+ {
364
+ rel: 'assets/whale-widget.js',
365
+ from: "'{plan} クォータ / {plan_left} 残り / {plan_reset} リセット時刻(複数ウィンドウ時は「表示スタイル」で選択したウィンドウに従って変化)'",
366
+ oldFrom: "'{plan} 额度 / {plan_left} 剩余 / {plan_reset} 重置倒计时(多窗口厂商随「显示样式」所选窗口变化)'",
367
+ to: "'{plan} クォータ / {plan_left} 残り / {plan_reset} リセット時刻(複数ウィンドウ時は「表示スタイル」で選択したウィンドウに従って変化) / GLM ピーク: {glm_status} {glm_countdown} {glm_until}'",
368
+ required: true,
369
+ },
370
+ {
371
+ rel: 'assets/whale-widget.js',
372
+ from: "'このプロバイダーのサブスク枠(プロバイダー API から取得、手動ではありません);テンプレート変数 {plan} クォータ / {plan_reset} リセット時刻 / {plan_left} 残り' + planWinHint",
373
+ oldFrom: "'该厂商的订阅额度(来自厂商 API,非手动);模板变量 {plan} 额度 / {plan_reset} 重置倒计时 / {plan_left} 剩余' + planWinHint",
374
+ to: "'このプロバイダーのサブスク枠(プロバイダー API から取得、手動ではありません);テンプレート変数 {plan} クォータ / {plan_reset} リセット時刻 / {plan_left} 残り / {glm_status} GLMピーク' + planWinHint",
375
+ required: true,
376
+ },
262
377
  ]