(input: {
provider: Provider.Info
sessionID?: string
timePeriod?: TimePeriod
})
| 162 | } |
| 163 | |
| 164 | async function fetchSessionUsage(input: { |
| 165 | provider: Provider.Info |
| 166 | sessionID?: string |
| 167 | timePeriod?: TimePeriod |
| 168 | }): Promise<Omit<Record, "providerID" | "providerName" | "fetchedAt">> { |
| 169 | const timePeriod = input.timePeriod ?? "session" |
| 170 | const now = Date.now() |
| 171 | |
| 172 | // Calculate time boundaries |
| 173 | const timeFilter = getTimeFilter(timePeriod, now) |
| 174 | |
| 175 | let inputTokens = 0 |
| 176 | let outputTokens = 0 |
| 177 | let cacheReadTokens = 0 |
| 178 | let cacheCreationTokens = 0 |
| 179 | let found = false |
| 180 | let inspectedMessages = 0 |
| 181 | let modelID: string | undefined |
| 182 | let limitSummary: |
| 183 | | { |
| 184 | planType?: string |
| 185 | allowed?: boolean |
| 186 | limitReached?: boolean |
| 187 | limits?: { primary?: RateLimitWindowSummary } |
| 188 | } |
| 189 | | undefined |
| 190 | let limitError: string | undefined |
| 191 | |
| 192 | // For session mode, require sessionID |
| 193 | if (timePeriod === "session" && !input.sessionID) { |
| 194 | // We can still fetch usage limits for z.ai even without session context. |
| 195 | if (input.provider.id !== "zai-coding-plan") { |
| 196 | return {} |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | // Get messages to scan (avoid scanning all sessions when sessionID is missing) |
| 201 | let messageKeys: string[][] = [] |
| 202 | if (timePeriod === "session") { |
| 203 | if (input.sessionID) { |
| 204 | messageKeys = await Storage.list(["message", input.sessionID]) |
| 205 | } |
| 206 | } else { |
| 207 | // For time-based queries, scan all sessions |
| 208 | const allSessions = await Storage.list(["message"]) |
| 209 | messageKeys = allSessions |
| 210 | } |
| 211 | |
| 212 | for (const messageKey of messageKeys) { |
| 213 | const msg = await Storage.read<MessageV2.Info>(messageKey) |
| 214 | |
| 215 | // Filter by provider - match exact provider ID (including connection) |
| 216 | if (msg.role !== "assistant" || msg.providerID !== input.provider.id || !msg.tokens) { |
| 217 | continue |
| 218 | } |
| 219 | |
| 220 | // Filter by time period |
| 221 | const messageTime = msg.time?.completed ?? msg.time?.created |
no test coverage detected