@salimassili/ai-costguard 1.2.0 → 2.0.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.
Files changed (75) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE +21 -0
  3. package/README.md +281 -103
  4. package/benchmarks/run.mjs +229 -0
  5. package/dist/cli.d.ts +50 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +178 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/CostGuard.d.ts +3 -4
  10. package/dist/core/CostGuard.d.ts.map +1 -1
  11. package/dist/core/CostGuard.js +1 -2
  12. package/dist/core/CostGuard.js.map +1 -1
  13. package/dist/core/GuardCore.d.ts +93 -13
  14. package/dist/core/GuardCore.d.ts.map +1 -1
  15. package/dist/core/GuardCore.js +372 -158
  16. package/dist/core/GuardCore.js.map +1 -1
  17. package/dist/core/GuardFree.d.ts +42 -18
  18. package/dist/core/GuardFree.d.ts.map +1 -1
  19. package/dist/core/GuardFree.js +95 -140
  20. package/dist/core/GuardFree.js.map +1 -1
  21. package/dist/core/GuardPro.d.ts +85 -5
  22. package/dist/core/GuardPro.d.ts.map +1 -1
  23. package/dist/core/GuardPro.js +216 -121
  24. package/dist/core/GuardPro.js.map +1 -1
  25. package/dist/core/event-log.d.ts +37 -0
  26. package/dist/core/event-log.d.ts.map +1 -0
  27. package/dist/core/event-log.js +49 -0
  28. package/dist/core/event-log.js.map +1 -0
  29. package/dist/core/events.d.ts +20 -0
  30. package/dist/core/events.d.ts.map +1 -0
  31. package/dist/core/events.js +46 -0
  32. package/dist/core/events.js.map +1 -0
  33. package/dist/core/similarity.d.ts +13 -0
  34. package/dist/core/similarity.d.ts.map +1 -0
  35. package/dist/core/similarity.js +51 -0
  36. package/dist/core/similarity.js.map +1 -0
  37. package/dist/core/tokenizer.d.ts +18 -0
  38. package/dist/core/tokenizer.d.ts.map +1 -0
  39. package/dist/core/tokenizer.js +137 -0
  40. package/dist/core/tokenizer.js.map +1 -0
  41. package/dist/core/types.d.ts +153 -5
  42. package/dist/core/types.d.ts.map +1 -1
  43. package/dist/core/types.js +0 -3
  44. package/dist/core/types.js.map +1 -1
  45. package/dist/core/webhooks.d.ts +15 -0
  46. package/dist/core/webhooks.d.ts.map +1 -0
  47. package/dist/core/webhooks.js +58 -0
  48. package/dist/core/webhooks.js.map +1 -0
  49. package/dist/dashboard.d.ts +73 -0
  50. package/dist/dashboard.d.ts.map +1 -0
  51. package/dist/dashboard.js +201 -0
  52. package/dist/dashboard.js.map +1 -0
  53. package/dist/index.d.ts +3 -4
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/pricing/index.d.ts +19 -2
  58. package/dist/pricing/index.d.ts.map +1 -1
  59. package/dist/pricing/index.js +93 -13
  60. package/dist/pricing/index.js.map +1 -1
  61. package/dist/pro.d.ts +3 -0
  62. package/dist/pro.d.ts.map +1 -0
  63. package/dist/pro.js +2 -0
  64. package/dist/pro.js.map +1 -0
  65. package/docs/BENCHMARKS.md +51 -0
  66. package/docs/DASHBOARD.md +61 -0
  67. package/docs/INTEGRATIONS.md +153 -0
  68. package/examples/integrations/anthropic-workflow-budget.mjs +36 -0
  69. package/examples/integrations/ci-budget-check.mjs +32 -0
  70. package/examples/integrations/crewai-budget-gate.mjs +31 -0
  71. package/examples/integrations/langchain-retry-storm.mjs +32 -0
  72. package/examples/integrations/mastra-agent.mjs +41 -0
  73. package/examples/integrations/openai-agent-loop.mjs +44 -0
  74. package/examples/integrations/vercel-ai-chatbot.mjs +29 -0
  75. package/package.json +35 -7
@@ -1,176 +1,390 @@
1
+ import { getPricing } from '../pricing/index.js';
2
+ import { appendGuardEventLog } from './event-log.js';
3
+ import { GuardEventEmitter } from './events.js';
4
+ import { cosineSimilarity, maxCosineSimilarity } from './similarity.js';
5
+ import { estimateRequestTokens } from './tokenizer.js';
6
+ import { notifyBlockWebhooks } from './webhooks.js';
7
+ const DEFAULT_BUDGET = 10;
8
+ const DEFAULT_MAX_HISTORY = 32;
9
+ const DEFAULT_HISTORY_TTL_MS = 5 * 60 * 1000;
10
+ const DEFAULT_LOOP_THRESHOLD = 0.85;
11
+ const DEFAULT_LOOP_MIN_REPEATS = 2;
12
+ const DEFAULT_RETRY_THRESHOLD = 2;
13
+ const DEFAULT_GUARDED_METHODS = [
14
+ 'chat.completions.create',
15
+ 'completions.create',
16
+ 'responses.create',
17
+ 'messages.create',
18
+ ];
19
+ const RETRY_TERMS = /\b(retry|retries|retrying|rerun|repeat|again)\b/u;
20
+ const FAILURE_TERMS = /\b(error|fail|failed|failure|timeout|timed out|rate limit|429|unavailable|exception)\b/u;
1
21
  /**
2
- * GuardCore.ts - FREE CORE (VIRAL ENGINE)
3
- *
4
- * Maximum simplicity. Maximum virality. Zero complexity.
5
- * Instant safety layer every AI developer installs by default.
22
+ * Error thrown when a guarded request is blocked before reaching the AI provider.
6
23
  */
7
- import { getPricing as lookupPricing } from '../pricing/index.js';
8
- /**
9
- * Guard your AI client from wasting money
10
- * FREE CORE: Local protection + viral logs + real-time risk warnings
11
- */
12
- export function guard(client, config, sharedState) {
13
- const defaults = {
14
- budget: 10
15
- };
16
- const guardConfig = { ...defaults, ...config };
17
- const state = sharedState || {
18
- requestCount: 0,
19
- totalCost: 0,
20
- lastRequestTime: 0,
21
- blockedCount: 0,
22
- };
23
- return new Proxy(client, {
24
- get(target, prop) {
25
- const value = target[prop];
26
- if (typeof value === 'function') {
27
- return (...args) => {
28
- const ctx = extractContext(args, prop);
29
- // Budget check (FREE CORE - LOCAL ONLY)
30
- if (state.totalCost + ctx.estimatedCost > guardConfig.budget) {
31
- const saved = guardConfig.budget - state.totalCost;
32
- state.blockedCount++;
33
- // VIRAL LOG FORMAT + RISK WARNING
34
- console.error(`[GUARD] blocked budget → saved $${saved.toFixed(2)}`);
35
- console.error(`⚠️ This would cost $${(saved * 5).toFixed(0)}+ in production`);
36
- console.error(`⚠️ Not safely preventable in free mode`);
37
- console.error(`🔥 Upgrade required to fully protect production systems in real-time`);
38
- throw new GuardError(`Budget exceeded`, ctx);
39
- }
40
- // Loop detection (FREE CORE - LOCAL ONLY)
41
- if (isLoop(ctx.prompt, state)) {
42
- const saved = ctx.estimatedCost * 10; // Estimate loop savings
43
- state.blockedCount++;
44
- // VIRAL LOG FORMAT + RISK WARNING
45
- console.error(`[GUARD] blocked loop → saved $${saved.toFixed(2)}`);
46
- console.error(`⚠️ This would cost $${(saved * 8).toFixed(0)}+ in production`);
47
- console.error(`⚠️ Not safely preventable in free mode`);
48
- console.error(`🔥 Upgrade required to fully protect production systems in real-time`);
49
- throw new GuardError(`Loop detected`, ctx);
50
- }
51
- // Repeated failure detection (FREE CORE - LOCAL ONLY)
52
- if (isRepeatedFailure(ctx.prompt, state)) {
53
- const saved = ctx.estimatedCost * 5; // Estimate failure savings
54
- state.blockedCount++;
55
- // VIRAL LOG FORMAT + RISK WARNING
56
- console.error(`[GUARD] blocked failure → saved $${saved.toFixed(2)}`);
57
- console.error(`⚠️ This would cost $${(saved * 6).toFixed(0)}+ in production`);
58
- console.error(`⚠️ Not safely preventable in free mode`);
59
- console.error(`🔥 Upgrade required to fully protect production systems in real-time`);
60
- throw new GuardError(`Repeated failure detected`, ctx);
61
- }
62
- // Update state (LOCAL ONLY)
63
- state.requestCount++;
64
- state.totalCost += ctx.estimatedCost;
65
- state.lastRequestTime = Date.now();
66
- return value.apply(target, args);
67
- };
68
- }
69
- // Handle nested objects (LOCAL ONLY)
70
- if (value && typeof value === 'object') {
71
- return guard(value, guardConfig, state);
72
- }
73
- return value;
74
- },
75
- });
24
+ export class GuardError extends Error {
25
+ /** Stable machine-readable block reason. */
26
+ code;
27
+ /** Request context that caused the block. */
28
+ context;
29
+ /** Structured error metadata for API responses and logging. */
30
+ metadata;
31
+ /**
32
+ * Creates a GuardError for a blocked request.
33
+ */
34
+ constructor(message, context = createEmptyContext(), code = 'BUDGET_EXCEEDED', metadata = {}) {
35
+ super(message);
36
+ this.name = 'GuardError';
37
+ this.code = code;
38
+ this.context = context;
39
+ this.metadata = {
40
+ code,
41
+ reason: message,
42
+ context,
43
+ scopeKey: context.scopeKey ?? 'default',
44
+ ...metadata,
45
+ };
46
+ }
47
+ toJSON() {
48
+ return this.metadata;
49
+ }
76
50
  }
77
51
  /**
78
- * Express middleware (FREE CORE - LOCAL ONLY)
52
+ * Shared synchronous evaluator used by the free proxy guard and middleware.
79
53
  */
80
- export function middleware(config) {
81
- const guardConfig = { ...config, budget: config.budget || 10 };
82
- return (req, res, next) => {
83
- req.guard = {
84
- state: {
85
- requestCount: 0,
86
- totalCost: 0,
87
- lastRequestTime: 0,
88
- blockedCount: 0,
54
+ export class GuardCore {
55
+ config;
56
+ state;
57
+ emitter = new GuardEventEmitter();
58
+ /**
59
+ * Creates a process-local guard evaluator.
60
+ */
61
+ constructor(config = {}, sharedState = createGuardState()) {
62
+ this.config = {
63
+ budget: config.budget ?? DEFAULT_BUDGET,
64
+ behaviorAnalysis: config.behaviorAnalysis ?? true,
65
+ maxHistory: config.maxHistory ?? DEFAULT_MAX_HISTORY,
66
+ historyTtlMs: Math.max(0, config.historyTtlMs ?? DEFAULT_HISTORY_TTL_MS),
67
+ maxSteps: config.maxSteps,
68
+ loopSimilarityThreshold: config.loopSimilarityThreshold ?? DEFAULT_LOOP_THRESHOLD,
69
+ loopMinRepeats: Math.max(1, Math.trunc(config.loopMinRepeats ?? DEFAULT_LOOP_MIN_REPEATS)),
70
+ retryThreshold: Math.max(1, Math.trunc(config.retryThreshold ?? DEFAULT_RETRY_THRESHOLD)),
71
+ guardedMethods: config.guardedMethods ?? [...DEFAULT_GUARDED_METHODS],
72
+ unknownModelPolicy: config.unknownModelPolicy ?? 'block',
73
+ unknownModelPricing: config.unknownModelPricing,
74
+ pricingOverrides: config.pricingOverrides,
75
+ scope: config.scope,
76
+ eventLogPath: config.eventLogPath,
77
+ eventLogPrompt: config.eventLogPrompt ?? 'none',
78
+ slackWebhook: config.slackWebhook,
79
+ discordWebhook: config.discordWebhook,
80
+ webhooks: {
81
+ ...config.webhooks,
82
+ slack: config.webhooks?.slack ?? config.slackWebhook,
83
+ discord: config.webhooks?.discord ?? config.discordWebhook,
89
84
  },
90
- check: (ctx) => {
91
- if (req.guard.state.totalCost + ctx.estimatedCost > guardConfig.budget) {
92
- console.error(`⚠️ This would cost $${(ctx.estimatedCost * 5).toFixed(0)}+ in production`);
93
- console.error(`⚠️ Not safely preventable in free mode`);
94
- console.error(`🔥 Upgrade required to fully protect production systems in real-time`);
95
- throw new GuardError('Budget exceeded', ctx);
96
- }
97
- if (isLoop(ctx.prompt, req.guard.state)) {
98
- console.error(`⚠️ This would cost $${(ctx.estimatedCost * 8).toFixed(0)}+ in production`);
99
- console.error(`⚠️ Not safely preventable in free mode`);
100
- console.error(`🔥 Upgrade required to fully protect production systems in real-time`);
101
- throw new GuardError('Loop detected', ctx);
102
- }
103
- if (isRepeatedFailure(ctx.prompt, req.guard.state)) {
104
- console.error(`⚠️ This would cost $${(ctx.estimatedCost * 6).toFixed(0)}+ in production`);
105
- console.error(`⚠️ Not safely preventable in free mode`);
106
- console.error(`🔥 Upgrade required to fully protect production systems in real-time`);
107
- throw new GuardError('Repeated failure detected', ctx);
108
- }
109
- req.guard.state.requestCount++;
110
- req.guard.state.totalCost += ctx.estimatedCost;
85
+ };
86
+ this.state = sharedState;
87
+ hydrateScopeState(this.state);
88
+ this.state.scopes ??= {};
89
+ }
90
+ /**
91
+ * Subscribes to guard events.
92
+ */
93
+ on(eventName, handler) {
94
+ return this.emitter.on(eventName, handler);
95
+ }
96
+ /**
97
+ * Removes a guard event handler.
98
+ */
99
+ off(eventName, handler) {
100
+ this.emitter.off(eventName, handler);
101
+ }
102
+ /**
103
+ * Returns the mutable process-local state used by this evaluator.
104
+ */
105
+ getState() {
106
+ return this.state;
107
+ }
108
+ /**
109
+ * Returns true when a proxied method path should be evaluated.
110
+ */
111
+ shouldGuardMethod(methodPath) {
112
+ return this.config.guardedMethods.includes(methodPath);
113
+ }
114
+ /**
115
+ * Extracts a normalized request context from OpenAI-like method arguments.
116
+ */
117
+ extractContext(args, method) {
118
+ const params = args[0];
119
+ const record = isRecord(params) ? params : {};
120
+ const model = typeof record.model === 'string' && record.model.trim() ? record.model.trim() : 'unknown';
121
+ const tokenEstimate = estimateRequestTokens(record);
122
+ const registryPricing = getPricing(model, this.config.pricingOverrides);
123
+ const pricing = registryPricing ?? (this.config.unknownModelPolicy === 'fallback' ? this.config.unknownModelPricing : undefined);
124
+ const inputPer1kTokens = pricing?.inputPer1kTokens ?? 0;
125
+ const outputPer1kTokens = pricing?.outputPer1kTokens ?? 0;
126
+ const estimatedCost = (tokenEstimate.inputTokens / 1000) * inputPer1kTokens +
127
+ (tokenEstimate.outputTokens / 1000) * outputPer1kTokens;
128
+ const scope = this.extractScope(record);
129
+ const scopeKey = createScopeKey(scope);
130
+ return {
131
+ model,
132
+ pricingKnown: pricing !== undefined,
133
+ pricing,
134
+ tokens: tokenEstimate.tokens,
135
+ inputTokens: tokenEstimate.inputTokens,
136
+ outputTokens: tokenEstimate.outputTokens,
137
+ estimatedCost,
138
+ timestamp: Date.now(),
139
+ prompt: tokenEstimate.prompt.slice(0, 4000),
140
+ method,
141
+ scope,
142
+ scopeKey,
143
+ };
144
+ }
145
+ /**
146
+ * Checks a request context, records allowed calls, emits events, and throws GuardError on block.
147
+ */
148
+ check(context) {
149
+ const scope = this.getScopeState(context);
150
+ this.pruneScope(scope, Date.now());
151
+ this.recordAttempt(scope, context);
152
+ this.emit('cost', context);
153
+ if (context.pricingKnown === false) {
154
+ return this.block('UNKNOWN_MODEL', `No pricing found for model "${context.model}".`, context);
155
+ }
156
+ const budgetDecision = this.checkBudget(scope, context);
157
+ if (budgetDecision)
158
+ return this.block('BUDGET_EXCEEDED', budgetDecision, context);
159
+ if (this.config.behaviorAnalysis) {
160
+ const stepDecision = this.checkMaxSteps(scope);
161
+ if (stepDecision)
162
+ return this.block('MAX_STEPS_EXCEEDED', stepDecision, context);
163
+ const loop = this.findLoopSimilarity(scope, context.prompt);
164
+ if (loop.count >= this.config.loopMinRepeats) {
165
+ return this.block('LOOP_DETECTED', `Loop detected: ${loop.count} recent prompts at similarity ${loop.max.toFixed(2)} or higher`, context, loop.max);
111
166
  }
167
+ const retryDecision = this.checkRetryStorm(scope, context);
168
+ if (retryDecision)
169
+ return this.block('RETRY_STORM_DETECTED', retryDecision.reason, context, retryDecision.similarity);
170
+ }
171
+ this.recordAllowed(scope, context);
172
+ this.emit('allow', context);
173
+ return { decision: 'allow', context };
174
+ }
175
+ /**
176
+ * Reconciles actual provider usage from OpenAI/Anthropic-like response objects when available.
177
+ */
178
+ recordActualUsage(context, response) {
179
+ if (!context.pricing)
180
+ return;
181
+ const usage = extractUsage(response);
182
+ if (!usage)
183
+ return;
184
+ const inputTokens = usage.inputTokens ?? context.inputTokens ?? 0;
185
+ const outputTokens = usage.outputTokens ?? context.outputTokens ?? 0;
186
+ const actualCost = (inputTokens / 1000) * context.pricing.inputPer1kTokens +
187
+ (outputTokens / 1000) * context.pricing.outputPer1kTokens;
188
+ if (!Number.isFinite(actualCost) || actualCost < 0)
189
+ return;
190
+ context.actualCost = actualCost;
191
+ this.state.actualCost += actualCost;
192
+ const scope = this.getScopeState(context);
193
+ scope.actualCost += actualCost;
194
+ }
195
+ checkBudget(scope, context) {
196
+ if (scope.totalCost + context.estimatedCost <= this.config.budget)
197
+ return undefined;
198
+ return `Budget exceeded: estimated $${(scope.totalCost + context.estimatedCost).toFixed(6)} / $${this.config.budget.toFixed(6)}`;
199
+ }
200
+ checkMaxSteps(scope) {
201
+ if (this.config.maxSteps === undefined || scope.requestCount < this.config.maxSteps)
202
+ return undefined;
203
+ return `Max steps exceeded: ${scope.requestCount + 1} > ${this.config.maxSteps}`;
204
+ }
205
+ findLoopSimilarity(scope, prompt) {
206
+ if (!prompt.trim())
207
+ return { max: 0, count: 0 };
208
+ const history = scope.recentPrompts?.map((entry) => entry.prompt) ?? [];
209
+ const max = maxCosineSimilarity(prompt, history);
210
+ const count = history.filter((candidate) => cosineSimilarity(prompt, candidate) >= this.config.loopSimilarityThreshold).length;
211
+ return { max, count };
212
+ }
213
+ checkRetryStorm(scope, context) {
214
+ if (!hasRetrySignal(context.prompt))
215
+ return undefined;
216
+ const recentRetries = scope.recentRetries ?? [];
217
+ const retrySimilarity = maxCosineSimilarity(context.prompt, recentRetries.map((entry) => entry.prompt));
218
+ if (retrySimilarity >= this.config.loopSimilarityThreshold) {
219
+ return { reason: `Retry storm detected: retry similarity ${retrySimilarity.toFixed(2)}`, similarity: retrySimilarity };
220
+ }
221
+ if (recentRetries.length >= this.config.retryThreshold) {
222
+ return { reason: `Retry storm detected: ${recentRetries.length + 1} retry/failure prompts` };
223
+ }
224
+ return undefined;
225
+ }
226
+ recordAttempt(scope, context) {
227
+ this.state.attemptedCost += context.estimatedCost;
228
+ scope.attemptedCost += context.estimatedCost;
229
+ }
230
+ recordAllowed(scope, context) {
231
+ this.state.requestCount += 1;
232
+ this.state.totalCost += context.estimatedCost;
233
+ this.state.lastRequestTime = Date.now();
234
+ scope.requestCount += 1;
235
+ scope.totalCost += context.estimatedCost;
236
+ scope.lastRequestTime = this.state.lastRequestTime;
237
+ this.pushHistory(scope, 'recentPrompts', context.prompt);
238
+ if (hasRetrySignal(context.prompt)) {
239
+ this.pushHistory(scope, 'recentRetries', context.prompt);
240
+ }
241
+ }
242
+ pushHistory(scope, key, prompt) {
243
+ if (!prompt.trim())
244
+ return;
245
+ const history = scope[key] ?? [];
246
+ history.push({ prompt, timestamp: Date.now() });
247
+ while (history.length > this.config.maxHistory) {
248
+ history.shift();
249
+ }
250
+ scope[key] = history;
251
+ }
252
+ block(code, reason, context, similarity) {
253
+ const scope = this.getScopeState(context);
254
+ this.state.blockedCount += 1;
255
+ this.state.blockedCost += context.estimatedCost;
256
+ scope.blockedCount += 1;
257
+ scope.blockedCost += context.estimatedCost;
258
+ this.emit('block', context, reason, code);
259
+ void notifyBlockWebhooks(this.config.webhooks, { reason, context });
260
+ throw new GuardError(reason, context, code, { similarity, scopeKey: context.scopeKey ?? 'default' });
261
+ }
262
+ emit(type, context, reason, code) {
263
+ const event = {
264
+ type,
265
+ context,
266
+ code,
267
+ reason,
268
+ state: { ...this.state, scopes: { ...this.state.scopes } },
269
+ };
270
+ appendGuardEventLog(this.config.eventLogPath, event, this.config.eventLogPrompt);
271
+ this.emitter.emit(event);
272
+ }
273
+ getScopeState(context) {
274
+ const scopeKey = context.scopeKey ?? createScopeKey(context.scope);
275
+ this.state.scopes ??= {};
276
+ const existing = this.state.scopes[scopeKey];
277
+ if (existing) {
278
+ hydrateScopeState(existing);
279
+ return existing;
280
+ }
281
+ const fresh = createScopeState();
282
+ this.state.scopes[scopeKey] = fresh;
283
+ return fresh;
284
+ }
285
+ pruneScope(scope, now) {
286
+ if (this.config.historyTtlMs === 0)
287
+ return;
288
+ const minTimestamp = now - this.config.historyTtlMs;
289
+ scope.recentPrompts = (scope.recentPrompts ?? []).filter((entry) => entry.timestamp >= minTimestamp);
290
+ scope.recentRetries = (scope.recentRetries ?? []).filter((entry) => entry.timestamp >= minTimestamp);
291
+ scope.sessionExpiresAt = now + this.config.historyTtlMs;
292
+ }
293
+ extractScope(record) {
294
+ return {
295
+ projectId: readString(record.projectId ?? record.project_id) ?? this.config.scope?.projectId,
296
+ userId: readString(record.userId ?? record.user_id) ?? this.config.scope?.userId,
297
+ sessionId: readString(record.sessionId ?? record.session_id) ?? this.config.scope?.sessionId,
112
298
  };
113
- next();
299
+ }
300
+ }
301
+ /**
302
+ * Creates an empty process-local guard state.
303
+ */
304
+ export function createGuardState() {
305
+ return {
306
+ ...createScopeState(),
307
+ scopes: {},
114
308
  };
115
309
  }
116
- // Simple loop detection (FREE CORE - LOCAL ONLY)
117
- function isLoop(prompt, state) {
118
- const promptHash = prompt.slice(0, 100); // First 100 chars
119
- const recentHashes = state.recentHashes || [];
120
- const count = recentHashes.filter((h) => h === promptHash).length;
121
- // Update recent hashes (LOCAL ONLY)
122
- recentHashes.push(promptHash);
123
- if (recentHashes.length > 10)
124
- recentHashes.shift();
125
- state.recentHashes = recentHashes;
126
- return count >= 2; // Loop on 3rd occurrence
310
+ function createScopeState() {
311
+ return {
312
+ requestCount: 0,
313
+ totalCost: 0,
314
+ attemptedCost: 0,
315
+ blockedCost: 0,
316
+ actualCost: 0,
317
+ lastRequestTime: 0,
318
+ blockedCount: 0,
319
+ recentPrompts: [],
320
+ recentRetries: [],
321
+ };
127
322
  }
128
- // Simple repeated failure detection (FREE CORE - LOCAL ONLY)
129
- function isRepeatedFailure(prompt, state) {
130
- const failureKeywords = ['error', 'fail', 'retry', 'again', 'repeat'];
131
- const hasFailureKeyword = failureKeywords.some(keyword => prompt.toLowerCase().includes(keyword));
132
- if (!hasFailureKeyword)
133
- return false;
134
- const recentFailures = state.recentFailures || [];
135
- const recentFailureCount = recentFailures.filter((f) => f).length;
136
- recentFailures.push(true);
137
- if (recentFailures.length > 5)
138
- recentFailures.shift();
139
- state.recentFailures = recentFailures;
140
- return recentFailureCount >= 2;
323
+ function hydrateScopeState(state) {
324
+ state.requestCount ??= 0;
325
+ state.totalCost ??= 0;
326
+ state.attemptedCost ??= state.totalCost ?? 0;
327
+ state.blockedCost ??= 0;
328
+ state.actualCost ??= 0;
329
+ state.lastRequestTime ??= 0;
330
+ state.blockedCount ??= 0;
331
+ state.recentPrompts ??= [];
332
+ state.recentRetries ??= [];
141
333
  }
142
- // Extract request context (FREE CORE - LOCAL ONLY)
143
- function extractContext(args, prop) {
144
- const params = args[0] || {};
145
- const model = params.model || 'unknown';
146
- const messages = params.messages || [];
147
- const prompt = messages.map((m) => m.content).join(' ').slice(0, 200);
148
- // Estimate tokens and cost
149
- const inputText = JSON.stringify(messages);
150
- const estimatedInputTokens = Math.ceil(inputText.length / 4);
151
- const maxOutputTokens = params.max_tokens || 1000;
152
- const tokens = estimatedInputTokens + maxOutputTokens;
153
- const pricing = lookupPricing(model);
154
- const inputPer1kTokens = pricing?.inputPer1kTokens ?? 0.01;
155
- const outputPer1kTokens = pricing?.outputPer1kTokens ?? 0.03;
156
- const estimatedCost = (estimatedInputTokens / 1000) * inputPer1kTokens +
157
- (maxOutputTokens / 1000) * outputPer1kTokens;
334
+ function createEmptyContext() {
158
335
  return {
159
- model,
160
- tokens,
161
- estimatedCost,
336
+ model: 'unknown',
337
+ pricingKnown: false,
338
+ tokens: 0,
339
+ inputTokens: 0,
340
+ outputTokens: 0,
341
+ estimatedCost: 0,
162
342
  timestamp: Date.now(),
163
- prompt,
343
+ prompt: '',
344
+ scopeKey: 'default',
164
345
  };
165
346
  }
166
- // Custom error (FREE CORE - LOCAL ONLY)
167
- export class GuardError extends Error {
168
- context;
169
- constructor(message, context) {
170
- super(message);
171
- this.name = 'GuardError';
172
- this.context = context;
173
- }
347
+ function createScopeKey(scope) {
348
+ const projectId = normalizeScopePart(scope?.projectId);
349
+ const userId = normalizeScopePart(scope?.userId);
350
+ const sessionId = normalizeScopePart(scope?.sessionId);
351
+ if (!projectId && !userId && !sessionId)
352
+ return 'default';
353
+ return `project:${projectId ?? '*'}|user:${userId ?? '*'}|session:${sessionId ?? '*'}`;
354
+ }
355
+ function normalizeScopePart(value) {
356
+ const normalized = value?.trim();
357
+ return normalized ? normalized : undefined;
358
+ }
359
+ function hasRetrySignal(prompt) {
360
+ const normalized = prompt.toLowerCase();
361
+ if (/\bretry(?:ing|ies)?\b/u.test(normalized))
362
+ return true;
363
+ return RETRY_TERMS.test(normalized) && FAILURE_TERMS.test(normalized);
364
+ }
365
+ function extractUsage(response) {
366
+ if (!isRecord(response) || !isRecord(response.usage))
367
+ return undefined;
368
+ const usage = response.usage;
369
+ const inputTokens = readPositiveNumber(usage.prompt_tokens) ??
370
+ readPositiveNumber(usage.input_tokens) ??
371
+ readPositiveNumber(usage.inputTokens);
372
+ const outputTokens = readPositiveNumber(usage.completion_tokens) ??
373
+ readPositiveNumber(usage.output_tokens) ??
374
+ readPositiveNumber(usage.outputTokens);
375
+ if (inputTokens === undefined && outputTokens === undefined)
376
+ return undefined;
377
+ return { inputTokens, outputTokens };
378
+ }
379
+ function readString(value) {
380
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
381
+ }
382
+ function readPositiveNumber(value) {
383
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0)
384
+ return undefined;
385
+ return value;
386
+ }
387
+ function isRecord(value) {
388
+ return typeof value === 'object' && value !== null;
174
389
  }
175
- export { getPricing } from '../pricing/index.js';
176
390
  //# sourceMappingURL=GuardCore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GuardCore.js","sourceRoot":"","sources":["../../src/core/GuardCore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GuardCore.js","sourceRoot":"","sources":["../../src/core/GuardCore.ts"],"names":[],"mappings":"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"}