agent-tank 0.9.9 → 0.9.11
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/CHANGELOG.md +157 -0
- package/README.md +84 -9
- package/bin/agent-tank.js +26 -8
- package/favicon.svg +7 -0
- package/package.json +3 -1
- package/src/activity-monitor.js +6 -1
- package/src/agent-config.js +105 -0
- package/src/agents/agy.js +48 -10
- package/src/agents/api-response-parser.js +17 -17
- package/src/agents/base.js +29 -14
- package/src/agents/claude.js +149 -22
- package/src/agents/codex-rpc-helpers.js +166 -34
- package/src/agents/codex.js +42 -9
- package/src/agents/oauth-helper.js +12 -4
- package/src/agents/pty-output-parser.js +28 -10
- package/src/auto-refresh-manager.js +6 -1
- package/src/client-auto-refresh-helpers.js +13 -13
- package/src/client-auto-refresh.js +9 -7
- package/src/client-script.js +1 -1
- package/src/index.js +49 -22
- package/src/pace-attachment.js +2 -2
- package/src/snapshot-metrics.js +1 -1
- package/src/status-page.js +11 -6
- package/src/usage-formatters.js +14 -12
package/src/usage-formatters.js
CHANGED
|
@@ -122,12 +122,12 @@ function usageItem(label, value, suffix, options = {}) {
|
|
|
122
122
|
`;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
function formatClaudeUsage(usage) {
|
|
125
|
+
function formatClaudeUsage(usage, agentId = 'claude') {
|
|
126
126
|
let html = '';
|
|
127
127
|
const sections = [
|
|
128
128
|
{ data: usage.session, label: 'Session', cycle: 'session' },
|
|
129
129
|
{ data: usage.weeklyAll, label: 'Weekly (all)', cycle: 'weekly' },
|
|
130
|
-
{ data: usage.
|
|
130
|
+
{ data: usage.weeklyFable, label: 'Weekly (Fable)', cycle: 'weekly' },
|
|
131
131
|
{ data: usage.weekly, label: 'Weekly', cycle: 'weekly' },
|
|
132
132
|
];
|
|
133
133
|
for (const { data, label, cycle } of sections) {
|
|
@@ -140,7 +140,7 @@ function formatClaudeUsage(usage) {
|
|
|
140
140
|
const paceData = data.pace || null;
|
|
141
141
|
|
|
142
142
|
html += '<div class="model-container">';
|
|
143
|
-
html += usageItem(label, percent, '% used', { isZero, agentName:
|
|
143
|
+
html += usageItem(label, percent, '% used', { isZero, agentName: agentId, resetsIn });
|
|
144
144
|
html += resetInfoItem(data.resetsIn, data.resetsAt, cycle, { isZero, paceData });
|
|
145
145
|
html += '</div>';
|
|
146
146
|
}
|
|
@@ -159,7 +159,7 @@ function formatClaudeUsage(usage) {
|
|
|
159
159
|
? `$${extra.spent.toFixed(2)} / $${extra.budget.toFixed(2)}`
|
|
160
160
|
: '';
|
|
161
161
|
html += '<div class="model-container">';
|
|
162
|
-
html += usageItem('Extra', percent, '% used', { isZero, agentName:
|
|
162
|
+
html += usageItem('Extra', percent, '% used', { isZero, agentName: agentId, resetsIn });
|
|
163
163
|
if (spentLabel) {
|
|
164
164
|
html += `<div class="usage-item reset-info"><span class="usage-label">↳ Budget</span><span class="usage-value">${spentLabel}</span></div>`;
|
|
165
165
|
}
|
|
@@ -169,7 +169,7 @@ function formatClaudeUsage(usage) {
|
|
|
169
169
|
return html;
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
function formatAgyUsage(usage) {
|
|
172
|
+
function formatAgyUsage(usage, agentId = 'agy') {
|
|
173
173
|
let html = '';
|
|
174
174
|
if (usage.models && usage.models.length > 0) {
|
|
175
175
|
for (const model of usage.models) {
|
|
@@ -182,15 +182,17 @@ function formatAgyUsage(usage) {
|
|
|
182
182
|
const paceData = model.pace || null;
|
|
183
183
|
|
|
184
184
|
html += '<div class="model-container">';
|
|
185
|
-
html += usageItem(modelName, percent, '% used', { isZero, isModelName: true, agentName:
|
|
186
|
-
|
|
185
|
+
html += usageItem(modelName, percent, '% used', { isZero, isModelName: true, agentName: agentId, resetsIn });
|
|
186
|
+
// Weekly and five-hour limits share this list, so each entry carries the
|
|
187
|
+
// cycle its countdown belongs to; older payloads have no cycle field.
|
|
188
|
+
html += resetInfoItem(model.resetsIn, model.resetsAt || null, model.cycle || 'sessionAgy', { isZero, paceData });
|
|
187
189
|
html += '</div>';
|
|
188
190
|
}
|
|
189
191
|
}
|
|
190
192
|
return html;
|
|
191
193
|
}
|
|
192
194
|
|
|
193
|
-
function formatCodexUsage(usage) {
|
|
195
|
+
function formatCodexUsage(usage, agentId = 'codex') {
|
|
194
196
|
let html = '';
|
|
195
197
|
const models = [];
|
|
196
198
|
if (usage.fiveHour || usage.weekly) {
|
|
@@ -213,7 +215,7 @@ function formatCodexUsage(usage) {
|
|
|
213
215
|
const paceData = ml.fiveHour.pace || null;
|
|
214
216
|
|
|
215
217
|
html += '<div class="model-container nested-container">';
|
|
216
|
-
html += usageItem('5h limit', fiveHourPercent, '% used', { isZero, isNestedMetric: true, agentName:
|
|
218
|
+
html += usageItem('5h limit', fiveHourPercent, '% used', { isZero, isNestedMetric: true, agentName: agentId, resetsIn, metricId: `${agentId}-${modelSlug}-5h` });
|
|
217
219
|
html += resetInfoItem(ml.fiveHour.resetsIn, ml.fiveHour.resetsAt, 'fiveHour', { isZero, paceData });
|
|
218
220
|
html += '</div>';
|
|
219
221
|
}
|
|
@@ -226,7 +228,7 @@ function formatCodexUsage(usage) {
|
|
|
226
228
|
const paceData = ml.weekly.pace || null;
|
|
227
229
|
|
|
228
230
|
html += '<div class="model-container nested-container">';
|
|
229
|
-
html += usageItem('Weekly', weeklyPercent, '% used', { isZero, isNestedMetric: true, agentName:
|
|
231
|
+
html += usageItem('Weekly', weeklyPercent, '% used', { isZero, isNestedMetric: true, agentName: agentId, resetsIn, metricId: `${agentId}-${modelSlug}-weekly` });
|
|
230
232
|
html += resetInfoItem(ml.weekly.resetsIn, ml.weekly.resetsAt, 'weekly', { isZero, paceData });
|
|
231
233
|
html += '</div>';
|
|
232
234
|
}
|
|
@@ -234,14 +236,14 @@ function formatCodexUsage(usage) {
|
|
|
234
236
|
return html;
|
|
235
237
|
}
|
|
236
238
|
|
|
237
|
-
function formatUsage(agentName, usage) {
|
|
239
|
+
function formatUsage(agentName, usage, options = {}) {
|
|
238
240
|
if (!usage) {
|
|
239
241
|
return '<p class="usage-item">No data available</p>';
|
|
240
242
|
}
|
|
241
243
|
|
|
242
244
|
const formatters = { claude: formatClaudeUsage, agy: formatAgyUsage, codex: formatCodexUsage };
|
|
243
245
|
const formatter = formatters[agentName];
|
|
244
|
-
const html = formatter ? formatter(usage) : '';
|
|
246
|
+
const html = formatter ? formatter(usage, options.agentId || agentName) : '';
|
|
245
247
|
|
|
246
248
|
return html || '<p class="usage-item">No usage data</p>';
|
|
247
249
|
}
|