@agentguard-run/spend 0.3.0 → 0.4.1
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 +11 -0
- package/README.es-419.md +28 -0
- package/README.md +28 -0
- package/README.pt-BR.md +28 -0
- package/dist/advisor/anomaly.d.ts +26 -0
- package/dist/advisor/anomaly.d.ts.map +1 -0
- package/dist/advisor/anomaly.js +119 -0
- package/dist/advisor/anomaly.js.map +1 -0
- package/dist/advisor/conversation.d.ts +75 -0
- package/dist/advisor/conversation.d.ts.map +1 -0
- package/dist/advisor/conversation.js +264 -0
- package/dist/advisor/conversation.js.map +1 -0
- package/dist/advisor/forecast.d.ts +19 -0
- package/dist/advisor/forecast.d.ts.map +1 -0
- package/dist/advisor/forecast.js +57 -0
- package/dist/advisor/forecast.js.map +1 -0
- package/dist/advisor/llm-client.d.ts +41 -0
- package/dist/advisor/llm-client.d.ts.map +1 -0
- package/dist/advisor/llm-client.js +248 -0
- package/dist/advisor/llm-client.js.map +1 -0
- package/dist/advisor/output.d.ts +41 -0
- package/dist/advisor/output.d.ts.map +1 -0
- package/dist/advisor/output.js +202 -0
- package/dist/advisor/output.js.map +1 -0
- package/dist/advisor/posture.d.ts +26 -0
- package/dist/advisor/posture.d.ts.map +1 -0
- package/dist/advisor/posture.js +99 -0
- package/dist/advisor/posture.js.map +1 -0
- package/dist/advisor/system-prompt.d.ts +20 -0
- package/dist/advisor/system-prompt.d.ts.map +1 -0
- package/dist/advisor/system-prompt.js +190 -0
- package/dist/advisor/system-prompt.js.map +1 -0
- package/dist/cli/advisor.d.ts +5 -0
- package/dist/cli/advisor.d.ts.map +1 -0
- package/dist/cli/advisor.js +270 -0
- package/dist/cli/advisor.js.map +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +6 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/telemetry.js +1 -1
- package/package.json +9 -2
- package/src/advisor/anomaly.ts +98 -0
- package/src/advisor/conversation.ts +289 -0
- package/src/advisor/forecast.ts +64 -0
- package/src/advisor/llm-client.ts +247 -0
- package/src/advisor/output.ts +201 -0
- package/src/advisor/posture.ts +111 -0
- package/src/advisor/system-prompt.ts +195 -0
- package/src/cli/advisor.ts +262 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `agentguard advisor`: local LLM-driven policy setup.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runAdvisor = runAdvisor;
|
|
40
|
+
const readline = __importStar(require("readline"));
|
|
41
|
+
const index_1 = require("../index");
|
|
42
|
+
const conversation_1 = require("../advisor/conversation");
|
|
43
|
+
const posture_1 = require("../advisor/posture");
|
|
44
|
+
const forecast_1 = require("../advisor/forecast");
|
|
45
|
+
const llm_client_1 = require("../advisor/llm-client");
|
|
46
|
+
const anomaly_1 = require("../advisor/anomaly");
|
|
47
|
+
const system_prompt_1 = require("../advisor/system-prompt");
|
|
48
|
+
const output_1 = require("../advisor/output");
|
|
49
|
+
const colors_1 = require("./colors");
|
|
50
|
+
const HELP = `agentguard advisor: local LLM-driven policy setup
|
|
51
|
+
|
|
52
|
+
usage:
|
|
53
|
+
agentguard advisor [--provider openrouter|openai|anthropic|compatible] [--base-url <url>] [--model <model>] [--posture velocity|standard|compliance|custom]
|
|
54
|
+
agentguard advisor review [--scope <name>]
|
|
55
|
+
agentguard advisor forecast [--scope <name>] [--cap-cents <cents>]
|
|
56
|
+
|
|
57
|
+
examples:
|
|
58
|
+
agentguard auth openrouter
|
|
59
|
+
agentguard advisor
|
|
60
|
+
agentguard advisor --posture velocity --provider mock --defaults
|
|
61
|
+
agentguard advisor --base-url https://api.deepseek.com/v1 --model deepseek-chat
|
|
62
|
+
agentguard advisor review
|
|
63
|
+
`;
|
|
64
|
+
async function runAdvisor(argv) {
|
|
65
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
66
|
+
console.log(HELP);
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
if (argv[0] === 'review')
|
|
70
|
+
return runAdvisorReview(argv.slice(1));
|
|
71
|
+
if (argv[0] === 'forecast')
|
|
72
|
+
return runAdvisorForecast(argv.slice(1));
|
|
73
|
+
const options = parseOptions(argv);
|
|
74
|
+
if (options.posture === 'custom') {
|
|
75
|
+
console.log('Solo tier required for custom governance posture. Choose velocity, standard, or compliance in this release.');
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
const apiKey = (0, llm_client_1.resolveAdvisorApiKey)(options.provider);
|
|
79
|
+
if (options.provider !== 'mock' && !apiKey) {
|
|
80
|
+
console.log('');
|
|
81
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
82
|
+
console.log('');
|
|
83
|
+
console.log(` ${(0, colors_1.yellow)('agentguard advisor needs a local provider key')}`);
|
|
84
|
+
console.log(' Run agentguard auth openrouter, set OPENROUTER_API_KEY, or pass --base-url with AGENTGUARD_ADVISOR_API_KEY.');
|
|
85
|
+
console.log(' Prompts and policy details stay in your terminal and go only to your chosen provider.');
|
|
86
|
+
console.log('');
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
let cancelled = false;
|
|
90
|
+
const logger = (0, output_1.createAdvisorSessionLogger)();
|
|
91
|
+
const onSigint = () => {
|
|
92
|
+
cancelled = true;
|
|
93
|
+
logger.append('cancelled', { reason: 'sigint' });
|
|
94
|
+
process.stdout.write('\nadvisor cancelled. No policy files were written.\n');
|
|
95
|
+
};
|
|
96
|
+
process.once('SIGINT', onSigint);
|
|
97
|
+
try {
|
|
98
|
+
const conversation = new conversation_1.AdvisorConversation({ ...(options.language ? { language: options.language } : {}), ...(options.posture ? { posture: options.posture } : {}) });
|
|
99
|
+
const history = [{ role: 'system', content: system_prompt_1.ADVISOR_SYSTEM_PROMPT }];
|
|
100
|
+
const client = (0, llm_client_1.createAdvisorClient)({ provider: options.provider, baseUrl: options.baseUrl, model: options.model, apiKey: apiKey ?? undefined });
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
103
|
+
console.log('');
|
|
104
|
+
console.log((0, colors_1.cyanBold)('AgentGuard Advisor'));
|
|
105
|
+
console.log((0, colors_1.dim)('Local LLM setup. No AgentGuard service receives prompts, completions, keys, or policies.'));
|
|
106
|
+
console.log('');
|
|
107
|
+
if (options.defaults || !process.stdin.isTTY) {
|
|
108
|
+
fillDefaults(conversation);
|
|
109
|
+
logger.append('answers_defaulted', { answers: conversation.snapshot() });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
await runInteractiveQuestions(conversation, logger, history, client, () => cancelled);
|
|
113
|
+
}
|
|
114
|
+
if (cancelled)
|
|
115
|
+
return 130;
|
|
116
|
+
if (!conversation.isComplete()) {
|
|
117
|
+
console.log((0, colors_1.yellow)('advisor did not collect enough answers to write policy files.'));
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
const profile = conversation.profile(process.cwd());
|
|
121
|
+
if (options.language)
|
|
122
|
+
profile.language = options.language;
|
|
123
|
+
if (options.posture)
|
|
124
|
+
profile.posture = options.posture;
|
|
125
|
+
logger.append('profile_built', { profile });
|
|
126
|
+
console.log('');
|
|
127
|
+
await streamAdvisorSummary(client, history, profileSummaryPrompt(profile), logger, () => cancelled);
|
|
128
|
+
if (cancelled)
|
|
129
|
+
return 130;
|
|
130
|
+
const outputs = (0, output_1.writeAdvisorOutputs)(profile, { language: profile.language, overwrite: options.yes || options.defaults });
|
|
131
|
+
logger.append('files_written', { policyPath: outputs.policyPath, quickstartPath: outputs.quickstartPath, sessionLogPath: logger.path });
|
|
132
|
+
console.log('');
|
|
133
|
+
console.log(outputs.savingsTable);
|
|
134
|
+
console.log('');
|
|
135
|
+
console.log(`${(0, colors_1.green)('created')} ${outputs.policyPath}`);
|
|
136
|
+
console.log(`${(0, colors_1.green)('created')} ${outputs.quickstartPath}`);
|
|
137
|
+
console.log(`${(0, colors_1.green)('session')} ${logger.path}`);
|
|
138
|
+
console.log('');
|
|
139
|
+
console.log('Next: agentguard demo --policy ~/.agentguard/policy.yaml');
|
|
140
|
+
console.log('Verify receipts: https://agentguard.run/verify');
|
|
141
|
+
console.log('');
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
process.removeListener('SIGINT', onSigint);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function runAdvisorReview(argv) {
|
|
149
|
+
const scope = valueAfter(argv, '--scope') ?? 'default';
|
|
150
|
+
const anomalies = (0, anomaly_1.reviewAnomalies)((0, anomaly_1.readDecisionSpend)(scope));
|
|
151
|
+
console.log('');
|
|
152
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
153
|
+
console.log('');
|
|
154
|
+
if (anomalies.length === 0) {
|
|
155
|
+
console.log('No local spend anomalies found for the last 24 hours.');
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
for (const item of anomalies) {
|
|
159
|
+
console.log(`${item.scope}/${item.agentId}: ${(0, conversation_1.formatCents)(item.last24hCents)} in last 24h. Baseline ${(0, conversation_1.formatCents)(item.baselineCents)}, sigma ${(0, conversation_1.formatCents)(item.sigmaCents)}.`);
|
|
160
|
+
console.log(`Suggestion: ${item.suggestion}`);
|
|
161
|
+
}
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
async function runAdvisorForecast(argv) {
|
|
165
|
+
const scope = valueAfter(argv, '--scope') ?? 'default';
|
|
166
|
+
const cap = valueAfter(argv, '--cap-cents');
|
|
167
|
+
const forecast = (0, forecast_1.forecastMonthEnd)((0, anomaly_1.readDecisionSpend)(scope), cap ? Number(cap) : null);
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
170
|
+
console.log('');
|
|
171
|
+
console.log(`Days observed: ${forecast.daysObserved}`);
|
|
172
|
+
console.log(`Projected month-end: ${(0, conversation_1.formatCents)(forecast.monthEndCents)}`);
|
|
173
|
+
if (forecast.capCents !== null)
|
|
174
|
+
console.log(`Cap: ${(0, conversation_1.formatCents)(forecast.capCents)}`);
|
|
175
|
+
console.log(forecast.message);
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
async function runInteractiveQuestions(conversation, logger, history, client, isCancelled) {
|
|
179
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
180
|
+
const ask = (prompt) => new Promise((resolve) => rl.question(`${prompt}\n> `, resolve));
|
|
181
|
+
try {
|
|
182
|
+
while (!conversation.isComplete() && !isCancelled()) {
|
|
183
|
+
const question = conversation.currentQuestion();
|
|
184
|
+
if (!question)
|
|
185
|
+
break;
|
|
186
|
+
const answer = (await ask(question.prompt)).trim();
|
|
187
|
+
if (answer.toLowerCase() === 'back') {
|
|
188
|
+
conversation.back();
|
|
189
|
+
logger.append('back', { to: conversation.currentQuestion()?.id });
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (!answer)
|
|
193
|
+
continue;
|
|
194
|
+
conversation.answer(answer);
|
|
195
|
+
logger.append('answer', { question: question.id, answer });
|
|
196
|
+
history.push({ role: 'user', content: `${question.prompt}\n${answer}` });
|
|
197
|
+
await streamAdvisorSummary(client, history, advisorQuestionPrompt(question.id), logger, isCancelled);
|
|
198
|
+
conversation.next();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
rl.close();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async function streamAdvisorSummary(client, history, prompt, logger, isCancelled) {
|
|
206
|
+
history.push({ role: 'user', content: prompt });
|
|
207
|
+
let content = '';
|
|
208
|
+
process.stdout.write('\n');
|
|
209
|
+
try {
|
|
210
|
+
for await (const token of client.streamChat(history)) {
|
|
211
|
+
if (isCancelled())
|
|
212
|
+
break;
|
|
213
|
+
content += token;
|
|
214
|
+
process.stdout.write(token);
|
|
215
|
+
}
|
|
216
|
+
process.stdout.write('\n');
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
220
|
+
content = `Advisor provider unavailable: ${message}`;
|
|
221
|
+
console.log(content);
|
|
222
|
+
}
|
|
223
|
+
history.push({ role: 'assistant', content });
|
|
224
|
+
logger.append('assistant', { content });
|
|
225
|
+
}
|
|
226
|
+
function fillDefaults(conversation) {
|
|
227
|
+
const answers = {
|
|
228
|
+
building: 'A customer support agent for an ecommerce business',
|
|
229
|
+
posture: '',
|
|
230
|
+
scale: 'Team of 5, around 2000 support tickets and orders per month',
|
|
231
|
+
tasks: 'triage refunds, draft support replies, assemble chargeback evidence',
|
|
232
|
+
budget: '$199 monthly budget with low per-call costs',
|
|
233
|
+
confirm: 'Confirmed',
|
|
234
|
+
};
|
|
235
|
+
while (conversation.currentQuestion()) {
|
|
236
|
+
const question = conversation.currentQuestion();
|
|
237
|
+
if (!question)
|
|
238
|
+
break;
|
|
239
|
+
conversation.answer(answers[question.id] ?? 'Confirmed');
|
|
240
|
+
conversation.next();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function advisorQuestionPrompt(id) {
|
|
244
|
+
return `Acknowledge the ${id} answer in 2 short sentences. Ask only the next unanswered setup question. Do not write files yet.`;
|
|
245
|
+
}
|
|
246
|
+
function profileSummaryPrompt(profile) {
|
|
247
|
+
return `Prepare a concise final setup summary for this profile before files are written: ${JSON.stringify(profile)}. Include projected savings math in words. Do not invent model names or pricing.`;
|
|
248
|
+
}
|
|
249
|
+
function parseOptions(argv) {
|
|
250
|
+
const baseUrl = valueAfter(argv, '--base-url');
|
|
251
|
+
const providerFlag = valueAfter(argv, '--provider');
|
|
252
|
+
const provider = providerFlag ?? (baseUrl ? 'compatible' : 'openrouter');
|
|
253
|
+
const language = valueAfter(argv, '--language');
|
|
254
|
+
const postureValue = valueAfter(argv, '--posture');
|
|
255
|
+
const posture = postureValue === 'custom' ? 'custom' : (0, posture_1.normalizePosture)(postureValue);
|
|
256
|
+
return {
|
|
257
|
+
provider,
|
|
258
|
+
baseUrl,
|
|
259
|
+
model: valueAfter(argv, '--model'),
|
|
260
|
+
language: language === 'py' ? 'py' : language === 'ts' ? 'ts' : undefined,
|
|
261
|
+
posture: posture ?? undefined,
|
|
262
|
+
defaults: argv.includes('--defaults'),
|
|
263
|
+
yes: argv.includes('--yes') || argv.includes('-y'),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function valueAfter(argv, flag) {
|
|
267
|
+
const index = argv.indexOf(flag);
|
|
268
|
+
return index >= 0 ? argv[index + 1] : undefined;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor.js","sourceRoot":"","sources":["../../src/cli/advisor.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwElF"}
|
package/dist/cli/main.js
CHANGED
|
@@ -45,6 +45,7 @@ usage:
|
|
|
45
45
|
agentguard <command> [options]
|
|
46
46
|
|
|
47
47
|
commands:
|
|
48
|
+
advisor Local LLM setup that writes policy.yaml and quickstart code.
|
|
48
49
|
wizard Guided setup for policy.yaml and quickstarts.
|
|
49
50
|
models Browse models, sync OpenRouter pricing, update policy.
|
|
50
51
|
auth Configure local provider keys.
|
|
@@ -61,6 +62,7 @@ commands:
|
|
|
61
62
|
|
|
62
63
|
examples:
|
|
63
64
|
agentguard auth openrouter
|
|
65
|
+
agentguard advisor
|
|
64
66
|
agentguard wizard
|
|
65
67
|
agentguard models --sync-pricing
|
|
66
68
|
agentguard models --task payment-approval
|
|
@@ -87,6 +89,10 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
87
89
|
const { maybeShowStartupTips } = await Promise.resolve().then(() => __importStar(require('./tips')));
|
|
88
90
|
maybeShowStartupTips(showTips);
|
|
89
91
|
}
|
|
92
|
+
if (command === 'advisor') {
|
|
93
|
+
const { runAdvisor } = await Promise.resolve().then(() => __importStar(require('./advisor')));
|
|
94
|
+
return runAdvisor(rest);
|
|
95
|
+
}
|
|
90
96
|
if (command === 'wizard') {
|
|
91
97
|
const { runWizard } = await Promise.resolve().then(() => __importStar(require('./wizard')));
|
|
92
98
|
return runWizard(rest);
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,11 +12,14 @@ export { canonicalJson, sha256Hex, computeEntryHash, computeSignerFingerprint, s
|
|
|
12
12
|
export { InMemorySpendStore } from './store-memory';
|
|
13
13
|
export { telemetryStatus, enableTelemetry, disableTelemetry, resetTelemetryInstallId, recordTelemetryEvent, type TelemetryStatus, } from './telemetry';
|
|
14
14
|
export { fetchCatalog, getCachedCatalog, syncPricingIntoCostTable, persistOverrides, modelCostFromOpenRouter, type OpenRouterCatalog, type OpenRouterModel, type SyncPricingResult, } from './openrouter-catalog';
|
|
15
|
+
export { AdvisorConversation, buildBusinessProfile, buildPolicyFromProfile, projectedSavings, type AdvisorBusinessProfile, type ProjectedSavings, } from './advisor/conversation';
|
|
16
|
+
export { createAdvisorClient, resolveAdvisorApiKey, type AdvisorClient, type AdvisorProvider } from './advisor/llm-client';
|
|
17
|
+
export { createAdvisorSessionLogger, writeAdvisorOutputs, type AdvisorOutputs } from './advisor/output';
|
|
15
18
|
export { SpendGuard, withSpendGuard, AgentGuardBlockedError, type SpendGuardConfig, type OpenAIBindingOptions, type StreamSettlementOptions, type StreamSettlementResult, } from './spend-guard';
|
|
16
19
|
export { withSpendGuardAnthropic, type AnthropicBindingOptions } from './bindings/anthropic';
|
|
17
20
|
export { withSpendGuardBedrock, type BedrockBindingOptions } from './bindings/bedrock';
|
|
18
21
|
export { DEFAULT_LOCALE, SUPPORTED_LOCALES, TRANSLATIONS, type SupportedLocale, resolveLocale, t, formatBlockedTrace, type BlockedTraceArgs, } from './i18n';
|
|
19
|
-
export declare const AGENTGUARD_SPEND_VERSION = "0.
|
|
22
|
+
export declare const AGENTGUARD_SPEND_VERSION = "0.4.1";
|
|
20
23
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
21
24
|
export declare const PATENT_NOTICE: string;
|
|
22
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,YAAY,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,KAAK,SAAS,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAGlF,OAAO,EACL,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,YAAY,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,EACf,KAAK,SAAS,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAGlF,OAAO,EACL,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3H,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxG,OAAO,EACL,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,uBAAuB,EAAE,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,eAAe,EACpB,aAAa,EACb,CAAC,EACD,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAEhD,2DAA2D;AAC3D,eAAO,MAAM,aAAa,QAG8B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* 64/071,781; 64/071,789).
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
10
|
+
exports.t = exports.resolveLocale = exports.TRANSLATIONS = exports.SUPPORTED_LOCALES = exports.DEFAULT_LOCALE = exports.withSpendGuardBedrock = exports.withSpendGuardAnthropic = exports.AgentGuardBlockedError = exports.withSpendGuard = exports.SpendGuard = exports.writeAdvisorOutputs = exports.createAdvisorSessionLogger = exports.resolveAdvisorApiKey = exports.createAdvisorClient = exports.projectedSavings = exports.buildPolicyFromProfile = exports.buildBusinessProfile = exports.AdvisorConversation = exports.modelCostFromOpenRouter = exports.persistOverrides = exports.syncPricingIntoCostTable = exports.getCachedCatalog = exports.fetchCatalog = exports.recordTelemetryEvent = exports.resetTelemetryInstallId = exports.disableTelemetry = exports.enableTelemetry = exports.telemetryStatus = exports.InMemorySpendStore = exports.InMemoryDecisionLogStore = exports.GENESIS_PREVIOUS_HASH = exports.verifyChain = exports.verifyEntry = exports.signDecision = exports.computeSignerFingerprint = exports.computeEntryHash = exports.sha256Hex = exports.canonicalJson = exports.adjustPolicyWindowSpend = exports.buildScopeKey = exports.evaluatePolicy = exports.knownModelCosts = exports.persistCostOverrides = exports.loadPersistedCostOverrides = exports.listCostOverrides = exports.inferProvider = exports.computeCallCents = exports.clearCostOverrides = exports.setCostOverride = exports.getModelCost = void 0;
|
|
11
|
+
exports.PATENT_NOTICE = exports.AGENTGUARD_SPEND_VERSION = exports.formatBlockedTrace = void 0;
|
|
11
12
|
const telemetry_1 = require("./telemetry");
|
|
12
13
|
// Cost table
|
|
13
14
|
var cost_table_1 = require("./cost-table");
|
|
@@ -53,6 +54,18 @@ Object.defineProperty(exports, "getCachedCatalog", { enumerable: true, get: func
|
|
|
53
54
|
Object.defineProperty(exports, "syncPricingIntoCostTable", { enumerable: true, get: function () { return openrouter_catalog_1.syncPricingIntoCostTable; } });
|
|
54
55
|
Object.defineProperty(exports, "persistOverrides", { enumerable: true, get: function () { return openrouter_catalog_1.persistOverrides; } });
|
|
55
56
|
Object.defineProperty(exports, "modelCostFromOpenRouter", { enumerable: true, get: function () { return openrouter_catalog_1.modelCostFromOpenRouter; } });
|
|
57
|
+
// Advisor local setup
|
|
58
|
+
var conversation_1 = require("./advisor/conversation");
|
|
59
|
+
Object.defineProperty(exports, "AdvisorConversation", { enumerable: true, get: function () { return conversation_1.AdvisorConversation; } });
|
|
60
|
+
Object.defineProperty(exports, "buildBusinessProfile", { enumerable: true, get: function () { return conversation_1.buildBusinessProfile; } });
|
|
61
|
+
Object.defineProperty(exports, "buildPolicyFromProfile", { enumerable: true, get: function () { return conversation_1.buildPolicyFromProfile; } });
|
|
62
|
+
Object.defineProperty(exports, "projectedSavings", { enumerable: true, get: function () { return conversation_1.projectedSavings; } });
|
|
63
|
+
var llm_client_1 = require("./advisor/llm-client");
|
|
64
|
+
Object.defineProperty(exports, "createAdvisorClient", { enumerable: true, get: function () { return llm_client_1.createAdvisorClient; } });
|
|
65
|
+
Object.defineProperty(exports, "resolveAdvisorApiKey", { enumerable: true, get: function () { return llm_client_1.resolveAdvisorApiKey; } });
|
|
66
|
+
var output_1 = require("./advisor/output");
|
|
67
|
+
Object.defineProperty(exports, "createAdvisorSessionLogger", { enumerable: true, get: function () { return output_1.createAdvisorSessionLogger; } });
|
|
68
|
+
Object.defineProperty(exports, "writeAdvisorOutputs", { enumerable: true, get: function () { return output_1.writeAdvisorOutputs; } });
|
|
56
69
|
// Core wrapper
|
|
57
70
|
var spend_guard_1 = require("./spend-guard");
|
|
58
71
|
Object.defineProperty(exports, "SpendGuard", { enumerable: true, get: function () { return spend_guard_1.SpendGuard; } });
|
|
@@ -70,7 +83,7 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
|
|
|
70
83
|
Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
|
|
71
84
|
Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
|
|
72
85
|
Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
|
|
73
|
-
exports.AGENTGUARD_SPEND_VERSION = '0.
|
|
86
|
+
exports.AGENTGUARD_SPEND_VERSION = '0.4.1';
|
|
74
87
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
75
88
|
exports.PATENT_NOTICE = 'Protected by U.S. patent-pending technology ' +
|
|
76
89
|
'(App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; ' +
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;AAEH,2CAA8E;AAmB9E,aAAa;AACb,2CAWsB;AAVpB,0GAAA,YAAY,OAAA;AACZ,6GAAA,eAAe,OAAA;AACf,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AACb,+GAAA,iBAAiB,OAAA;AACjB,wHAAA,0BAA0B,OAAA;AAC1B,kHAAA,oBAAoB,OAAA;AACpB,6GAAA,eAAe,OAAA;AAIjB,gBAAgB;AAChB,mCAAkF;AAAzE,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,iHAAA,uBAAuB,OAAA;AAE/D,eAAe;AACf,+CAUwB;AATtB,6GAAA,aAAa,OAAA;AACb,yGAAA,SAAS,OAAA;AACT,gHAAA,gBAAgB,OAAA;AAChB,wHAAA,wBAAwB,OAAA;AACxB,4GAAA,YAAY,OAAA;AACZ,2GAAA,WAAW,OAAA;AACX,2GAAA,WAAW,OAAA;AACX,qHAAA,qBAAqB,OAAA;AACrB,wHAAA,wBAAwB,OAAA;AAG1B,wBAAwB;AACxB,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAE3B,qBAAqB;AACrB,yCAOqB;AANnB,4GAAA,eAAe,OAAA;AACf,4GAAA,eAAe,OAAA;AACf,6GAAA,gBAAgB,OAAA;AAChB,oHAAA,uBAAuB,OAAA;AACvB,iHAAA,oBAAoB,OAAA;AAItB,qBAAqB;AACrB,2DAS8B;AAR5B,kHAAA,YAAY,OAAA;AACZ,sHAAA,gBAAgB,OAAA;AAChB,8HAAA,wBAAwB,OAAA;AACxB,sHAAA,gBAAgB,OAAA;AAChB,6HAAA,uBAAuB,OAAA;AAOzB,sBAAsB;AACtB,uDAOgC;AAN9B,mHAAA,mBAAmB,OAAA;AACnB,oHAAA,oBAAoB,OAAA;AACpB,sHAAA,sBAAsB,OAAA;AACtB,gHAAA,gBAAgB,OAAA;AAIlB,mDAA2H;AAAlH,iHAAA,mBAAmB,OAAA;AAAE,kHAAA,oBAAoB,OAAA;AAClD,2CAAwG;AAA/F,oHAAA,0BAA0B,OAAA;AAAE,6GAAA,mBAAmB,OAAA;AAExD,eAAe;AACf,6CAQuB;AAPrB,yGAAA,UAAU,OAAA;AACV,6GAAA,cAAc,OAAA;AACd,qHAAA,sBAAsB,OAAA;AAOxB,kDAA6F;AAApF,oHAAA,uBAAuB,OAAA;AAChC,8CAAuF;AAA9E,gHAAA,qBAAqB,OAAA;AAE9B,sCAAsC;AACtC,+BASgB;AARd,sGAAA,cAAc,OAAA;AACd,yGAAA,iBAAiB,OAAA;AACjB,oGAAA,YAAY,OAAA;AAEZ,qGAAA,aAAa,OAAA;AACb,yFAAA,CAAC,OAAA;AACD,0GAAA,kBAAkB,OAAA;AAIP,QAAA,wBAAwB,GAAG,OAAO,CAAC;AAEhD,2DAA2D;AAC9C,QAAA,aAAa,GACxB,8CAA8C;IAC9C,6DAA6D;IAC7D,sDAAsD,CAAC;AACzD,IAAA,gCAAuB,EAAC,UAAU,CAAC,CAAC"}
|
package/dist/telemetry.js
CHANGED
|
@@ -43,7 +43,7 @@ const https = __importStar(require("https"));
|
|
|
43
43
|
const os = __importStar(require("os"));
|
|
44
44
|
const path = __importStar(require("path"));
|
|
45
45
|
const crypto_1 = require("crypto");
|
|
46
|
-
const AGENTGUARD_SPEND_VERSION = '0.
|
|
46
|
+
const AGENTGUARD_SPEND_VERSION = '0.4.1';
|
|
47
47
|
const STATE_DIR = path.join(os.homedir(), '.agentguard');
|
|
48
48
|
const INSTALL_PATH = path.join(STATE_DIR, 'install.json');
|
|
49
49
|
const BEACON_URL = 'https://agentguard.run/api/beacon';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentguard-run/spend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Local-runtime spend caps and capability-gated model routing for AI agents. Prompts, API keys, and signing keys stay inside the customer runtime. Zero data plane involvement.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -39,6 +39,11 @@
|
|
|
39
39
|
"types": "./dist/templates/index.d.ts",
|
|
40
40
|
"require": "./dist/templates/index.js",
|
|
41
41
|
"default": "./dist/templates/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./advisor": {
|
|
44
|
+
"types": "./dist/advisor/conversation.d.ts",
|
|
45
|
+
"require": "./dist/advisor/conversation.js",
|
|
46
|
+
"default": "./dist/advisor/conversation.js"
|
|
42
47
|
}
|
|
43
48
|
},
|
|
44
49
|
"bin": {
|
|
@@ -58,7 +63,9 @@
|
|
|
58
63
|
"src/cli/models.ts",
|
|
59
64
|
"src/cli/tips.ts",
|
|
60
65
|
"src/cli/wizard.ts",
|
|
61
|
-
"src/bindings"
|
|
66
|
+
"src/bindings",
|
|
67
|
+
"src/advisor",
|
|
68
|
+
"src/cli/advisor.ts"
|
|
62
69
|
],
|
|
63
70
|
"scripts": {
|
|
64
71
|
"build": "tsc",
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentGuard(TM) Spend: local Advisor anomaly review skeleton.
|
|
3
|
+
*
|
|
4
|
+
* Reads local decision logs only. No network calls are made.
|
|
5
|
+
*
|
|
6
|
+
* Patent notice: Protected by U.S. patent-pending technology
|
|
7
|
+
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
8
|
+
* 64/071,781; 64/071,789).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { agentguardHome } from './output';
|
|
14
|
+
|
|
15
|
+
export interface AdvisorSpendPoint {
|
|
16
|
+
ts: string;
|
|
17
|
+
scope: string;
|
|
18
|
+
agentId: string;
|
|
19
|
+
cents: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface AdvisorAnomaly {
|
|
23
|
+
scope: string;
|
|
24
|
+
agentId: string;
|
|
25
|
+
last24hCents: number;
|
|
26
|
+
baselineCents: number;
|
|
27
|
+
sigmaCents: number;
|
|
28
|
+
suggestion: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function readDecisionSpend(scope = 'default', home = agentguardHome()): AdvisorSpendPoint[] {
|
|
32
|
+
const file = path.join(home, scope, 'decisions.ndjson');
|
|
33
|
+
if (!fs.existsSync(file)) return [];
|
|
34
|
+
const points: AdvisorSpendPoint[] = [];
|
|
35
|
+
for (const line of fs.readFileSync(file, 'utf8').split('\n')) {
|
|
36
|
+
if (!line.trim()) continue;
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(line);
|
|
39
|
+
const decision = parsed.decision ?? parsed;
|
|
40
|
+
const cents = Number(decision.actualCents ?? decision.projectedCents ?? 0);
|
|
41
|
+
const ts = String(decision.timestamp ?? parsed.timestamp ?? new Date(0).toISOString());
|
|
42
|
+
const scopeObj = decision.scope ?? {};
|
|
43
|
+
points.push({
|
|
44
|
+
ts,
|
|
45
|
+
scope: String(scopeObj.tenantId ?? decision.triggeredScopeKey ?? scope),
|
|
46
|
+
agentId: String(scopeObj.agentId ?? decision.agentId ?? 'unknown'),
|
|
47
|
+
cents: Number.isFinite(cents) ? cents : 0,
|
|
48
|
+
});
|
|
49
|
+
} catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return points;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function reviewAnomalies(points: AdvisorSpendPoint[], now = new Date()): AdvisorAnomaly[] {
|
|
57
|
+
const cutoff = now.getTime() - 24 * 60 * 60 * 1000;
|
|
58
|
+
const byAgent = new Map<string, AdvisorSpendPoint[]>();
|
|
59
|
+
for (const point of points) {
|
|
60
|
+
const key = `${point.scope}\t${point.agentId}`;
|
|
61
|
+
byAgent.set(key, [...(byAgent.get(key) ?? []), point]);
|
|
62
|
+
}
|
|
63
|
+
const anomalies: AdvisorAnomaly[] = [];
|
|
64
|
+
for (const [key, rows] of byAgent) {
|
|
65
|
+
const [scope, agentId] = key.split('\t');
|
|
66
|
+
const daily = bucketDaily(rows);
|
|
67
|
+
const historical = daily.filter((row) => row.day < dayKey(new Date(cutoff))).map((row) => row.cents);
|
|
68
|
+
const recent = rows.filter((row) => Date.parse(row.ts) >= cutoff).reduce((sum, row) => sum + row.cents, 0);
|
|
69
|
+
if (historical.length < 3 || recent <= 0) continue;
|
|
70
|
+
const mean = historical.reduce((sum, value) => sum + value, 0) / historical.length;
|
|
71
|
+
const variance = historical.reduce((sum, value) => sum + Math.pow(value - mean, 2), 0) / historical.length;
|
|
72
|
+
const sigma = Math.sqrt(variance);
|
|
73
|
+
if (recent > mean + 3 * sigma) {
|
|
74
|
+
anomalies.push({
|
|
75
|
+
scope: scope ?? 'unknown',
|
|
76
|
+
agentId: agentId ?? 'unknown',
|
|
77
|
+
last24hCents: recent,
|
|
78
|
+
baselineCents: Math.round(mean),
|
|
79
|
+
sigmaCents: Math.round(sigma),
|
|
80
|
+
suggestion: 'Lower the per_day cap or add a per_minute block cap for this agent.',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return anomalies.sort((a, b) => b.last24hCents - a.last24hCents);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function bucketDaily(points: AdvisorSpendPoint[]): Array<{ day: string; cents: number }> {
|
|
88
|
+
const buckets = new Map<string, number>();
|
|
89
|
+
for (const point of points) {
|
|
90
|
+
const day = dayKey(new Date(point.ts));
|
|
91
|
+
buckets.set(day, (buckets.get(day) ?? 0) + point.cents);
|
|
92
|
+
}
|
|
93
|
+
return [...buckets.entries()].map(([day, cents]) => ({ day, cents })).sort((a, b) => a.day.localeCompare(b.day));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function dayKey(date: Date): string {
|
|
97
|
+
return date.toISOString().slice(0, 10);
|
|
98
|
+
}
|