ftown 0.25.2 → 0.25.3

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 (71) hide show
  1. package/dist/command-rpc.d.ts +3 -0
  2. package/dist/command-rpc.js +41 -0
  3. package/dist/command-rpc.js.map +1 -1
  4. package/dist/ftown-cli.js +5 -2
  5. package/dist/ftown-cli.js.map +1 -1
  6. package/dist/index.js +3 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/quota/agy.d.ts +16 -0
  9. package/dist/quota/agy.js +287 -0
  10. package/dist/quota/agy.js.map +1 -0
  11. package/dist/quota/annotate.d.ts +5 -0
  12. package/dist/quota/annotate.js +56 -0
  13. package/dist/quota/annotate.js.map +1 -0
  14. package/dist/quota/claude.d.ts +27 -0
  15. package/dist/quota/claude.js +265 -0
  16. package/dist/quota/claude.js.map +1 -0
  17. package/dist/quota/codex.d.ts +25 -0
  18. package/dist/quota/codex.js +378 -0
  19. package/dist/quota/codex.js.map +1 -0
  20. package/dist/quota/format.d.ts +6 -0
  21. package/dist/quota/format.js +113 -0
  22. package/dist/quota/format.js.map +1 -0
  23. package/dist/quota/grok.d.ts +97 -0
  24. package/dist/quota/grok.js +563 -0
  25. package/dist/quota/grok.js.map +1 -0
  26. package/dist/quota/models-agy.d.ts +10 -0
  27. package/dist/quota/models-agy.js +144 -0
  28. package/dist/quota/models-agy.js.map +1 -0
  29. package/dist/quota/models-claude.d.ts +10 -0
  30. package/dist/quota/models-claude.js +227 -0
  31. package/dist/quota/models-claude.js.map +1 -0
  32. package/dist/quota/models-codex.d.ts +18 -0
  33. package/dist/quota/models-codex.js +305 -0
  34. package/dist/quota/models-codex.js.map +1 -0
  35. package/dist/quota/models-grok.d.ts +19 -0
  36. package/dist/quota/models-grok.js +272 -0
  37. package/dist/quota/models-grok.js.map +1 -0
  38. package/dist/quota/models-muse.d.ts +13 -0
  39. package/dist/quota/models-muse.js +200 -0
  40. package/dist/quota/models-muse.js.map +1 -0
  41. package/dist/quota/models-opencode.d.ts +51 -0
  42. package/dist/quota/models-opencode.js +400 -0
  43. package/dist/quota/models-opencode.js.map +1 -0
  44. package/dist/quota/muse.d.ts +38 -0
  45. package/dist/quota/muse.js +225 -0
  46. package/dist/quota/muse.js.map +1 -0
  47. package/dist/quota/opencode.d.ts +7 -0
  48. package/dist/quota/opencode.js +47 -0
  49. package/dist/quota/opencode.js.map +1 -0
  50. package/dist/quota/routing-config.d.ts +18 -0
  51. package/dist/quota/routing-config.js +438 -0
  52. package/dist/quota/routing-config.js.map +1 -0
  53. package/dist/quota/routing-service.d.ts +24 -0
  54. package/dist/quota/routing-service.js +118 -0
  55. package/dist/quota/routing-service.js.map +1 -0
  56. package/dist/quota/routing.d.ts +10 -0
  57. package/dist/quota/routing.js +180 -0
  58. package/dist/quota/routing.js.map +1 -0
  59. package/dist/quota/types.d.ts +304 -0
  60. package/dist/quota/types.js +45 -0
  61. package/dist/quota/types.js.map +1 -0
  62. package/dist/quota-cli.d.ts +80 -0
  63. package/dist/quota-cli.js +462 -0
  64. package/dist/quota-cli.js.map +1 -0
  65. package/dist/security/bridge/permissions.js +4 -2
  66. package/dist/security/bridge/permissions.js.map +1 -1
  67. package/dist/types.d.ts +2 -2
  68. package/package.json +3 -2
  69. package/skills/ftown/SKILL.md +2 -1
  70. package/skills/ftown/references/orchestrator.md +5 -0
  71. package/skills/ftown/references/quota.md +177 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/quota/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ProviderQuota, QuotaFetcher } from './types.js';
2
+ export interface CodexRolloutHit {
3
+ /** The raw `rate_limits` object from the rollout event. */
4
+ rateLimits: unknown;
5
+ /** ISO-8601 instant of the event (file mtime when the event has no timestamp). */
6
+ observedAt: string;
7
+ }
8
+ /**
9
+ * Pure: turns a Codex `rateLimits` object (live RPC result or cached rollout
10
+ * `rate_limits`) into a ProviderQuota. Accepts camelCase and snake_case keys.
11
+ */
12
+ export declare function parseCodexRateLimits(rateLimits: unknown, source: 'live' | 'cached', observedAt: string, now: Date): ProviderQuota;
13
+ /**
14
+ * Finds the most recent `token_count` event carrying non-null `rate_limits`.
15
+ * Examines at most the 5 newest rollout files, newest first, scanning each
16
+ * from its last line. Never throws; missing directories yield null.
17
+ */
18
+ export declare function readLatestCodexRateLimits(sessionsRoot: string): Promise<CodexRolloutHit | null>;
19
+ /** True when an app-server error message describes a login/credential problem. */
20
+ export declare function isCodexAuthError(text: string): boolean;
21
+ /**
22
+ * Codex quota: live app-server RPC first, cached rollout files second.
23
+ * Never rejects and never prints.
24
+ */
25
+ export declare const fetchCodexQuota: QuotaFetcher;
@@ -0,0 +1,378 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFile, readdir, stat } from 'node:fs/promises';
3
+ import { createInterface } from 'node:readline';
4
+ import { join } from 'node:path';
5
+ /**
6
+ * OpenAI Codex subscription-quota provider.
7
+ *
8
+ * PRIMARY: spawn `codex app-server --listen stdio://` and ask it for
9
+ * `account/rateLimits/read` over newline-delimited JSON-RPC.
10
+ * FALLBACK: the newest rollout files under ~/.codex/sessions, where Codex
11
+ * writes `token_count` events that may carry the last-known rate limits.
12
+ *
13
+ * Nothing here prints, and nothing here reads ~/.codex/auth.json.
14
+ */
15
+ const AUTH_MESSAGE = 'Codex login problem: run `codex login`';
16
+ const FIVE_HOUR_CUTOFF_MINUTES = 1440;
17
+ const ROLLOUT_FILE_LIMIT = 5;
18
+ function isRecord(value) {
19
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
20
+ }
21
+ function finiteNumber(value) {
22
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
23
+ }
24
+ function pick(record, camel, snake) {
25
+ return record[camel] ?? record[snake];
26
+ }
27
+ function isoFromUnixSeconds(seconds) {
28
+ if (seconds === null)
29
+ return null;
30
+ const date = new Date(seconds * 1000);
31
+ return Number.isNaN(date.getTime()) ? null : date.toISOString();
32
+ }
33
+ function kindFor(minutes, position) {
34
+ if (minutes === null)
35
+ return position === 'primary' ? 'five_hour' : 'weekly';
36
+ return minutes < FIVE_HOUR_CUTOFF_MINUTES ? 'five_hour' : 'weekly';
37
+ }
38
+ function parseWindow(raw, position, source, now) {
39
+ const windowMinutes = finiteNumber(pick(raw, 'windowDurationMins', 'window_minutes'));
40
+ const resetSeconds = finiteNumber(pick(raw, 'resetsAt', 'resets_at'));
41
+ let usedPercent = finiteNumber(pick(raw, 'usedPercent', 'used_percent'));
42
+ let note = null;
43
+ if (source === 'cached' && resetSeconds !== null && resetSeconds * 1000 <= now.getTime()) {
44
+ usedPercent = null;
45
+ note = 'reset since last Codex turn';
46
+ }
47
+ return {
48
+ kind: kindFor(windowMinutes, position),
49
+ usedPercent,
50
+ resetsAt: isoFromUnixSeconds(resetSeconds),
51
+ windowMinutes,
52
+ note,
53
+ };
54
+ }
55
+ /**
56
+ * Pure: turns a Codex `rateLimits` object (live RPC result or cached rollout
57
+ * `rate_limits`) into a ProviderQuota. Accepts camelCase and snake_case keys.
58
+ */
59
+ export function parseCodexRateLimits(rateLimits, source, observedAt, now) {
60
+ if (!isRecord(rateLimits)) {
61
+ return {
62
+ provider: 'codex',
63
+ status: 'error',
64
+ plan: null,
65
+ windows: [],
66
+ source,
67
+ observedAt,
68
+ message: 'unexpected rate-limit data from Codex',
69
+ };
70
+ }
71
+ const plan = pick(rateLimits, 'planType', 'plan_type');
72
+ const windows = [];
73
+ const seenKinds = new Set();
74
+ for (const position of ['primary', 'secondary']) {
75
+ const raw = rateLimits[position];
76
+ if (!isRecord(raw))
77
+ continue;
78
+ const window = parseWindow(raw, position, source, now);
79
+ if (seenKinds.has(window.kind))
80
+ continue;
81
+ seenKinds.add(window.kind);
82
+ windows.push(window);
83
+ }
84
+ if (windows.length === 0) {
85
+ return {
86
+ provider: 'codex',
87
+ status: 'no_data',
88
+ plan: typeof plan === 'string' && plan !== '' ? plan : null,
89
+ windows,
90
+ source,
91
+ observedAt,
92
+ message: 'Codex reported no rate-limit windows',
93
+ };
94
+ }
95
+ return {
96
+ provider: 'codex',
97
+ status: 'ok',
98
+ plan: typeof plan === 'string' && plan !== '' ? plan : null,
99
+ windows,
100
+ source,
101
+ observedAt,
102
+ message: null,
103
+ };
104
+ }
105
+ function descending(a, b) {
106
+ return a < b ? 1 : a > b ? -1 : 0;
107
+ }
108
+ async function listDirectories(dir) {
109
+ try {
110
+ const entries = await readdir(dir, { withFileTypes: true });
111
+ return entries
112
+ .filter((entry) => entry.isDirectory())
113
+ .map((entry) => entry.name)
114
+ .sort(descending);
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ }
120
+ async function listRolloutFiles(dir) {
121
+ try {
122
+ const entries = await readdir(dir, { withFileTypes: true });
123
+ return entries
124
+ .filter((entry) => entry.isFile() && /^rollout-.*\.jsonl$/.test(entry.name))
125
+ .map((entry) => entry.name)
126
+ .sort(descending);
127
+ }
128
+ catch {
129
+ return [];
130
+ }
131
+ }
132
+ /** Newest-first list of at most `limit` rollout file paths under `sessionsRoot`. */
133
+ async function newestRolloutFiles(sessionsRoot, limit) {
134
+ const files = [];
135
+ for (const year of await listDirectories(sessionsRoot)) {
136
+ const yearDir = join(sessionsRoot, year);
137
+ for (const month of await listDirectories(yearDir)) {
138
+ const monthDir = join(yearDir, month);
139
+ for (const day of await listDirectories(monthDir)) {
140
+ const dayDir = join(monthDir, day);
141
+ for (const name of await listRolloutFiles(dayDir)) {
142
+ files.push(join(dayDir, name));
143
+ if (files.length >= limit)
144
+ return files;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ return files;
150
+ }
151
+ async function scanRolloutFile(path) {
152
+ let text;
153
+ try {
154
+ text = await readFile(path, 'utf8');
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ const lines = text.split('\n');
160
+ for (let index = lines.length - 1; index >= 0; index -= 1) {
161
+ const line = lines[index]?.trim();
162
+ if (!line)
163
+ continue;
164
+ let entry;
165
+ try {
166
+ entry = JSON.parse(line);
167
+ }
168
+ catch {
169
+ continue;
170
+ }
171
+ if (!isRecord(entry) || entry.type !== 'event_msg' || !isRecord(entry.payload))
172
+ continue;
173
+ if (entry.payload.type !== 'token_count')
174
+ continue;
175
+ const rateLimits = entry.payload.rate_limits;
176
+ if (!isRecord(rateLimits))
177
+ continue;
178
+ let observedAt = null;
179
+ if (typeof entry.timestamp === 'string' && !Number.isNaN(Date.parse(entry.timestamp))) {
180
+ observedAt = new Date(entry.timestamp).toISOString();
181
+ }
182
+ if (observedAt === null) {
183
+ try {
184
+ observedAt = (await stat(path)).mtime.toISOString();
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ }
190
+ return { rateLimits, observedAt };
191
+ }
192
+ return null;
193
+ }
194
+ /**
195
+ * Finds the most recent `token_count` event carrying non-null `rate_limits`.
196
+ * Examines at most the 5 newest rollout files, newest first, scanning each
197
+ * from its last line. Never throws; missing directories yield null.
198
+ */
199
+ export async function readLatestCodexRateLimits(sessionsRoot) {
200
+ try {
201
+ for (const path of await newestRolloutFiles(sessionsRoot, ROLLOUT_FILE_LIMIT)) {
202
+ const hit = await scanRolloutFile(path);
203
+ if (hit)
204
+ return hit;
205
+ }
206
+ return null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ class CodexLiveError extends Error {
213
+ reason;
214
+ constructor(reason, message) {
215
+ super(message);
216
+ this.reason = reason;
217
+ }
218
+ }
219
+ const AUTH_ERROR_PATTERN = new RegExp([
220
+ String.raw `\bnot\s+logged\s+in\b`,
221
+ String.raw `\blogged\s+out\b`,
222
+ String.raw `\blog\s+in\b`,
223
+ String.raw `\blogin\b`,
224
+ String.raw `\bsign\s+in\b`,
225
+ String.raw `\bsigned\s+out\b`,
226
+ String.raw `\bunauthori[sz]ed\b`,
227
+ String.raw `\bunauthenticated\b`,
228
+ String.raw `\bauthentication\b`,
229
+ String.raw `\b401\b`,
230
+ String.raw `\bcredentials?\b`,
231
+ String.raw `\btoken\s+expired\b`,
232
+ String.raw `\bexpired\s+token\b`,
233
+ ].join('|'), 'i');
234
+ /** True when an app-server error message describes a login/credential problem. */
235
+ export function isCodexAuthError(text) {
236
+ return AUTH_ERROR_PATTERN.test(text);
237
+ }
238
+ function rpcErrorFrom(error) {
239
+ const text = isRecord(error) && typeof error.message === 'string' ? error.message : '';
240
+ if (isCodexAuthError(text)) {
241
+ return new CodexLiveError('auth', AUTH_MESSAGE);
242
+ }
243
+ return new CodexLiveError('failed', 'codex app-server request failed');
244
+ }
245
+ /**
246
+ * Runs the JSON-RPC handshake against `codex app-server` and resolves with the
247
+ * `account/rateLimits/read` result. Always kills the child before settling.
248
+ */
249
+ function requestLiveRateLimits(timeoutMs) {
250
+ return new Promise((resolve, reject) => {
251
+ let child;
252
+ try {
253
+ child = spawn('codex', ['app-server', '--listen', 'stdio://'], { stdio: ['pipe', 'pipe', 'ignore'] });
254
+ }
255
+ catch {
256
+ reject(new CodexLiveError('failed', 'codex app-server request failed'));
257
+ return;
258
+ }
259
+ let settled = false;
260
+ let timer;
261
+ const lines = createInterface({ input: child.stdout });
262
+ const isRunning = () => child.exitCode === null && child.signalCode === null;
263
+ const finish = (error, value) => {
264
+ if (settled)
265
+ return;
266
+ settled = true;
267
+ if (timer !== undefined)
268
+ clearTimeout(timer);
269
+ lines.close();
270
+ try {
271
+ child.stdin.end();
272
+ }
273
+ catch {
274
+ // stdin already closed; nothing to do.
275
+ }
276
+ if (isRunning()) {
277
+ try {
278
+ child.kill('SIGTERM');
279
+ }
280
+ catch {
281
+ // spawn never produced a process; nothing to kill.
282
+ }
283
+ const forceKill = setTimeout(() => {
284
+ if (isRunning()) {
285
+ try {
286
+ child.kill('SIGKILL');
287
+ }
288
+ catch {
289
+ // already gone.
290
+ }
291
+ }
292
+ }, 1000);
293
+ forceKill.unref();
294
+ }
295
+ if (error)
296
+ reject(error);
297
+ else
298
+ resolve(value);
299
+ };
300
+ const send = (message) => {
301
+ child.stdin.write(`${JSON.stringify(message)}\n`);
302
+ };
303
+ child.on('error', (error) => {
304
+ finish(error.code === 'ENOENT'
305
+ ? new CodexLiveError('missing', 'codex CLI not found')
306
+ : new CodexLiveError('failed', 'codex app-server request failed'));
307
+ });
308
+ child.on('exit', () => {
309
+ finish(new CodexLiveError('failed', 'codex app-server exited before responding'));
310
+ });
311
+ child.stdin.on('error', () => {
312
+ finish(new CodexLiveError('failed', 'codex app-server request failed'));
313
+ });
314
+ lines.on('line', (line) => {
315
+ let message;
316
+ try {
317
+ message = JSON.parse(line);
318
+ }
319
+ catch {
320
+ return;
321
+ }
322
+ if (!isRecord(message))
323
+ return;
324
+ if (message.id === 1) {
325
+ if (message.error !== undefined) {
326
+ finish(rpcErrorFrom(message.error));
327
+ return;
328
+ }
329
+ send({ jsonrpc: '2.0', method: 'initialized' });
330
+ send({ jsonrpc: '2.0', id: 2, method: 'account/rateLimits/read', params: {} });
331
+ }
332
+ else if (message.id === 2) {
333
+ if (message.error !== undefined)
334
+ finish(rpcErrorFrom(message.error));
335
+ else
336
+ finish(null, message.result);
337
+ }
338
+ });
339
+ timer = setTimeout(() => {
340
+ finish(new CodexLiveError('timeout', 'codex app-server timed out'));
341
+ }, timeoutMs);
342
+ send({
343
+ jsonrpc: '2.0',
344
+ id: 1,
345
+ method: 'initialize',
346
+ params: { clientInfo: { name: 'ftown-quota', version: '1.0.0' } },
347
+ });
348
+ });
349
+ }
350
+ /**
351
+ * Codex quota: live app-server RPC first, cached rollout files second.
352
+ * Never rejects and never prints.
353
+ */
354
+ export const fetchCodexQuota = async (options) => {
355
+ const now = options.now();
356
+ let primary;
357
+ try {
358
+ const result = await requestLiveRateLimits(options.timeoutMs);
359
+ const rateLimits = isRecord(result) ? result.rateLimits : undefined;
360
+ return parseCodexRateLimits(rateLimits, 'live', now.toISOString(), now);
361
+ }
362
+ catch (error) {
363
+ primary = error instanceof CodexLiveError ? error : new CodexLiveError('failed', 'codex app-server request failed');
364
+ }
365
+ const hit = await readLatestCodexRateLimits(join(options.homeDir, '.codex', 'sessions'));
366
+ if (hit)
367
+ return parseCodexRateLimits(hit.rateLimits, 'cached', hit.observedAt, now);
368
+ return {
369
+ provider: 'codex',
370
+ status: primary.reason === 'auth' ? 'auth' : 'unavailable',
371
+ plan: null,
372
+ windows: [],
373
+ source: 'live',
374
+ observedAt: now.toISOString(),
375
+ message: primary.message,
376
+ };
377
+ };
378
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/quota/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { QuotaStatus, QuotaTableFormatter, QuotaWindow } from './types.js';
2
+ /** Human duration: "6d 14h", "2h 0m", "59m", or "<1m" below a minute. */
3
+ export declare function formatDuration(ms: number): string;
4
+ /** Cell text for one window column (5H LEFT or WEEKLY LEFT). */
5
+ export declare function formatWindowCell(window: QuotaWindow | undefined, status: QuotaStatus, now: Date): string;
6
+ export declare const formatQuotaTable: QuotaTableFormatter;
@@ -0,0 +1,113 @@
1
+ const MINUTE_MS = 60_000;
2
+ const HOUR_MS = 60 * MINUTE_MS;
3
+ const DAY_MS = 24 * HOUR_MS;
4
+ const HEADERS = ['PROVIDER', 'PLAN', '5H LEFT', 'WEEKLY LEFT', 'SOURCE'];
5
+ /** Human duration: "6d 14h", "2h 0m", "59m", or "<1m" below a minute. */
6
+ export function formatDuration(ms) {
7
+ if (!Number.isFinite(ms) || ms < 0)
8
+ return '<1m';
9
+ if (ms >= DAY_MS) {
10
+ const days = Math.floor(ms / DAY_MS);
11
+ const hours = Math.floor((ms % DAY_MS) / HOUR_MS);
12
+ return `${days}d ${hours}h`;
13
+ }
14
+ if (ms >= HOUR_MS) {
15
+ const hours = Math.floor(ms / HOUR_MS);
16
+ const minutes = Math.floor((ms % HOUR_MS) / MINUTE_MS);
17
+ return `${hours}h ${minutes}m`;
18
+ }
19
+ if (ms >= MINUTE_MS) {
20
+ return `${Math.floor(ms / MINUTE_MS)}m`;
21
+ }
22
+ return '<1m';
23
+ }
24
+ function statusOnlyCell(status) {
25
+ switch (status) {
26
+ case 'ok':
27
+ return '-';
28
+ case 'no_data':
29
+ return 'no data';
30
+ case 'auth':
31
+ return 'login needed';
32
+ case 'unavailable':
33
+ return 'unavailable';
34
+ case 'error':
35
+ return 'error';
36
+ }
37
+ }
38
+ /** Cell text for one window column (5H LEFT or WEEKLY LEFT). */
39
+ export function formatWindowCell(window, status, now) {
40
+ if (window === undefined)
41
+ return statusOnlyCell(status);
42
+ const used = window.usedPercent;
43
+ const hasUsed = used !== null && Number.isFinite(used);
44
+ const note = window.note?.trim() ?? '';
45
+ let text;
46
+ if (hasUsed) {
47
+ const left = Math.min(100, Math.max(0, 100 - used));
48
+ text = `${Math.round(left)}%`;
49
+ }
50
+ else if (note.length > 0) {
51
+ text = note;
52
+ }
53
+ else {
54
+ text = '?';
55
+ }
56
+ if (window.resetsAt !== null) {
57
+ const resetMs = Date.parse(window.resetsAt);
58
+ if (!Number.isNaN(resetMs)) {
59
+ const nowMs = now.getTime();
60
+ text +=
61
+ resetMs > nowMs
62
+ ? ` (resets in ${formatDuration(resetMs - nowMs)})`
63
+ : ' (reset due)';
64
+ }
65
+ }
66
+ return text;
67
+ }
68
+ function sourceCell(row, now) {
69
+ if (row.source === 'live')
70
+ return 'live';
71
+ const observedMs = Date.parse(row.observedAt);
72
+ if (Number.isNaN(observedMs))
73
+ return 'cached';
74
+ return `cached ${formatDuration(now.getTime() - observedMs)} ago`;
75
+ }
76
+ function planCell(plan) {
77
+ return plan !== null && plan.trim().length > 0 ? plan : '-';
78
+ }
79
+ function padRight(text, width) {
80
+ return text.length >= width ? text : text + ' '.repeat(width - text.length);
81
+ }
82
+ function renderLines(cells) {
83
+ const widths = HEADERS.map((_, col) => Math.max(...cells.map((row) => row[col].length)));
84
+ return cells.map((row) => row
85
+ .map((cell, col) => (col === row.length - 1 ? cell : padRight(cell, widths[col])))
86
+ .join(' ')
87
+ .trimEnd());
88
+ }
89
+ export const formatQuotaTable = (rows, now) => {
90
+ const body = rows.map((row) => {
91
+ const fiveHour = row.windows.find((w) => w.kind === 'five_hour');
92
+ const weekly = row.windows.find((w) => w.kind === 'weekly');
93
+ return [
94
+ row.provider,
95
+ planCell(row.plan),
96
+ formatWindowCell(fiveHour, row.status, now),
97
+ formatWindowCell(weekly, row.status, now),
98
+ sourceCell(row, now),
99
+ ];
100
+ });
101
+ const lines = renderLines([[...HEADERS], ...body]);
102
+ const messages = [];
103
+ for (const row of rows) {
104
+ const message = row.message?.trim() ?? '';
105
+ if (message.length > 0)
106
+ messages.push(`${row.provider}: ${message}`);
107
+ }
108
+ if (messages.length > 0) {
109
+ lines.push('', ...messages);
110
+ }
111
+ return lines.join('\n');
112
+ };
113
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/quota/format.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC;AAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC;AAE5B,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAU,CAAC;AAElF,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC;QAClD,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;IAC9B,CAAC;IACD,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;QACvD,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;IACjC,CAAC;IACD,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;QACpB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IACzC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,IAAI;YACP,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,cAAc,CAAC;QACxB,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAC9B,MAA+B,EAC/B,MAAmB,EACnB,GAAS;IAET,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEvC,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QACpD,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAChC,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI;gBACF,OAAO,GAAG,KAAK;oBACb,CAAC,CAAC,eAAe,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG;oBACnD,CAAC,CAAC,cAAc,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,GAAkB,EAAE,GAAS;IAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,OAAO,UAAU,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,IAAmB;IACnC,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,KAAqC;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACvB,GAAG;SACA,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACjF,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,EAAE,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACjE,MAAM,IAAI,GAAe,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC5D,OAAO;YACL,GAAG,CAAC,QAAQ;YACZ,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAClB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;YAC3C,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;YACzC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}