balance-dsh 1.0.9 → 1.0.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/index.js +32 -13
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -401,16 +401,35 @@ function recentDayKeys(days, now = Date.now()) {
401
401
  }
402
402
 
403
403
  async function buildUsageStats(ctx, config) {
404
- const persistence = typeof ctx.get === "function" ? ctx.get("sessionPersistence") : void 0;
405
- if (persistence == null || typeof persistence.list !== "function" || typeof persistence.inspect !== "function") {
406
- throw new Error("会话持久化服务不可用");
407
- }
404
+ const getService = typeof ctx.get === "function" ? ctx.get.bind(ctx) : null;
405
+ const controller = getService?.("sessionController");
406
+ const persistence = getService?.("sessionPersistence");
408
407
  const now = Date.now();
409
408
  const cutoffMs = now - (STATS_DAYS - 1) * 24 * 60 * 60 * 1000;
410
- const headers = await persistence.list();
411
- const selected = [...headers]
412
- .filter((header) => header && typeof header.id === "string")
413
- .sort((a, b) => Number(b.createdAt ?? 0) - Number(a.createdAt ?? 0))
409
+ // 列举会话要跨 DSH 版本:新版 sessionController.list() 返回 { items:[{ sessionId, updatedAt }] }
410
+ // (已按活动降序,字段叫 sessionId);旧版 sessionPersistence.list() 返回 [{ id, createdAt }]
411
+ // (字段叫 id)。旧版 persistence 还提供 inspect(),新版改成 handle-based 的 open(),
412
+ // 所以读取一律走已做三级兼容的 inspectPersistedSession,不再直接调 persistence.inspect。
413
+ let sessionIds = [];
414
+ let availableSessions = 0;
415
+ if (typeof controller?.list === "function") {
416
+ const listed = await controller.list({});
417
+ const items = Array.isArray(listed) ? listed : (listed?.items ?? []);
418
+ sessionIds = items.map((item) => (item && typeof item === "object" ? item.sessionId ?? item.id : void 0));
419
+ availableSessions = sessionIds.length;
420
+ } else if (typeof persistence?.list === "function") {
421
+ const headers = await persistence.list();
422
+ const list = Array.isArray(headers) ? headers : [];
423
+ availableSessions = list.length;
424
+ sessionIds = [...list]
425
+ .filter((header) => header && typeof header.id === "string")
426
+ .sort((a, b) => Number(b.createdAt ?? 0) - Number(a.createdAt ?? 0))
427
+ .map((header) => header.id);
428
+ } else {
429
+ throw new Error("会话持久化服务不可用");
430
+ }
431
+ const selected = sessionIds
432
+ .filter((id) => typeof id === "string" && id !== "")
414
433
  .slice(0, STATS_MAX_SESSIONS);
415
434
  const daily = new Map();
416
435
  let cursor = 0;
@@ -418,16 +437,16 @@ async function buildUsageStats(ctx, config) {
418
437
  let failedSessions = 0;
419
438
  const worker = async () => {
420
439
  while (cursor < selected.length) {
421
- const header = selected[cursor++];
440
+ const sessionId = selected[cursor++];
422
441
  try {
423
- const inspected = await persistence.inspect(header.id);
442
+ const inspected = await inspectPersistedSession(ctx, sessionId);
424
443
  collectDailyUsage(
425
444
  inspected?.events ?? [],
426
445
  config,
427
446
  detectModel({ requestHeader: () => void 0, requestContext: () => void 0, events: inspected?.events ?? [] }),
428
447
  cutoffMs,
429
448
  daily,
430
- header.id,
449
+ sessionId,
431
450
  );
432
451
  scannedSessions++;
433
452
  } catch {
@@ -468,8 +487,8 @@ async function buildUsageStats(ctx, config) {
468
487
  rangeDays: STATS_DAYS,
469
488
  scannedSessions,
470
489
  failedSessions,
471
- availableSessions: headers.length,
472
- limited: headers.length > selected.length,
490
+ availableSessions,
491
+ limited: availableSessions > selected.length,
473
492
  generatedAt: now,
474
493
  };
475
494
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "balance-dsh",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "查询 DeepSeek 余额并显示当前会话 token 消耗。DeepSeek 账户余额 + 会话 token/费用显示,含高峰/空闲峰谷计费。",
5
5
  "author": "Rannist",
6
6
  "type": "module",