@jeffreycao/copilot-api 1.10.0 → 1.10.1

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/dist/main.js CHANGED
@@ -42,7 +42,7 @@ bindElectronFetch();
42
42
  const { auth } = await import("./auth-D7YCTWpx.js");
43
43
  const { checkUsage } = await import("./check-usage-Dgg0nNEw.js");
44
44
  const { debug } = await import("./debug-C_TBkyUw.js");
45
- const { start } = await import("./start-1KA2mHVS.js");
45
+ const { start } = await import("./start-DDII-0ML.js");
46
46
  await runMain(defineCommand({
47
47
  meta: {
48
48
  name: "copilot-api",
@@ -504,19 +504,14 @@ async function flushTokenUsageEvents() {
504
504
  }
505
505
  function getPeriodRange(period, now = /* @__PURE__ */ new Date()) {
506
506
  const start = new Date(now);
507
+ start.setHours(0, 0, 0, 0);
507
508
  switch (period) {
508
- case "day":
509
- start.setHours(0, 0, 0, 0);
510
- break;
511
- case "week": {
512
- const daysSinceMonday = (start.getDay() + 6) % 7;
513
- start.setDate(start.getDate() - daysSinceMonday);
514
- start.setHours(0, 0, 0, 0);
509
+ case "day": break;
510
+ case "week":
511
+ start.setDate(start.getDate() - 6);
515
512
  break;
516
- }
517
513
  case "month":
518
- start.setDate(1);
519
- start.setHours(0, 0, 0, 0);
514
+ start.setDate(start.getDate() - 29);
520
515
  break;
521
516
  default: break;
522
517
  }
@@ -529,7 +524,7 @@ function getPeriodRange(period, now = /* @__PURE__ */ new Date()) {
529
524
  end.setDate(end.getDate() + 7);
530
525
  break;
531
526
  case "month":
532
- end.setMonth(end.getMonth() + 1);
527
+ end.setDate(end.getDate() + 30);
533
528
  break;
534
529
  default: break;
535
530
  }
@@ -538,6 +533,26 @@ function getPeriodRange(period, now = /* @__PURE__ */ new Date()) {
538
533
  startMs: start.getTime()
539
534
  };
540
535
  }
536
+ function formatLocalDate(date) {
537
+ return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`;
538
+ }
539
+ function createDailyIntervals(range) {
540
+ const intervals = [];
541
+ const cursor = new Date(range.startMs);
542
+ while (cursor.getTime() < range.endMs) {
543
+ const startMs = cursor.getTime();
544
+ const next = new Date(cursor);
545
+ next.setDate(next.getDate() + 1);
546
+ const endMs = Math.min(next.getTime(), range.endMs);
547
+ intervals.push({
548
+ date: formatLocalDate(cursor),
549
+ endMs,
550
+ startMs
551
+ });
552
+ cursor.setTime(endMs);
553
+ }
554
+ return intervals;
555
+ }
541
556
  function createEmptyTotals() {
542
557
  return {
543
558
  cache_creation_input_tokens: 0,
@@ -548,6 +563,14 @@ function createEmptyTotals() {
548
563
  total_tokens: 0
549
564
  };
550
565
  }
566
+ function addTotals(target, next) {
567
+ target.cache_creation_input_tokens += next.cache_creation_input_tokens;
568
+ target.cache_read_input_tokens += next.cache_read_input_tokens;
569
+ target.input_tokens += next.input_tokens;
570
+ target.output_tokens += next.output_tokens;
571
+ target.request_count += next.request_count;
572
+ target.total_tokens += next.total_tokens;
573
+ }
551
574
  function createEmptySummary(period) {
552
575
  const range = getPeriodRange(period);
553
576
  return {
@@ -562,6 +585,27 @@ function createEmptySummary(period) {
562
585
  totals: createEmptyTotals()
563
586
  };
564
587
  }
588
+ function createEmptyDailySummary(period) {
589
+ const range = getPeriodRange(period);
590
+ return {
591
+ byModel: [],
592
+ days: createDailyIntervals(range).map((interval) => ({
593
+ byModel: [],
594
+ date: interval.date,
595
+ end_ms: interval.endMs,
596
+ start_ms: interval.startMs,
597
+ totals: createEmptyTotals()
598
+ })),
599
+ period,
600
+ range: {
601
+ end_ms: range.endMs,
602
+ end_utc: new Date(range.endMs).toISOString(),
603
+ start_ms: range.startMs,
604
+ start_utc: new Date(range.startMs).toISOString()
605
+ },
606
+ totals: createEmptyTotals()
607
+ };
608
+ }
565
609
  function createEmptyEventsPage(input) {
566
610
  const range = getPeriodRange(input.period);
567
611
  return {
@@ -579,6 +623,14 @@ function createEmptyEventsPage(input) {
579
623
  total_pages: 1
580
624
  };
581
625
  }
626
+ function rangePayload(range) {
627
+ return {
628
+ end_ms: range.endMs,
629
+ end_utc: new Date(range.endMs).toISOString(),
630
+ start_ms: range.startMs,
631
+ start_utc: new Date(range.startMs).toISOString()
632
+ };
633
+ }
582
634
  function numberFromRow(row, key) {
583
635
  const value = row?.[key];
584
636
  return typeof value === "number" && Number.isFinite(value) ? value : 0;
@@ -593,6 +645,12 @@ function totalsFromRow(row) {
593
645
  total_tokens: numberFromRow(row, "total_tokens")
594
646
  };
595
647
  }
648
+ function modelSummaryFromRow(row) {
649
+ return {
650
+ ...totalsFromRow(row),
651
+ model: typeof row.model === "string" ? row.model : "unknown"
652
+ };
653
+ }
596
654
  function stringFromRow(row, key) {
597
655
  const value = row[key];
598
656
  return typeof value === "string" ? value : "";
@@ -620,12 +678,8 @@ function usageEventFromRow(row) {
620
678
  user_id: stringFromRow(row, "user_id")
621
679
  };
622
680
  }
623
- async function getTokenUsageSummary(period) {
624
- if (!isTokenUsageStorageEnabled()) return createEmptySummary(period);
625
- await flushTokenUsageEvents();
626
- const range = getPeriodRange(period);
627
- const db = await getDb();
628
- const totalsRow = db.prepare(`
681
+ function getTotalsRow(db, range) {
682
+ return db.prepare(`
629
683
  SELECT
630
684
  COUNT(*) AS request_count,
631
685
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
@@ -636,8 +690,9 @@ async function getTokenUsageSummary(period) {
636
690
  FROM token_usage_events
637
691
  WHERE created_at_ms >= ? AND created_at_ms < ?
638
692
  `).get(range.startMs, range.endMs);
639
- return {
640
- byModel: db.prepare(`
693
+ }
694
+ function getModelRows(db, range) {
695
+ return db.prepare(`
641
696
  SELECT
642
697
  model,
643
698
  COUNT(*) AS request_count,
@@ -652,20 +707,47 @@ async function getTokenUsageSummary(period) {
652
707
  ORDER BY
653
708
  total_tokens DESC,
654
709
  model ASC
655
- `).all(range.startMs, range.endMs).map((row) => ({
656
- ...totalsFromRow(row),
657
- model: typeof row.model === "string" ? row.model : "unknown"
658
- })),
710
+ `).all(range.startMs, range.endMs);
711
+ }
712
+ function createDailyBucket(interval, rows) {
713
+ const byModel = rows.map((row) => modelSummaryFromRow(row));
714
+ const totals = createEmptyTotals();
715
+ for (const model of byModel) addTotals(totals, model);
716
+ return {
717
+ byModel,
718
+ date: interval.date,
719
+ end_ms: interval.endMs,
720
+ start_ms: interval.startMs,
721
+ totals
722
+ };
723
+ }
724
+ async function getTokenUsageSummary(period) {
725
+ if (!isTokenUsageStorageEnabled()) return createEmptySummary(period);
726
+ await flushTokenUsageEvents();
727
+ const range = getPeriodRange(period);
728
+ const db = await getDb();
729
+ const totalsRow = getTotalsRow(db, range);
730
+ return {
731
+ byModel: getModelRows(db, range).map((row) => modelSummaryFromRow(row)),
659
732
  period,
660
- range: {
661
- end_ms: range.endMs,
662
- end_utc: new Date(range.endMs).toISOString(),
663
- start_ms: range.startMs,
664
- start_utc: new Date(range.startMs).toISOString()
665
- },
733
+ range: rangePayload(range),
666
734
  totals: totalsFromRow(totalsRow)
667
735
  };
668
736
  }
737
+ async function getTokenUsageDailySummary(period) {
738
+ if (!isTokenUsageStorageEnabled()) return createEmptyDailySummary(period);
739
+ await flushTokenUsageEvents();
740
+ const range = getPeriodRange(period);
741
+ const db = await getDb();
742
+ const intervals = createDailyIntervals(range);
743
+ return {
744
+ byModel: getModelRows(db, range).map((row) => modelSummaryFromRow(row)),
745
+ days: intervals.map((interval) => createDailyBucket(interval, getModelRows(db, interval))),
746
+ period,
747
+ range: rangePayload(range),
748
+ totals: totalsFromRow(getTotalsRow(db, range))
749
+ };
750
+ }
669
751
  async function getTokenUsageEventsPage(input) {
670
752
  if (!isTokenUsageStorageEnabled()) return createEmptyEventsPage(input);
671
753
  await flushTokenUsageEvents();
@@ -4580,6 +4662,10 @@ tokenUsageRoute.get("/", async (c) => {
4580
4662
  const summary = await getTokenUsageSummary(parsePeriod(c.req.query("period")));
4581
4663
  return c.json(summary);
4582
4664
  });
4665
+ tokenUsageRoute.get("/daily", async (c) => {
4666
+ const summary = await getTokenUsageDailySummary(parsePeriod(c.req.query("period")));
4667
+ return c.json(summary);
4668
+ });
4583
4669
  tokenUsageRoute.get("/events", async (c) => {
4584
4670
  const period = parsePeriod(c.req.query("period"));
4585
4671
  const eventsPage = await getTokenUsageEventsPage({
@@ -4649,4 +4735,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
4649
4735
  //#endregion
4650
4736
  export { server };
4651
4737
 
4652
- //# sourceMappingURL=server-BnKth1Jp.js.map
4738
+ //# sourceMappingURL=server-DpVPS3zt.js.map