@jeffreycao/copilot-api 2.7.13 → 2.7.14

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
@@ -30,7 +30,7 @@ if (isMcpFastPath(process.argv)) {
30
30
  const { auth } = await import("./auth-1hGXVwvW.js");
31
31
  const { debug } = await import("./debug-BPNjSHgl.js");
32
32
  const { mcp } = await import("./mcp-Dd_hxxuG.js");
33
- const { start } = await import("./start-Mpyr_cO_.js");
33
+ const { start } = await import("./start-COhhmcdU.js");
34
34
  const { provider } = await import("./provider-Dg-3-rrN.js");
35
35
  await runMain(defineCommand({
36
36
  meta: {
@@ -988,6 +988,55 @@ function getModelCostMap(db, range) {
988
988
  }
989
989
  return costMap;
990
990
  }
991
+ function getSessionSummaries(db, range, limit, offset) {
992
+ const rows = db.prepare(`
993
+ SELECT
994
+ session_id,
995
+ COUNT(*) AS request_count,
996
+ COALESCE(SUM(input_tokens), 0) AS input_tokens,
997
+ COALESCE(SUM(output_tokens), 0) AS output_tokens,
998
+ COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,
999
+ COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,
1000
+ SUM(total_nano_aiu) AS total_nano_aiu,
1001
+ COALESCE(SUM(total_tokens), 0) AS total_tokens
1002
+ FROM token_usage_events
1003
+ WHERE created_at_ms >= ? AND created_at_ms < ?
1004
+ GROUP BY session_id
1005
+ ORDER BY total_tokens DESC, session_id ASC
1006
+ LIMIT ? OFFSET ?
1007
+ `).all(range.startMs, range.endMs, limit, offset);
1008
+ const sessionIds = rows.map((row) => stringFromRow(row, "session_id"));
1009
+ const costRows = db.prepare(`
1010
+ SELECT
1011
+ session_id,
1012
+ cost_currency,
1013
+ COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos
1014
+ FROM token_usage_events
1015
+ WHERE
1016
+ created_at_ms >= ?
1017
+ AND created_at_ms < ?
1018
+ AND session_id IN (${sessionIds.map(() => "?").join(", ")})
1019
+ AND cost_currency IS NOT NULL
1020
+ AND total_cost_nanos IS NOT NULL
1021
+ GROUP BY session_id, cost_currency
1022
+ ORDER BY session_id ASC, cost_currency ASC
1023
+ `).all(range.startMs, range.endMs, ...sessionIds);
1024
+ const costMap = /* @__PURE__ */ new Map();
1025
+ for (const row of costRows) {
1026
+ const cost = costFromRow(row);
1027
+ if (cost) {
1028
+ const id = stringFromRow(row, "session_id");
1029
+ costMap.set(id, [...costMap.get(id) ?? [], cost]);
1030
+ }
1031
+ }
1032
+ return rows.map((row) => {
1033
+ const session_id = stringFromRow(row, "session_id");
1034
+ return {
1035
+ ...totalsFromRow(row, costMap.get(session_id) ?? []),
1036
+ session_id
1037
+ };
1038
+ });
1039
+ }
991
1040
  function getModelSummaries(db, range) {
992
1041
  const costMap = getModelCostMap(db, range);
993
1042
  return getModelRows(db, range).map((row) => {
@@ -1152,6 +1201,31 @@ async function getTokenUsageEventsPage(input) {
1152
1201
  total_pages: Math.max(1, Math.ceil(total / pageSize))
1153
1202
  };
1154
1203
  }
1204
+ async function getTokenUsageSessionsPage(input) {
1205
+ const page = Math.max(1, Math.floor(input.page));
1206
+ const pageSize = Math.min(100, Math.max(1, Math.floor(input.pageSize)));
1207
+ if (!isTokenUsageStorageEnabled()) return {
1208
+ ...createEmptyEventsPage(input),
1209
+ items: []
1210
+ };
1211
+ await flushTokenUsageEvents();
1212
+ const db = await getDb();
1213
+ const range = getPeriodRangeFromDb(db, input.period);
1214
+ const total = numberFromRow(db.prepare(`
1215
+ SELECT COUNT(DISTINCT session_id) AS total
1216
+ FROM token_usage_events
1217
+ WHERE created_at_ms >= ? AND created_at_ms < ?
1218
+ `).get(range.startMs, range.endMs), "total");
1219
+ return {
1220
+ items: getSessionSummaries(db, range, pageSize, (page - 1) * pageSize),
1221
+ page,
1222
+ page_size: pageSize,
1223
+ period: input.period,
1224
+ range: rangePayload(range),
1225
+ total,
1226
+ total_pages: Math.max(1, Math.ceil(total / pageSize))
1227
+ };
1228
+ }
1155
1229
  async function closeUsageStore() {
1156
1230
  await flushTokenUsageEvents();
1157
1231
  await tokenUsageDbStore.close({ beforeClose: (db) => {
@@ -12911,15 +12985,15 @@ tokenUsageRoute.get("/daily", async (c) => {
12911
12985
  const summary = await getTokenUsageDailySummary(parsePeriod(c.req.query("period")));
12912
12986
  return c.json(summary);
12913
12987
  });
12914
- tokenUsageRoute.get("/events", async (c) => {
12915
- const period = parsePeriod(c.req.query("period"));
12916
- const eventsPage = await getTokenUsageEventsPage({
12988
+ function parsePageQuery(c) {
12989
+ return {
12990
+ period: parsePeriod(c.req.query("period")),
12917
12991
  page: parsePositiveInt(c.req.query("page"), 1),
12918
- pageSize: parsePositiveInt(c.req.query("page_size"), DEFAULT_EVENTS_PAGE_SIZE),
12919
- period
12920
- });
12921
- return c.json(eventsPage);
12922
- });
12992
+ pageSize: parsePositiveInt(c.req.query("page_size"), DEFAULT_EVENTS_PAGE_SIZE)
12993
+ };
12994
+ }
12995
+ tokenUsageRoute.get("/events", async (c) => c.json(await getTokenUsageEventsPage(parsePageQuery(c))));
12996
+ tokenUsageRoute.get("/sessions", async (c) => c.json(await getTokenUsageSessionsPage(parsePageQuery(c))));
12923
12997
  //#endregion
12924
12998
  //#region src/routes/usage/route.ts
12925
12999
  const usageRoute = new Hono();
@@ -13000,4 +13074,4 @@ createServer();
13000
13074
  //#endregion
13001
13075
  export { createServer };
13002
13076
 
13003
- //# sourceMappingURL=server-DqfE4x5m.js.map
13077
+ //# sourceMappingURL=server-CeyKV5sQ.js.map