dsh-totonai 0.1.4 → 0.1.5

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/client/index.js CHANGED
@@ -131,10 +131,7 @@ window.__ModuleLoader__.load({
131
131
  h('div', { key: 'lv', style: { fontSize: 12, padding: '2px 8px', borderRadius: 999, border: '1px solid ' + C.border, color: d.active ? C.ok : C.warn } }, d.active ? d.displayName || d.level : L('未开通', 'Inactive')),
132
132
  ]),
133
133
  d.active
134
- ? h('div', { key: 'kv', style: Object.assign({}, S.kv, { marginTop: 8 }) }, [
135
- h('div', { key: 'a' }, L('总额度 ', 'Quota ') + tok(d.tokenQuota) + ' token'),
136
- h('div', { key: 'b' }, L('已用 ', 'Used ') + tok(d.usedToken) + ' token · ' + L('剩余 ', 'Left ') + tok(d.remainToken) + ' token'),
137
- ])
134
+ ? null
138
135
  : h('div', { key: 'kv', style: Object.assign({}, S.kv, { marginTop: 8 }) }, L('当前是免费档,充值后即可调用模型。', 'Free tier: recharge to unlock models.')),
139
136
  h('div', { key: 'act', style: { marginTop: 10, display: 'flex', gap: 8 } }, [
140
137
  h('button', { key: 'r', type: 'button', style: S.btn, disabled: refreshing, onClick: async () => { setRefreshing(true); try { await props.onRefresh() } finally { setRefreshing(false) } } }, refreshing ? L('刷新中…', 'Refreshing…') : L('刷新状态', 'Refresh')),
@@ -198,7 +195,7 @@ window.__ModuleLoader__.load({
198
195
  onClick: () => setPick(Object.assign({}, pick, { level: k })),
199
196
  }, [
200
197
  h('div', { key: 'n', style: { fontSize: 13, fontWeight: 600 } }, p.display_name || k),
201
- h('div', { key: 'p', style: { fontSize: 12, color: C.sub, marginTop: 4 } }, '¥' + (p.month_price || 0) + L(' / 月', ' / mo') + ' · ' + tok(p.token_quota) + ' token'),
198
+ h('div', { key: 'p', style: { fontSize: 12, color: C.sub, marginTop: 4 } }, '¥' + (p.month_price || 0) + L(' / 月', ' / mo')),
202
199
  ])
203
200
  })),
204
201
  h('div', { key: 'per', style: Object.assign({}, S.row, { marginTop: 10 }) }, [
package/lib/index.js CHANGED
@@ -9759,7 +9759,6 @@ async function doStatus(deps) {
9759
9759
  }
9760
9760
  const level = String(info.level ?? "free");
9761
9761
  const quota = Number(info.token_quota ?? 0);
9762
- const used = Number(info.used_token ?? 0);
9763
9762
  return {
9764
9763
  ok: true,
9765
9764
  loggedIn: true,
@@ -9767,9 +9766,6 @@ async function doStatus(deps) {
9767
9766
  level,
9768
9767
  displayName: TIER_NAMES[level] ?? level,
9769
9768
  active: level !== "free" && quota > 0,
9770
- tokenQuota: quota,
9771
- usedToken: used,
9772
- remainToken: Math.max(0, quota - used),
9773
9769
  baseURL: deps.baseURL,
9774
9770
  qr: {
9775
9771
  wechat: `${deps.baseURL}/qrcode/wechat`,
@@ -9804,7 +9800,16 @@ async function doRegister(deps, body) {
9804
9800
  }
9805
9801
  async function doQuote(deps) {
9806
9802
  const cfg = await apiJson(deps.baseURL, "/api/package_config", { timeoutMs: deps.requestTimeoutMs });
9807
- return { ok: true, packages: cfg?.packages ?? {} };
9803
+ const raw = cfg?.packages ?? {};
9804
+ const packages = {};
9805
+ for (const [level, info] of Object.entries(raw)) {
9806
+ packages[level] = {
9807
+ display_name: String(info?.display_name ?? level),
9808
+ month_price: Number(info?.month_price ?? 0),
9809
+ year_price: Number(info?.year_price ?? 0)
9810
+ };
9811
+ }
9812
+ return { ok: true, packages };
9808
9813
  }
9809
9814
  async function doClaim(deps, body) {
9810
9815
  const level = String(body?.level ?? "");
package/lib/panel.js CHANGED
@@ -43,7 +43,6 @@ async function doStatus(deps) {
43
43
  }
44
44
  const level = String(info.level ?? 'free');
45
45
  const quota = Number(info.token_quota ?? 0);
46
- const used = Number(info.used_token ?? 0);
47
46
  return {
48
47
  ok: true,
49
48
  loggedIn: true,
@@ -51,9 +50,6 @@ async function doStatus(deps) {
51
50
  level,
52
51
  displayName: TIER_NAMES[level] ?? level,
53
52
  active: level !== 'free' && quota > 0,
54
- tokenQuota: quota,
55
- usedToken: used,
56
- remainToken: Math.max(0, quota - used),
57
53
  baseURL: deps.baseURL,
58
54
  qr: {
59
55
  wechat: `${deps.baseURL}/qrcode/wechat`,
@@ -93,7 +89,17 @@ async function doRegister(deps, body) {
93
89
  }
94
90
  async function doQuote(deps) {
95
91
  const cfg = await apiJson(deps.baseURL, '/api/package_config', { timeoutMs: deps.requestTimeoutMs });
96
- return { ok: true, packages: cfg?.packages ?? {} };
92
+ // 只向面板暴露档位名称与价格:套餐里的 token 额度属于运营内部参数,不下发到客户端
93
+ const raw = (cfg?.packages ?? {});
94
+ const packages = {};
95
+ for (const [level, info] of Object.entries(raw)) {
96
+ packages[level] = {
97
+ display_name: String(info?.display_name ?? level),
98
+ month_price: Number(info?.month_price ?? 0),
99
+ year_price: Number(info?.year_price ?? 0),
100
+ };
101
+ }
102
+ return { ok: true, packages };
97
103
  }
98
104
  async function doClaim(deps, body) {
99
105
  const level = String(body?.level ?? '');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-totonai",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "ToTonAI AI 中转站账号接入插件:账号登录、65 个模型直连、设置页面板内充值开通会员。账号制,不接触上游 API Key。",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",