@frogbotai/plugin-usage-reports 0.29.0 → 0.31.0

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/README.md CHANGED
@@ -15,9 +15,9 @@ export default buildConfig({
15
15
  });
16
16
  ```
17
17
 
18
- The plugin adds a Usage Analytics admin view with the Firmware date range control and sortable Models and Users tables. Reports page through the marker-resolved usage collection with Payload's local API and aggregate in memory, so SQLite, PostgreSQL, and MongoDB use the same path.
18
+ The plugin adds a Usage Analytics admin view with the Firmware date range control and sortable Models and Users tables. Reports page through the marker-resolved usage collection with FrogBot's Local API and aggregate in memory, so SQLite, PostgreSQL, and MongoDB use the same path.
19
19
 
20
- The usage-log list gains Payload's experimental visual grouping. Set `pageSize` to change the local API batch size from its default of `5000`. For CSV export of raw usage rows, add `@frogbotai/plugin-import-export` to `plugins` and target the usage collection:
20
+ The usage-log list gains experimental visual grouping. Set `pageSize` to change the local API batch size from its default of `5000`. For CSV export of raw usage rows, add `@frogbotai/plugin-import-export` to `plugins` and target the usage collection:
21
21
 
22
22
  ```ts
23
23
  plugins: [
@@ -1 +1 @@
1
- {"version":3,"file":"UsageReports.d.ts","sourceRoot":"","sources":["../../src/client/UsageReports.tsx"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;AAoDtB,wBAAgB,YAAY,4CAkM3B"}
1
+ {"version":3,"file":"UsageReports.d.ts","sourceRoot":"","sources":["../../src/client/UsageReports.tsx"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;AAwDtB,wBAAgB,YAAY,4CA+M3B"}
@@ -1,18 +1,32 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import './styles.css';
4
- import { useConfig } from '@payloadcms/ui';
4
+ import { useConfig, useTranslation } from '@payloadcms/ui';
5
+ import { formatMoney } from 'frogbot/fields';
5
6
  import { useEffect, useState } from 'react';
6
7
  const presets = [
7
- { label: 'Last 7 days', days: 7 },
8
- { label: 'Last 30 days', days: 30 },
9
- { label: 'Last 90 days', days: 90 },
8
+ {
9
+ label: 'Last 7 days',
10
+ days: 7
11
+ },
12
+ {
13
+ label: 'Last 30 days',
14
+ days: 30
15
+ },
16
+ {
17
+ label: 'Last 90 days',
18
+ days: 90
19
+ }
10
20
  ];
11
21
  function rangeForDays(days, label) {
12
22
  const to = new Date();
13
23
  const from = new Date(to);
14
24
  from.setUTCDate(from.getUTCDate() - days);
15
- return { from: from.toISOString(), to: to.toISOString(), label };
25
+ return {
26
+ from: from.toISOString(),
27
+ to: to.toISOString(),
28
+ label
29
+ };
16
30
  }
17
31
  function dateInput(value) {
18
32
  return value.slice(0, 10);
@@ -21,22 +35,20 @@ function customRange(from, to) {
21
35
  return {
22
36
  from: new Date(`${from}T00:00:00.000Z`).toISOString(),
23
37
  to: new Date(`${to}T23:59:59.999Z`).toISOString(),
24
- label: `${from} - ${to}`,
38
+ label: `${from} - ${to}`
25
39
  };
26
40
  }
27
41
  function formatTokens(value) {
28
- if (value >= 1_000_000_000)
29
- return `${(value / 1_000_000_000).toFixed(1)}B`;
30
- if (value >= 1_000_000)
31
- return `${(value / 1_000_000).toFixed(1)}M`;
32
- if (value >= 1_000)
33
- return `${(value / 1_000).toFixed(1)}K`;
42
+ if (value >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(1)}B`;
43
+ if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;
44
+ if (value >= 1_000) return `${(value / 1_000).toFixed(1)}K`;
34
45
  return value.toLocaleString();
35
46
  }
36
47
  export function UsageReports() {
37
48
  const { config } = useConfig();
49
+ const { i18n } = useTranslation();
38
50
  const [groupBy, setGroupBy] = useState('model');
39
- const [range, setRange] = useState(() => rangeForDays(30, 'Last 30 days'));
51
+ const [range, setRange] = useState(()=>rangeForDays(30, 'Last 30 days'));
40
52
  const [showCustom, setShowCustom] = useState(false);
41
53
  const [customFrom, setCustomFrom] = useState(dateInput(range.from));
42
54
  const [customTo, setCustomTo] = useState(dateInput(range.to));
@@ -45,70 +57,263 @@ export function UsageReports() {
45
57
  const [loading, setLoading] = useState(true);
46
58
  const [sortField, setSortField] = useState(groupBy === 'model' ? 'totalTokens' : 'costUSD');
47
59
  const [ascending, setAscending] = useState(false);
48
- useEffect(() => {
60
+ useEffect(()=>{
49
61
  const controller = new AbortController();
50
- const params = new URLSearchParams({ groupBy, from: range.from, to: range.to });
62
+ const params = new URLSearchParams({
63
+ groupBy,
64
+ from: range.from,
65
+ to: range.to
66
+ });
51
67
  setLoading(true);
52
68
  setError(undefined);
53
- fetch(`${config.routes.api}/usage/report?${params}`, { signal: controller.signal })
54
- .then(async (response) => {
55
- if (!response.ok)
56
- throw new Error(`${response.status} ${response.statusText}`);
57
- setReport((await response.json()));
58
- })
59
- .catch((reason) => {
69
+ fetch(`${config.routes.api}/usage/report?${params}`, {
70
+ signal: controller.signal
71
+ }).then(async (response)=>{
72
+ if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);
73
+ setReport(await response.json());
74
+ }).catch((reason)=>{
60
75
  if (!controller.signal.aborted) {
61
76
  setError(reason instanceof Error ? reason.message : 'Failed to load usage report');
62
77
  }
63
- })
64
- .finally(() => {
65
- if (!controller.signal.aborted)
66
- setLoading(false);
78
+ }).finally(()=>{
79
+ if (!controller.signal.aborted) setLoading(false);
67
80
  });
68
- return () => controller.abort();
69
- }, [config.routes.api, groupBy, range]);
70
- const rows = [...(report?.rows ?? [])].sort((a, b) => {
81
+ return ()=>controller.abort();
82
+ }, [
83
+ config.routes.api,
84
+ groupBy,
85
+ range
86
+ ]);
87
+ const rows = [
88
+ ...report?.rows ?? []
89
+ ].sort((a, b)=>{
71
90
  const left = a[sortField];
72
91
  const right = b[sortField];
73
92
  const result = typeof left === 'string' ? left.localeCompare(String(right)) : left - Number(right);
74
93
  return ascending ? result : -result;
75
94
  });
76
95
  const columns = [
77
- { field: 'label', label: groupBy === 'model' ? 'Model' : 'User', value: (row) => row.label },
78
- { field: 'requestCount', label: 'Requests', value: (row) => row.requestCount.toLocaleString() },
79
- { field: 'totalTokens', label: 'Total Tokens', value: (row) => formatTokens(row.totalTokens) },
80
- { field: 'inputTokens', label: 'Input', value: (row) => formatTokens(row.inputTokens) },
81
- { field: 'outputTokens', label: 'Output', value: (row) => formatTokens(row.outputTokens) },
96
+ {
97
+ field: 'label',
98
+ label: groupBy === 'model' ? 'Model' : 'User',
99
+ value: (row)=>row.label
100
+ },
101
+ {
102
+ field: 'requestCount',
103
+ label: 'Requests',
104
+ value: (row)=>row.requestCount.toLocaleString()
105
+ },
106
+ {
107
+ field: 'totalTokens',
108
+ label: 'Total Tokens',
109
+ value: (row)=>formatTokens(row.totalTokens)
110
+ },
111
+ {
112
+ field: 'inputTokens',
113
+ label: 'Input',
114
+ value: (row)=>formatTokens(row.inputTokens)
115
+ },
116
+ {
117
+ field: 'outputTokens',
118
+ label: 'Output',
119
+ value: (row)=>formatTokens(row.outputTokens)
120
+ },
82
121
  {
83
122
  field: 'cachedInputTokens',
84
123
  label: 'Cached',
85
- value: (row) => formatTokens(row.cachedInputTokens),
124
+ value: (row)=>formatTokens(row.cachedInputTokens)
86
125
  },
87
126
  {
88
127
  field: 'reasoningTokens',
89
128
  label: 'Reasoning',
90
- value: (row) => formatTokens(row.reasoningTokens),
129
+ value: (row)=>formatTokens(row.reasoningTokens)
91
130
  },
92
- { field: 'costUSD', label: 'Cost', value: (row) => `$${row.costUSD.toFixed(2)}` },
131
+ {
132
+ field: 'costUSD',
133
+ label: 'Cost',
134
+ value: (row)=>formatMoney({
135
+ value: row.costUSD,
136
+ locale: i18n.language
137
+ })
138
+ }
93
139
  ];
94
140
  function sort(field) {
95
- if (sortField === field)
96
- setAscending(!ascending);
141
+ if (sortField === field) setAscending(!ascending);
97
142
  else {
98
143
  setSortField(field);
99
144
  setAscending(false);
100
145
  }
101
146
  }
102
- return (_jsxs("div", { className: "usage-reports", children: [_jsxs("header", { className: "usage-reports__header", children: [_jsxs("div", { children: [_jsx("h1", { children: "Usage Analytics" }), _jsx("p", { children: range.label })] }), _jsxs("div", { className: "usage-reports__ranges", children: [presets.map((preset) => (_jsx("button", { type: "button", onClick: () => {
103
- setShowCustom(false);
104
- setRange(rangeForDays(preset.days, preset.label));
105
- }, children: preset.label }, preset.days))), _jsx("button", { type: "button", onClick: () => setShowCustom(!showCustom), children: "Custom" })] })] }), showCustom && (_jsxs("div", { className: "usage-reports__custom", children: [_jsxs("label", { children: ["From", _jsx("input", { type: "date", value: customFrom, onChange: (event) => setCustomFrom(event.target.value) })] }), _jsxs("label", { children: ["To", _jsx("input", { type: "date", value: customTo, onChange: (event) => setCustomTo(event.target.value) })] }), _jsx("button", { type: "button", disabled: !customFrom || !customTo || customFrom > customTo, onClick: () => {
147
+ return /*#__PURE__*/ _jsxs("div", {
148
+ className: "usage-reports",
149
+ children: [
150
+ /*#__PURE__*/ _jsxs("header", {
151
+ className: "usage-reports__header",
152
+ children: [
153
+ /*#__PURE__*/ _jsxs("div", {
154
+ children: [
155
+ /*#__PURE__*/ _jsx("h1", {
156
+ children: "Usage Analytics"
157
+ }),
158
+ /*#__PURE__*/ _jsx("p", {
159
+ children: range.label
160
+ })
161
+ ]
162
+ }),
163
+ /*#__PURE__*/ _jsxs("div", {
164
+ className: "usage-reports__ranges",
165
+ children: [
166
+ presets.map((preset)=>/*#__PURE__*/ _jsx("button", {
167
+ type: "button",
168
+ onClick: ()=>{
169
+ setShowCustom(false);
170
+ setRange(rangeForDays(preset.days, preset.label));
171
+ },
172
+ children: preset.label
173
+ }, preset.days)),
174
+ /*#__PURE__*/ _jsx("button", {
175
+ type: "button",
176
+ onClick: ()=>setShowCustom(!showCustom),
177
+ children: "Custom"
178
+ })
179
+ ]
180
+ })
181
+ ]
182
+ }),
183
+ showCustom && /*#__PURE__*/ _jsxs("div", {
184
+ className: "usage-reports__custom",
185
+ children: [
186
+ /*#__PURE__*/ _jsxs("label", {
187
+ children: [
188
+ "From",
189
+ /*#__PURE__*/ _jsx("input", {
190
+ type: "date",
191
+ value: customFrom,
192
+ onChange: (event)=>setCustomFrom(event.target.value)
193
+ })
194
+ ]
195
+ }),
196
+ /*#__PURE__*/ _jsxs("label", {
197
+ children: [
198
+ "To",
199
+ /*#__PURE__*/ _jsx("input", {
200
+ type: "date",
201
+ value: customTo,
202
+ onChange: (event)=>setCustomTo(event.target.value)
203
+ })
204
+ ]
205
+ }),
206
+ /*#__PURE__*/ _jsx("button", {
207
+ type: "button",
208
+ disabled: !customFrom || !customTo || customFrom > customTo,
209
+ onClick: ()=>{
106
210
  setRange(customRange(customFrom, customTo));
107
211
  setShowCustom(false);
108
- }, children: "Apply" })] })), _jsx("nav", { className: "usage-reports__tabs", "aria-label": "Usage report", children: ['model', 'user'].map((group) => (_jsx("button", { className: groupBy === group ? 'active' : '', type: "button", onClick: () => {
109
- setGroupBy(group);
110
- setSortField(group === 'model' ? 'totalTokens' : 'costUSD');
111
- setAscending(false);
112
- }, children: group === 'model' ? 'Models' : 'Users' }, group))) }), _jsxs("section", { className: "usage-reports__card", children: [_jsxs("div", { className: "usage-reports__totals", children: [_jsxs("span", { children: [_jsx("strong", { children: report?.totals.requestCount.toLocaleString() ?? '0' }), " requests"] }), _jsxs("span", { children: [_jsx("strong", { children: formatTokens(report?.totals.totalTokens ?? 0) }), " tokens"] }), _jsxs("span", { children: [_jsxs("strong", { children: ["$", (report?.totals.costUSD ?? 0).toFixed(2)] }), " cost"] })] }), loading && _jsx("p", { className: "usage-reports__state", children: "Loading usage..." }), error && (_jsxs("p", { className: "usage-reports__state usage-reports__error", children: ["Failed to load: ", error] })), !loading && !error && rows.length === 0 && (_jsx("p", { className: "usage-reports__state", children: "No usage in this date range." })), !loading && !error && rows.length > 0 && (_jsx("div", { className: "usage-reports__table-wrap", children: _jsxs("table", { children: [_jsx("thead", { children: _jsx("tr", { children: columns.map((column) => (_jsx("th", { children: _jsxs("button", { type: "button", onClick: () => sort(column.field), children: [column.label, sortField === column.field ? (ascending ? ' ▲' : ' ▼') : ''] }) }, column.field))) }) }), _jsx("tbody", { children: rows.map((row) => (_jsx("tr", { children: columns.map((column) => (_jsx("td", { children: column.value(row) }, column.field))) }, row.key))) })] }) }))] })] }));
212
+ },
213
+ children: "Apply"
214
+ })
215
+ ]
216
+ }),
217
+ /*#__PURE__*/ _jsx("nav", {
218
+ className: "usage-reports__tabs",
219
+ "aria-label": "Usage report",
220
+ children: [
221
+ 'model',
222
+ 'user'
223
+ ].map((group)=>/*#__PURE__*/ _jsx("button", {
224
+ className: groupBy === group ? 'active' : '',
225
+ type: "button",
226
+ onClick: ()=>{
227
+ setGroupBy(group);
228
+ setSortField(group === 'model' ? 'totalTokens' : 'costUSD');
229
+ setAscending(false);
230
+ },
231
+ children: group === 'model' ? 'Models' : 'Users'
232
+ }, group))
233
+ }),
234
+ /*#__PURE__*/ _jsxs("section", {
235
+ className: "usage-reports__card",
236
+ children: [
237
+ /*#__PURE__*/ _jsxs("div", {
238
+ className: "usage-reports__totals",
239
+ children: [
240
+ /*#__PURE__*/ _jsxs("span", {
241
+ children: [
242
+ /*#__PURE__*/ _jsx("strong", {
243
+ children: report?.totals.requestCount.toLocaleString() ?? '0'
244
+ }),
245
+ " requests"
246
+ ]
247
+ }),
248
+ /*#__PURE__*/ _jsxs("span", {
249
+ children: [
250
+ /*#__PURE__*/ _jsx("strong", {
251
+ children: formatTokens(report?.totals.totalTokens ?? 0)
252
+ }),
253
+ " tokens"
254
+ ]
255
+ }),
256
+ /*#__PURE__*/ _jsxs("span", {
257
+ children: [
258
+ /*#__PURE__*/ _jsx("strong", {
259
+ children: formatMoney({
260
+ value: report?.totals.costUSD ?? 0,
261
+ locale: i18n.language
262
+ })
263
+ }),
264
+ ' ',
265
+ "cost"
266
+ ]
267
+ })
268
+ ]
269
+ }),
270
+ loading && /*#__PURE__*/ _jsx("p", {
271
+ className: "usage-reports__state",
272
+ children: "Loading usage..."
273
+ }),
274
+ error && /*#__PURE__*/ _jsxs("p", {
275
+ className: "usage-reports__state usage-reports__error",
276
+ children: [
277
+ "Failed to load: ",
278
+ error
279
+ ]
280
+ }),
281
+ !loading && !error && rows.length === 0 && /*#__PURE__*/ _jsx("p", {
282
+ className: "usage-reports__state",
283
+ children: "No usage in this date range."
284
+ }),
285
+ !loading && !error && rows.length > 0 && /*#__PURE__*/ _jsx("div", {
286
+ className: "usage-reports__table-wrap",
287
+ children: /*#__PURE__*/ _jsxs("table", {
288
+ children: [
289
+ /*#__PURE__*/ _jsx("thead", {
290
+ children: /*#__PURE__*/ _jsx("tr", {
291
+ children: columns.map((column)=>/*#__PURE__*/ _jsx("th", {
292
+ children: /*#__PURE__*/ _jsxs("button", {
293
+ type: "button",
294
+ onClick: ()=>sort(column.field),
295
+ children: [
296
+ column.label,
297
+ sortField === column.field ? ascending ? ' ▲' : ' ▼' : ''
298
+ ]
299
+ })
300
+ }, column.field))
301
+ })
302
+ }),
303
+ /*#__PURE__*/ _jsx("tbody", {
304
+ children: rows.map((row)=>/*#__PURE__*/ _jsx("tr", {
305
+ children: columns.map((column)=>/*#__PURE__*/ _jsx("td", {
306
+ children: column.value(row)
307
+ }, column.field))
308
+ }, row.key))
309
+ })
310
+ ]
311
+ })
312
+ })
313
+ ]
314
+ })
315
+ ]
316
+ });
113
317
  }
318
+
114
319
  //# sourceMappingURL=UsageReports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UsageReports.js","sourceRoot":"","sources":["../../src/client/UsageReports.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/client/UsageReports.tsx"],"names":["useConfig","useTranslation","formatMoney","useEffect","useState","presets","label","days","rangeForDays","to","Date","from","setUTCDate","getUTCDate","toISOString","dateInput","value","slice","customRange","formatTokens","toFixed","toLocaleString","UsageReports","config","i18n","groupBy","setGroupBy","range","setRange","showCustom","setShowCustom","customFrom","setCustomFrom","customTo","setCustomTo","report","setReport","error","setError","loading","setLoading","sortField","setSortField","ascending","setAscending","controller","AbortController","params","URLSearchParams","undefined","fetch","routes","api","signal","then","response","ok","Error","status","statusText","json","catch","reason","aborted","message","finally","abort","rows","sort","a","b","left","right","result","localeCompare","String","Number","columns","field","row","requestCount","totalTokens","inputTokens","outputTokens","cachedInputTokens","reasoningTokens","costUSD","locale","language","div","className","header","h1","p","map","preset","button","type","onClick","input","onChange","event","target","disabled","nav","aria-label","group","section","span","strong","totals","length","table","thead","tr","column","th","tbody","td","key"],"mappings":"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","file":"UsageReports.js"}
package/dist/client.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { UsageReports } from './client/UsageReports.js';
2
+
2
3
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"sources":["../src/client.ts"],"names":["UsageReports"],"mappings":"AAAA,SAASA,YAAY,QAAQ,2BAA2B","file":"client.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAA0C,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAyJF,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,MAAM,CA0ClF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAA0C,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA0KF,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,MAAM,CA6ClF"}
package/dist/index.js CHANGED
@@ -1,29 +1,38 @@
1
- const loggedIn = ({ req }) => Boolean(req.user);
1
+ const loggedIn = ({ req })=>Boolean(req.user);
2
2
  function idAndLabel(value) {
3
3
  if (typeof value === 'string' || typeof value === 'number') {
4
4
  const key = String(value);
5
- return { key, label: key };
5
+ return {
6
+ key,
7
+ label: key
8
+ };
6
9
  }
7
- if (!value || typeof value !== 'object')
8
- return;
10
+ if (!value || typeof value !== 'object') return;
9
11
  const record = value;
10
- if (record.id === undefined)
11
- return;
12
+ if (record.id === undefined) return;
12
13
  const key = String(record.id);
13
14
  const labelValue = record.name ?? record.email ?? record.title ?? record.id;
14
- return { key, label: String(labelValue) };
15
+ return {
16
+ key,
17
+ label: String(labelValue)
18
+ };
15
19
  }
16
20
  function groupValue(doc, groupBy) {
17
21
  if (groupBy === 'day') {
18
22
  const date = new Date(String(doc.requestedAt));
19
- if (Number.isNaN(date.getTime()))
20
- return;
23
+ if (Number.isNaN(date.getTime())) return;
21
24
  const key = date.toISOString().slice(0, 10);
22
- return { key, label: key };
25
+ return {
26
+ key,
27
+ label: key
28
+ };
23
29
  }
24
30
  if (groupBy === 'model') {
25
31
  const key = typeof doc.model === 'string' && doc.model ? doc.model : 'unknown';
26
- return { key, label: key };
32
+ return {
33
+ key,
34
+ label: key
35
+ };
27
36
  }
28
37
  return idAndLabel(doc[groupBy]);
29
38
  }
@@ -42,7 +51,7 @@ function emptyRow(key, label) {
42
51
  cacheWriteTokens: 0,
43
52
  reasoningTokens: 0,
44
53
  totalTokens: 0,
45
- costUSD: 0,
54
+ costUSD: 0
46
55
  };
47
56
  }
48
57
  function addDoc(row, doc) {
@@ -60,66 +69,86 @@ function parseRequest(req, groups) {
60
69
  const groupBy = search.get('groupBy');
61
70
  const fromDate = new Date(search.get('from') ?? '');
62
71
  const toDate = new Date(search.get('to') ?? '');
63
- if (!groupBy ||
64
- !groups.has(groupBy) ||
65
- Number.isNaN(fromDate.getTime()) ||
66
- Number.isNaN(toDate.getTime()) ||
67
- fromDate > toDate) {
72
+ if (!groupBy || !groups.has(groupBy) || Number.isNaN(fromDate.getTime()) || Number.isNaN(toDate.getTime()) || fromDate > toDate) {
68
73
  return;
69
74
  }
70
- return { groupBy, from: fromDate.toISOString(), to: toDate.toISOString() };
75
+ return {
76
+ groupBy,
77
+ from: fromDate.toISOString(),
78
+ to: toDate.toISOString()
79
+ };
71
80
  }
72
81
  function buildReportEndpoint({ slug, pageSize, groups, access }) {
73
82
  return {
74
83
  method: 'get',
75
84
  path: '/usage/report',
76
- handler: async (req) => {
77
- if (!req.user)
78
- return Response.json({ error: 'Unauthorized' }, { status: 401 });
79
- const permitted = await access({ req });
80
- if (permitted === false)
81
- return Response.json({ error: 'Forbidden' }, { status: 403 });
82
- const scope = permitted === true ? [] : [permitted];
85
+ handler: async (req)=>{
86
+ if (!req.user) return Response.json({
87
+ error: 'Unauthorized'
88
+ }, {
89
+ status: 401
90
+ });
91
+ const permitted = await access({
92
+ req
93
+ });
94
+ if (permitted === false) return Response.json({
95
+ error: 'Forbidden'
96
+ }, {
97
+ status: 403
98
+ });
99
+ const scope = permitted === true ? [] : [
100
+ permitted
101
+ ];
83
102
  const query = parseRequest(req, groups);
84
- if (!query)
85
- return Response.json({ error: 'Invalid groupBy or date range' }, { status: 400 });
103
+ if (!query) return Response.json({
104
+ error: 'Invalid groupBy or date range'
105
+ }, {
106
+ status: 400
107
+ });
86
108
  const rows = new Map();
87
109
  let page = 1;
88
- while (true) {
110
+ while(true){
89
111
  const result = await req.frogbot.find({
90
112
  collection: slug,
91
113
  where: {
92
114
  and: [
93
- { requestedAt: { greater_than_equal: query.from } },
94
- { requestedAt: { less_than_equal: query.to } },
95
- ...scope,
96
- ],
115
+ {
116
+ requestedAt: {
117
+ greater_than_equal: query.from
118
+ }
119
+ },
120
+ {
121
+ requestedAt: {
122
+ less_than_equal: query.to
123
+ }
124
+ },
125
+ ...scope
126
+ ]
97
127
  },
98
128
  page,
99
129
  limit: pageSize,
100
130
  depth: 1,
101
131
  sort: 'requestedAt',
102
132
  overrideAccess: true,
103
- req,
133
+ req
104
134
  });
105
- for (const value of result.docs) {
135
+ for (const value of result.docs){
106
136
  const doc = value;
107
137
  const group = groupValue(doc, query.groupBy);
108
- if (!group)
109
- continue;
138
+ if (!group) continue;
110
139
  const row = rows.get(group.key) ?? emptyRow(group.key, group.label);
111
- if (row.label === row.key && group.label !== group.key)
112
- row.label = group.label;
140
+ if (row.label === row.key && group.label !== group.key) row.label = group.label;
113
141
  addDoc(row, doc);
114
142
  rows.set(group.key, row);
115
143
  }
116
- if (!result.hasNextPage)
117
- break;
144
+ if (!result.hasNextPage) break;
118
145
  page = result.nextPage ?? page + 1;
119
146
  }
120
- const reportRows = [...rows.values()].sort((a, b) => b.costUSD - a.costUSD || b.totalTokens - a.totalTokens || a.label.localeCompare(b.label));
147
+ const reportRows = [
148
+ ...rows.values()
149
+ ].sort((a, b)=>b.costUSD - a.costUSD || b.totalTokens - a.totalTokens || a.label.localeCompare(b.label));
121
150
  const totals = emptyRow('', '');
122
- for (const row of reportRows) {
151
+ for (const row of reportRows){
123
152
  totals.requestCount += row.requestCount;
124
153
  totals.inputTokens += row.inputTokens;
125
154
  totals.outputTokens += row.outputTokens;
@@ -133,9 +162,9 @@ function buildReportEndpoint({ slug, pageSize, groups, access }) {
133
162
  return Response.json({
134
163
  ...query,
135
164
  rows: reportRows,
136
- totals: reportTotals,
165
+ totals: reportTotals
137
166
  });
138
- },
167
+ }
139
168
  };
140
169
  }
141
170
  export function usageReportsPlugin(options = {}) {
@@ -143,41 +172,59 @@ export function usageReportsPlugin(options = {}) {
143
172
  if (!Number.isInteger(pageSize) || pageSize < 1) {
144
173
  throw new Error('[plugin-usage-reports] pageSize must be a positive integer.');
145
174
  }
146
- return async (config) => {
147
- if (!config.ai)
148
- throw new Error('[plugin-usage-reports] AI configuration is required.');
149
- const existing = config.collections.find((collection) => collection.usageLog === true);
150
- const usage = existing ?? { slug: 'usage-logs', usageLog: true, fields: [] };
151
- const collections = existing
152
- ? config.collections.map((collection) => collection === existing
153
- ? { ...collection, admin: { ...collection.admin, groupBy: true } }
154
- : collection)
155
- : [...config.collections, { ...usage, admin: { groupBy: true } }];
156
- const groups = new Set(['day', 'model', 'user']);
157
- if (usage.fields.some((field) => 'name' in field && field.name === 'apiKey')) {
175
+ return (config)=>{
176
+ if (!config.ai) throw new Error('[plugin-usage-reports] AI configuration is required.');
177
+ const existing = config.collections.find((collection)=>collection.usageLog === true);
178
+ const usage = existing ?? {
179
+ slug: 'usage-logs',
180
+ usageLog: true,
181
+ fields: []
182
+ };
183
+ const collections = existing ? config.collections.map((collection)=>collection === existing ? {
184
+ ...collection,
185
+ admin: {
186
+ ...collection.admin,
187
+ groupBy: true
188
+ }
189
+ } : collection) : [
190
+ ...config.collections,
191
+ {
192
+ ...usage,
193
+ admin: {
194
+ groupBy: true
195
+ }
196
+ }
197
+ ];
198
+ const groups = new Set([
199
+ 'day',
200
+ 'model',
201
+ 'user'
202
+ ]);
203
+ if (usage.fields.some((field)=>'name' in field && field.name === 'apiKey')) {
158
204
  groups.add('apiKey');
159
205
  }
160
206
  return {
161
207
  ...config,
162
208
  collections,
163
209
  endpoints: [
164
- ...(config.endpoints ?? []),
210
+ ...config.endpoints ?? [],
165
211
  buildReportEndpoint({
166
212
  slug: usage.slug,
167
213
  pageSize,
168
214
  groups,
169
- access: options.access ?? loggedIn,
170
- }),
215
+ access: options.access ?? loggedIn
216
+ })
171
217
  ],
172
218
  settings: [
173
- ...(config.settings ?? []),
219
+ ...config.settings ?? [],
174
220
  {
175
221
  label: 'Usage',
176
222
  path: 'usage',
177
- Component: '@frogbotai/plugin-usage-reports/client#UsageReports',
178
- },
179
- ],
223
+ Component: '@frogbotai/plugin-usage-reports/client#UsageReports'
224
+ }
225
+ ]
180
226
  };
181
227
  };
182
228
  }
229
+
183
230
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["loggedIn","req","Boolean","user","idAndLabel","value","key","String","label","record","id","undefined","labelValue","name","email","title","groupValue","doc","groupBy","date","Date","requestedAt","Number","isNaN","getTime","toISOString","slice","model","number","field","isFinite","emptyRow","requestCount","inputTokens","outputTokens","cachedInputTokens","cacheWriteTokens","reasoningTokens","totalTokens","costUSD","addDoc","row","parseRequest","groups","search","URL","url","searchParams","get","fromDate","toDate","has","from","to","buildReportEndpoint","slug","pageSize","access","method","path","handler","Response","json","error","status","permitted","scope","query","rows","Map","page","result","frogbot","find","collection","where","and","greater_than_equal","less_than_equal","limit","depth","sort","overrideAccess","docs","group","set","hasNextPage","nextPage","reportRows","values","a","b","localeCompare","totals","_key","_label","reportTotals","usageReportsPlugin","options","isInteger","Error","config","ai","existing","collections","usageLog","usage","fields","map","admin","Set","some","add","endpoints","settings","Component"],"mappings":"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","file":"index.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frogbotai/plugin-usage-reports",
3
- "version": "0.29.0",
3
+ "version": "0.31.0",
4
4
  "description": "Usage analytics reports for FrogBot.",
5
5
  "license": "MIT",
6
6
  "author": "Colby Gilbert",
@@ -38,7 +38,7 @@
38
38
  "@payloadcms/ui": "3.90.1",
39
39
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
40
40
  "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
41
- "frogbot": "0.29.0"
41
+ "frogbot": "0.31.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@payloadcms/ui": "3.90.1",
@@ -47,14 +47,14 @@
47
47
  "react": "19.2.6",
48
48
  "react-dom": "19.2.6",
49
49
  "typescript": "5.6.2",
50
- "@frogbotai/plugin-import-export": "0.29.0",
51
- "frogbot": "0.29.0"
50
+ "@frogbotai/plugin-import-export": "0.31.0",
51
+ "frogbot": "0.31.0"
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public"
55
55
  },
56
56
  "scripts": {
57
- "build": "rm -rf dist && tsc -p tsconfig.json && cp src/client/styles.css dist/client/styles.css",
57
+ "build": "node ../../../scripts/build-package.mjs --assets css",
58
58
  "clean": "rm -rf dist",
59
59
  "typecheck": "tsc --noEmit"
60
60
  }