@salimassili/ai-costguard 2.1.4 → 2.2.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
@@ -1,6 +1,6 @@
1
1
  # AI CostGuard
2
2
  [![npm version](https://img.shields.io/npm/v/@salimassili/ai-costguard)](https://www.npmjs.com/package/@salimassili/ai-costguard)
3
- [![AI CostGuard Pro](https://img.shields.io/badge/Pro-$19%2Fmo-orange)](https://salimassili.lemonsqueezy.com/buy/ai-costguard-pro)
3
+ [![AI CostGuard Pro](https://img.shields.io/badge/Pro-$49%2Fmo-orange)](https://salimassili.lemonsqueezy.com/buy/ai-costguard-pro)
4
4
 
5
5
  AI CostGuard is a local-first runtime safety layer for AI agents that prevents runaway costs, loops, retries, and budget explosions before API calls execute. It wraps OpenAI-compatible clients and function-style SDK calls, estimates request cost locally, blocks budget overruns, detects repeated prompts, emits structured events, and exposes CLI checks plus a local dashboard.
6
6
 
@@ -147,10 +147,15 @@ Current runtime block codes:
147
147
  ## Configuration
148
148
 
149
149
  ```ts
150
- guard(client, {
151
- budget: 10,
152
- maxSteps: 100,
153
- behaviorAnalysis: true,
150
+ guard(client, {
151
+ budget: {
152
+ maxUsd: 10,
153
+ thresholdPercent: 0.8,
154
+ },
155
+ projectId: 'production-api',
156
+ runId: 'optional-agent-run',
157
+ maxSteps: 100,
158
+ behaviorAnalysis: true,
154
159
  maxHistory: 32,
155
160
  historyTtlMs: 5 * 60 * 1000,
156
161
  loopDetection: {
@@ -163,10 +168,16 @@ guard(client, {
163
168
  projectId: 'production-api',
164
169
  userId: 'optional-user',
165
170
  sessionId: 'optional-agent-run',
166
- },
167
- guardedMethods: ['chat.completions.create', 'responses.create'],
168
- pricingOverrides: [],
169
- webhooks: {
171
+ },
172
+ alerts: {
173
+ webhookUrl: process.env.COSTGUARD_WEBHOOK_URL,
174
+ events: ['blocked', 'threshold'],
175
+ timeoutMs: 1500,
176
+ format: 'slack',
177
+ },
178
+ guardedMethods: ['chat.completions.create', 'responses.create'],
179
+ pricingOverrides: [],
180
+ webhooks: {
170
181
  slack: process.env.SLACK_WEBHOOK,
171
182
  discord: process.env.DISCORD_WEBHOOK,
172
183
  retries: 2,
@@ -176,8 +187,9 @@ guard(client, {
176
187
  eventLogPrompt: 'none',
177
188
  });
178
189
  ```
179
-
180
- `scope` isolates budgets and behavior history. If no scope is supplied, the guard uses one process-local default scope.
190
+
191
+ `scope` isolates budgets and behavior history. If no scope is supplied, the guard uses one process-local default scope.
192
+ Top-level `projectId` and `runId` are convenience aliases for alert payloads and default scope values.
181
193
 
182
194
  ## Loop Detection Tuning
183
195
 
@@ -291,9 +303,9 @@ registerTokenizer(/^claude-/u, (text) => {
291
303
 
292
304
  String patterns match model-name substrings case-insensitively. `RegExp` patterns are tested against the original model string. If a registered tokenizer throws or returns an invalid count, AI CostGuard falls back to the built-in approximation and keeps guarding the call.
293
305
 
294
- ## Events
295
-
296
- ```ts
306
+ ## Events
307
+
308
+ ```ts
297
309
  const unsubscribe = openai.on('block', (event) => {
298
310
  console.log(event.code, event.reason, event.context.estimatedCost);
299
311
  });
@@ -301,7 +313,54 @@ const unsubscribe = openai.on('block', (event) => {
301
313
  unsubscribe();
302
314
  ```
303
315
 
304
- Supported events are `cost`, `allow`, and `block`. Handler errors are swallowed so observability code cannot change guard decisions.
316
+ Supported events are `cost`, `allow`, and `block`. Handler errors are swallowed so observability code cannot change guard decisions.
317
+
318
+ ## Slack / Webhook Alerts
319
+
320
+ Alerts are optional, local-first, and sent only to a webhook URL you provide. They are best-effort: failed or slow alert delivery never allows a blocked provider call, never replaces `GuardError`, and never crashes your app.
321
+ If `alerts.events` is omitted, only `blocked` alerts are sent. `threshold` alerts require `events: ['threshold']` or `events: ['blocked', 'threshold']` plus `budget.thresholdPercent` or `budget.thresholdUsd`.
322
+
323
+ ```ts
324
+ import { guard } from '@salimassili/ai-costguard';
325
+
326
+ const safeClient = guard(openai, {
327
+ budget: { maxUsd: 5, thresholdPercent: 0.8 },
328
+ projectId: 'demo-agent',
329
+ runId: 'run-2026-06-16',
330
+ alerts: {
331
+ webhookUrl: process.env.COSTGUARD_WEBHOOK_URL,
332
+ events: ['blocked', 'threshold'],
333
+ timeoutMs: 1500,
334
+ format: 'slack',
335
+ },
336
+ });
337
+ ```
338
+
339
+ If `format` is omitted, AI CostGuard sends a redacted JSON payload:
340
+
341
+ ```json
342
+ {
343
+ "event": "blocked",
344
+ "reason": "budget_exceeded",
345
+ "severity": "critical",
346
+ "projectId": "demo-agent",
347
+ "runId": "run-2026-06-16",
348
+ "model": "gpt-4",
349
+ "provider": "openai",
350
+ "estimatedCostUsd": 0.0306,
351
+ "estimatedSavedUsd": 0.0306,
352
+ "budgetLimitUsd": 5,
353
+ "budgetUsedUsd": 4.99,
354
+ "timestamp": "2026-06-16T00:00:00.000Z",
355
+ "packageName": "@salimassili/ai-costguard"
356
+ }
357
+ ```
358
+
359
+ For Slack incoming webhooks, use `format: 'slack'` or `slack: true`. AI CostGuard sends a Slack-compatible `{ "text": "..." }` body.
360
+
361
+ Alerts do not include raw prompts, request bodies, headers, API keys, environment variables, or webhook URLs. Do not commit webhook URLs; load them from environment variables or your secret manager. Alerts are not SaaS telemetry, a billing ledger, provider invoice reconciliation, or a hard security boundary.
362
+
363
+ Legacy `webhooks.slack`, `webhooks.discord`, `slackWebhook`, and `discordWebhook` block notifications remain supported for compatibility. New code should prefer `alerts`.
305
364
 
306
365
  ## Local Dashboard
307
366
 
@@ -344,9 +403,10 @@ Runnable mocked examples are included for:
344
403
  - Anthropic SDK workflow budget guard
345
404
  - Vercel AI SDK chatbot budget cap
346
405
  - LangChain retry-storm prevention
347
- - Mastra-style agent runner protection
348
- - CrewAI launch/budget gate
349
- - CI budget checks
406
+ - Mastra-style agent runner protection
407
+ - CrewAI launch/budget gate
408
+ - Local webhook and Slack alert mocks
409
+ - CI budget checks
350
410
 
351
411
  See `docs/INTEGRATIONS.md` and `examples/integrations`.
352
412
 
@@ -389,11 +449,19 @@ Redis-backed shared spend tracking is isolated behind a subpath import:
389
449
  ```ts
390
450
  import { GuardPro } from '@salimassili/ai-costguard/pro';
391
451
 
392
- const pro = new GuardPro({
393
- redisUrl: process.env.REDIS_URL ?? '',
394
- budget: 25,
395
- windowSeconds: 86400,
396
- });
452
+ const pro = new GuardPro({
453
+ redisUrl: process.env.REDIS_URL ?? '',
454
+ budget: { maxUsd: 25, thresholdPercent: 0.8 },
455
+ windowSeconds: 86400,
456
+ projectId: 'production-agent',
457
+ runId: process.env.DEPLOYMENT_ID,
458
+ alerts: {
459
+ webhookUrl: process.env.COSTGUARD_WEBHOOK_URL,
460
+ events: ['blocked', 'threshold'],
461
+ timeoutMs: 1500,
462
+ format: 'slack',
463
+ },
464
+ });
397
465
 
398
466
  await pro.checkAndCharge('production', 0.0042);
399
467
  await pro.shutdown();
@@ -407,13 +475,17 @@ AI CostGuard does not include license-key checks or local commercial-license enf
407
475
 
408
476
  AI CostGuard Free is the open-source npm package above — free forever, MIT licensed.
409
477
 
410
- **AI CostGuard Pro** is a $19/month or $199/year subscription for teams taking AI agents into production. Lemon Squeezy handles purchase, receipts, and subscription management. The npm package does not perform runtime license-key enforcement.
411
-
412
- Current `pro-v0.1` materials include:
413
-
414
- - Redis/GuardPro setup guide
415
- - Multi-process shared-budget example
416
- - Environment-variable based Redis/webhook configuration guidance
478
+ **AI CostGuard Pro Self-Serve $49/month** is a production setup bundle for teams taking Node.js AI agents into production. Lemon Squeezy handles purchase, receipts, and subscription management. The npm package does not perform runtime license-key enforcement.
479
+
480
+ Current `pro-v0.1` materials include:
481
+
482
+ - Slack/webhook and threshold alert recipes
483
+ - Redis/GuardPro setup guide
484
+ - Multi-process shared-budget example
485
+ - CI budget gate
486
+ - Vercel AI and Express production examples
487
+ - Production deployment guide
488
+ - Environment-variable based Redis/webhook configuration guidance
417
489
 
418
490
  Planned monthly updates include multi-tenant examples, tokenizer adapter recipes, `GuardError` handling patterns, pricing override guides, production checklists, and framework config starters as those files are completed.
419
491
 
@@ -4,5 +4,5 @@ export { BUILTIN_PRICING_LAST_UPDATED, getPricing, getPricingMeta, registerPrici
4
4
  export type { ModelPricing, PricingMeta } from '../pricing/index.js';
5
5
  export { registerTokenizer } from './tokenizer.js';
6
6
  export type { TokenizerFn } from './tokenizer.js';
7
- export type { GuardConfig, GuardErrorCode, GuardEvent, GuardEventHandler, GuardEventName, GuardScope, GuardState, GuardWebhookConfig, RequestContext, } from './types.js';
7
+ export type { GuardConfig, GuardBudgetConfig, CostGuardAlertsConfig, CostGuardAlertEvent, CostGuardAlertPayload, CostGuardAlertSeverity, GuardErrorCode, GuardEvent, GuardEventHandler, GuardEventName, GuardScope, GuardState, GuardWebhookConfig, RequestContext, } from './types.js';
8
8
  //# sourceMappingURL=CostGuard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CostGuard.d.ts","sourceRoot":"","sources":["../../src/core/CostGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7H,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"CostGuard.d.ts","sourceRoot":"","sources":["../../src/core/CostGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7H,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -51,6 +51,7 @@ export declare class GuardCore {
51
51
  private readonly state;
52
52
  private readonly emitter;
53
53
  private readonly approximateTokenWarnings;
54
+ private readonly thresholdAlertedScopes;
54
55
  /**
55
56
  * Creates a process-local guard evaluator.
56
57
  */
@@ -96,6 +97,8 @@ export declare class GuardCore {
96
97
  private pruneScope;
97
98
  private extractScope;
98
99
  private warnApproximateTokens;
100
+ private alertThresholdIfNeeded;
101
+ private createAlertPayload;
99
102
  }
100
103
  /**
101
104
  * Creates an empty process-local guard state.
@@ -1 +1 @@
1
- {"version":3,"file":"GuardCore.d.ts","sourceRoot":"","sources":["../../src/core/GuardCore.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EAGd,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAoBpB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,0CAA0C;IAC1C,OAAO,EAAE,cAAc,CAAC;IACxB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,cAAc,CAAC;IACrB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAEtC;;OAEG;gBAED,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAqC,EAC9C,IAAI,GAAE,cAAkC,EACxC,QAAQ,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAe5C,MAAM,IAAI,kBAAkB;CAG7B;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAyBrB;IACF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAqB;IAE9D;;OAEG;gBACS,MAAM,GAAE,WAAgB,EAAE,WAAW,GAAE,UAA+B;IAsClF;;OAEG;IACH,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAIrE;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIhE;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc;IAkCzE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB;IAqChD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAoBnE,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,qBAAqB;CAU9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAK7C"}
1
+ {"version":3,"file":"GuardCore.d.ts","sourceRoot":"","sources":["../../src/core/GuardCore.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EAGd,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAiDpB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,0CAA0C;IAC1C,OAAO,EAAE,cAAc,CAAC;IACxB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,cAAc,CAAC;IACrB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAEtC;;OAEG;gBAED,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAqC,EAC9C,IAAI,GAAE,cAAkC,EACxC,QAAQ,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAe5C,MAAM,IAAI,kBAAkB;CAG7B;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAqB;IAC9D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqB;IAE5D;;OAEG;gBACS,MAAM,GAAE,WAAgB,EAAE,WAAW,GAAE,UAA+B;IA0ClF;;OAEG;IACH,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAIrE;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIhE;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc;IAmCzE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB;IAuChD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAoBnE,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,KAAK;IAsBb,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,kBAAkB;CAwB3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAK7C"}
@@ -1,4 +1,5 @@
1
1
  import { getPricing } from '../pricing/index.js';
2
+ import { sendCostGuardAlert } from './alerts.js';
2
3
  import { appendGuardEventLog } from './event-log.js';
3
4
  import { GuardEventEmitter } from './events.js';
4
5
  import { cosineSimilarity, maxCosineSimilarity } from './similarity.js';
@@ -57,6 +58,7 @@ export class GuardCore {
57
58
  state;
58
59
  emitter = new GuardEventEmitter();
59
60
  approximateTokenWarnings = new Set();
61
+ thresholdAlertedScopes = new Set();
60
62
  /**
61
63
  * Creates a process-local guard evaluator.
62
64
  */
@@ -65,8 +67,11 @@ export class GuardCore {
65
67
  const loopMinRepeats = config.loopDetection?.minHistorySize ?? config.loopMinRepeats ?? DEFAULT_LOOP_MIN_REPEATS;
66
68
  const loopWindowSize = config.loopDetection?.windowSize ?? DEFAULT_LOOP_WINDOW_SIZE;
67
69
  validateLoopConfig(loopSimilarityThreshold, loopMinRepeats, loopWindowSize);
70
+ const budget = normalizeBudget(config.budget);
71
+ const scope = normalizeConfigScope(config);
68
72
  this.config = {
69
- budget: config.budget ?? DEFAULT_BUDGET,
73
+ budget: budget.maxUsd,
74
+ budgetThresholdUsd: budget.thresholdUsd,
70
75
  behaviorAnalysis: config.behaviorAnalysis ?? true,
71
76
  maxHistory: config.maxHistory ?? DEFAULT_MAX_HISTORY,
72
77
  historyTtlMs: Math.max(0, config.historyTtlMs ?? DEFAULT_HISTORY_TTL_MS),
@@ -79,7 +84,8 @@ export class GuardCore {
79
84
  unknownModelPolicy: config.unknownModelPolicy ?? 'block',
80
85
  unknownModelPricing: config.unknownModelPricing,
81
86
  pricingOverrides: config.pricingOverrides,
82
- scope: config.scope,
87
+ scope,
88
+ alerts: normalizeAlerts(config.alerts),
83
89
  eventLogPath: config.eventLogPath,
84
90
  eventLogPrompt: config.eventLogPrompt ?? 'none',
85
91
  slackWebhook: config.slackWebhook,
@@ -135,8 +141,8 @@ export class GuardCore {
135
141
  const pricing = registryPricing ?? (this.config.unknownModelPolicy === 'fallback' ? this.config.unknownModelPricing : undefined);
136
142
  const inputPer1kTokens = pricing?.inputPer1kTokens ?? 0;
137
143
  const outputPer1kTokens = pricing?.outputPer1kTokens ?? 0;
138
- const estimatedCost = (tokenEstimate.inputTokens / 1000) * inputPer1kTokens +
139
- (tokenEstimate.outputTokens / 1000) * outputPer1kTokens;
144
+ const estimatedCost = sanitizeMoney((tokenEstimate.inputTokens / 1000) * inputPer1kTokens +
145
+ (tokenEstimate.outputTokens / 1000) * outputPer1kTokens);
140
146
  return {
141
147
  model,
142
148
  pricingKnown: pricing !== undefined,
@@ -157,6 +163,7 @@ export class GuardCore {
157
163
  * Checks a request context, records allowed calls, emits events, and throws GuardError on block.
158
164
  */
159
165
  check(context) {
166
+ normalizeRequestContext(context);
160
167
  const scope = this.getScopeState(context);
161
168
  this.pruneScope(scope, Date.now());
162
169
  this.recordAttempt(scope, context);
@@ -181,6 +188,7 @@ export class GuardCore {
181
188
  }
182
189
  this.recordAllowed(scope, context);
183
190
  this.emit('allow', context);
191
+ this.alertThresholdIfNeeded(scope, context);
184
192
  return { decision: 'allow', context };
185
193
  }
186
194
  /**
@@ -270,6 +278,10 @@ export class GuardCore {
270
278
  scope.blockedCost += context.estimatedCost;
271
279
  this.emit('block', context, reason, code);
272
280
  void notifyBlockWebhooks(this.config.webhooks, { reason, context });
281
+ void sendCostGuardAlert(this.config.alerts, this.createAlertPayload('blocked', codeToAlertReason(code), 'critical', context, {
282
+ estimatedSavedUsd: context.estimatedCost,
283
+ budgetUsedUsd: scope.totalCost,
284
+ }));
273
285
  throw new GuardError(reason, context, code, { similarity, scopeKey: context.scopeKey ?? 'default' });
274
286
  }
275
287
  emit(type, context, reason, code) {
@@ -308,6 +320,7 @@ export class GuardCore {
308
320
  projectId: readString(record.projectId ?? record.project_id) ?? this.config.scope?.projectId,
309
321
  userId: readString(record.userId ?? record.user_id) ?? this.config.scope?.userId,
310
322
  sessionId: readString(record.sessionId ?? record.session_id) ?? this.config.scope?.sessionId,
323
+ runId: readString(record.runId ?? record.run_id) ?? this.config.scope?.runId,
311
324
  };
312
325
  }
313
326
  warnApproximateTokens(model, scopeKey) {
@@ -318,6 +331,35 @@ export class GuardCore {
318
331
  console.warn(`[ai-costguard] Using approximate token counting for model: ${model}. ` +
319
332
  'Register an exact tokenizer via registerTokenizer() for production use.');
320
333
  }
334
+ alertThresholdIfNeeded(scope, context) {
335
+ const thresholdUsd = this.config.budgetThresholdUsd;
336
+ if (thresholdUsd === undefined || scope.totalCost < thresholdUsd)
337
+ return;
338
+ const scopeKey = context.scopeKey ?? createScopeKey(context.scope);
339
+ if (this.thresholdAlertedScopes.has(scopeKey))
340
+ return;
341
+ this.thresholdAlertedScopes.add(scopeKey);
342
+ void sendCostGuardAlert(this.config.alerts, this.createAlertPayload('threshold', 'budget_threshold', 'warning', context, {
343
+ budgetUsedUsd: scope.totalCost,
344
+ }));
345
+ }
346
+ createAlertPayload(event, reason, severity, context, money = {}) {
347
+ return {
348
+ event,
349
+ reason,
350
+ severity,
351
+ projectId: context.scope?.projectId,
352
+ runId: context.scope?.runId ?? context.scope?.sessionId,
353
+ model: context.model === 'unknown' ? undefined : context.model,
354
+ provider: inferProvider(context.model),
355
+ estimatedCostUsd: roundMoney(context.estimatedCost),
356
+ estimatedSavedUsd: money.estimatedSavedUsd === undefined ? undefined : roundMoney(money.estimatedSavedUsd),
357
+ budgetLimitUsd: roundMoney(this.config.budget),
358
+ budgetUsedUsd: money.budgetUsedUsd === undefined ? undefined : roundMoney(money.budgetUsedUsd),
359
+ timestamp: new Date().toISOString(),
360
+ packageName: '@salimassili/ai-costguard',
361
+ };
362
+ }
321
363
  }
322
364
  /**
323
365
  * Creates an empty process-local guard state.
@@ -352,6 +394,65 @@ function hydrateScopeState(state) {
352
394
  state.recentPrompts ??= [];
353
395
  state.recentRetries ??= [];
354
396
  }
397
+ function normalizeBudget(configBudget) {
398
+ if (configBudget === undefined)
399
+ return { maxUsd: DEFAULT_BUDGET };
400
+ if (typeof configBudget === 'number') {
401
+ return { maxUsd: validateMoney(configBudget, 'budget') };
402
+ }
403
+ if (!isRecord(configBudget)) {
404
+ throw new Error('budget must be a non-negative number or { maxUsd } object');
405
+ }
406
+ const maxUsd = validateMoney(configBudget.maxUsd, 'budget.maxUsd');
407
+ const thresholdUsd = configBudget.thresholdUsd === undefined
408
+ ? normalizeThresholdPercent(configBudget.thresholdPercent, maxUsd)
409
+ : validateMoney(configBudget.thresholdUsd, 'budget.thresholdUsd');
410
+ if (thresholdUsd !== undefined && thresholdUsd > maxUsd) {
411
+ throw new Error('budget threshold must be less than or equal to budget.maxUsd');
412
+ }
413
+ return { maxUsd, thresholdUsd };
414
+ }
415
+ function normalizeThresholdPercent(value, maxUsd) {
416
+ if (value === undefined)
417
+ return undefined;
418
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || value > 1) {
419
+ throw new Error('budget.thresholdPercent must be a number greater than 0 and less than or equal to 1');
420
+ }
421
+ return maxUsd * value;
422
+ }
423
+ function normalizeConfigScope(config) {
424
+ const projectId = readString(config.scope?.projectId) ?? readString(config.projectId);
425
+ const userId = readString(config.scope?.userId);
426
+ const sessionId = readString(config.scope?.sessionId);
427
+ const runId = readString(config.scope?.runId) ?? readString(config.runId);
428
+ if (!projectId && !userId && !sessionId && !runId)
429
+ return undefined;
430
+ return {
431
+ projectId,
432
+ userId,
433
+ sessionId,
434
+ runId,
435
+ };
436
+ }
437
+ function normalizeAlerts(alerts) {
438
+ if (!alerts)
439
+ return undefined;
440
+ if (alerts.timeoutMs !== undefined && (!Number.isFinite(alerts.timeoutMs) || alerts.timeoutMs < 0)) {
441
+ throw new Error('alerts.timeoutMs must be a non-negative number');
442
+ }
443
+ if (alerts.format !== undefined && alerts.format !== 'json' && alerts.format !== 'slack') {
444
+ throw new Error('alerts.format must be "json" or "slack"');
445
+ }
446
+ for (const event of alerts.events ?? []) {
447
+ if (event !== 'blocked' && event !== 'threshold') {
448
+ throw new Error('alerts.events can only include "blocked" or "threshold"');
449
+ }
450
+ }
451
+ return {
452
+ ...alerts,
453
+ webhookUrl: readString(alerts.webhookUrl),
454
+ };
455
+ }
355
456
  function validateLoopConfig(similarityThreshold, minHistorySize, windowSize) {
356
457
  if (!Number.isFinite(similarityThreshold) || similarityThreshold < 0 || similarityThreshold > 1) {
357
458
  throw new Error('loopDetection.similarityThreshold must be between 0 and 1');
@@ -363,6 +464,16 @@ function validateLoopConfig(similarityThreshold, minHistorySize, windowSize) {
363
464
  throw new Error('loopDetection.windowSize must be at least 1');
364
465
  }
365
466
  }
467
+ function normalizeRequestContext(context) {
468
+ context.model = readString(context.model) ?? 'unknown';
469
+ context.tokens = sanitizeCount(context.tokens);
470
+ context.inputTokens = context.inputTokens === undefined ? undefined : sanitizeCount(context.inputTokens);
471
+ context.outputTokens = context.outputTokens === undefined ? undefined : sanitizeCount(context.outputTokens);
472
+ context.estimatedCost = sanitizeMoney(context.estimatedCost);
473
+ context.actualCost = context.actualCost === undefined ? undefined : sanitizeMoney(context.actualCost);
474
+ context.timestamp = Number.isFinite(context.timestamp) ? context.timestamp : Date.now();
475
+ context.prompt = typeof context.prompt === 'string' ? context.prompt : '';
476
+ }
366
477
  function createEmptyContext() {
367
478
  return {
368
479
  model: 'unknown',
@@ -380,9 +491,10 @@ function createScopeKey(scope) {
380
491
  const projectId = normalizeScopePart(scope?.projectId);
381
492
  const userId = normalizeScopePart(scope?.userId);
382
493
  const sessionId = normalizeScopePart(scope?.sessionId);
383
- if (!projectId && !userId && !sessionId)
494
+ const runId = normalizeScopePart(scope?.runId);
495
+ if (!projectId && !userId && !sessionId && !runId)
384
496
  return 'default';
385
- return `project:${projectId ?? '*'}|user:${userId ?? '*'}|session:${sessionId ?? '*'}`;
497
+ return `project:${projectId ?? '*'}|user:${userId ?? '*'}|session:${sessionId ?? '*'}|run:${runId ?? '*'}`;
386
498
  }
387
499
  function normalizeScopePart(value) {
388
500
  const normalized = value?.trim();
@@ -416,6 +528,48 @@ function readPositiveNumber(value) {
416
528
  return undefined;
417
529
  return value;
418
530
  }
531
+ function validateMoney(value, field) {
532
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
533
+ throw new Error(`${field} must be a non-negative finite number`);
534
+ }
535
+ return value;
536
+ }
537
+ function sanitizeMoney(value) {
538
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0)
539
+ return 0;
540
+ return value;
541
+ }
542
+ function sanitizeCount(value) {
543
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0)
544
+ return 0;
545
+ return Math.trunc(value);
546
+ }
547
+ function roundMoney(value) {
548
+ return Math.round(sanitizeMoney(value) * 1_000_000) / 1_000_000;
549
+ }
550
+ function codeToAlertReason(code) {
551
+ switch (code) {
552
+ case 'UNKNOWN_MODEL':
553
+ return 'unknown_model';
554
+ case 'BUDGET_EXCEEDED':
555
+ return 'budget_exceeded';
556
+ case 'MAX_STEPS_EXCEEDED':
557
+ return 'max_steps_exceeded';
558
+ case 'LOOP_DETECTED':
559
+ return 'loop_detected';
560
+ case 'RETRY_STORM_DETECTED':
561
+ return 'retry_storm';
562
+ }
563
+ }
564
+ function inferProvider(model) {
565
+ const normalized = model.toLowerCase();
566
+ if (normalized.startsWith('gpt-') || normalized.startsWith('o1') || normalized.startsWith('o3')) {
567
+ return 'openai';
568
+ }
569
+ if (normalized.startsWith('claude-'))
570
+ return 'anthropic';
571
+ return undefined;
572
+ }
419
573
  function isRecord(value) {
420
574
  return typeof value === 'object' && value !== null;
421
575
  }
@@ -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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"}
@@ -105,7 +105,7 @@ function stripGuardMetadata(args) {
105
105
  const [first, ...rest] = args;
106
106
  if (!isPlainRecord(first))
107
107
  return args;
108
- const { projectId: _projectId, project_id: _project_id, userId: _userId, user_id: _user_id, sessionId: _sessionId, session_id: _session_id, ...providerParams } = first;
108
+ const { projectId: _projectId, project_id: _project_id, userId: _userId, user_id: _user_id, sessionId: _sessionId, session_id: _session_id, runId: _runId, run_id: _run_id, ...providerParams } = first;
109
109
  return [providerParams, ...rest];
110
110
  }
111
111
  function isPlainRecord(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"GuardFree.js","sourceRoot":"","sources":["../../src/core/GuardFree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GuardFree.js","sourceRoot":"","sources":["../../src/core/GuardFree.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { GuardWebhookConfig } from './types.js';
1
+ import type { CostGuardAlertsConfig, GuardBudgetConfig, GuardWebhookConfig } from './types.js';
2
2
  /**
3
3
  * Minimal Redis client surface used by GuardPro. Supplying redisClient is useful for tests.
4
4
  */
@@ -25,9 +25,15 @@ export interface GuardProConfig {
25
25
  /** Redis connection URL. Instances sharing this URL reuse one pooled connection. */
26
26
  redisUrl: string;
27
27
  /** Budget in USD for each project/session window. */
28
- budget: number;
28
+ budget: number | GuardBudgetConfig;
29
29
  /** Session TTL in seconds. Defaults to 86400. */
30
30
  windowSeconds?: number;
31
+ /** Default project identifier used in alert payloads when checkAndCharge supplies a project key. */
32
+ projectId?: string;
33
+ /** Agent run identifier used in alert payloads. */
34
+ runId?: string;
35
+ /** Local webhook alerts for block and threshold events. Disabled unless webhookUrl is supplied. */
36
+ alerts?: CostGuardAlertsConfig;
31
37
  /** Slack webhook URL for budget block notifications. */
32
38
  slackWebhook?: string;
33
39
  /** Discord webhook URL for budget block notifications. */
@@ -46,9 +52,14 @@ export declare class GuardPro {
46
52
  private readonly redisClient?;
47
53
  private readonly poolEntry?;
48
54
  private readonly budget;
55
+ private readonly budgetThresholdUsd?;
49
56
  private readonly windowSeconds;
57
+ private readonly projectId?;
58
+ private readonly runId?;
59
+ private readonly alerts?;
50
60
  private readonly webhooks?;
51
61
  private readonly localSpend;
62
+ private readonly thresholdAlertedKeys;
52
63
  private directRedisFailed;
53
64
  private directRedisReady;
54
65
  /**
@@ -87,6 +98,8 @@ export declare class GuardPro {
87
98
  private safeQuit;
88
99
  private getSpendKey;
89
100
  private createContext;
101
+ private alertThresholdIfNeeded;
102
+ private createAlertPayload;
90
103
  }
91
104
  /**
92
105
  * Creates GuardPro.
@@ -1 +1 @@
1
- {"version":3,"file":"GuardPro.d.ts","sourceRoot":"","sources":["../../src/core/GuardPro.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GuardPro.d.ts","sourceRoot":"","sources":["../../src/core/GuardPro.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Redis } from 'ioredis';
2
+ import { sendCostGuardAlert } from './alerts.js';
2
3
  import { GuardError } from './GuardCore.js';
3
4
  import { notifyBlockWebhooks } from './webhooks.js';
4
5
  /**
@@ -10,18 +11,28 @@ export class GuardPro {
10
11
  redisClient;
11
12
  poolEntry;
12
13
  budget;
14
+ budgetThresholdUsd;
13
15
  windowSeconds;
16
+ projectId;
17
+ runId;
18
+ alerts;
14
19
  webhooks;
15
20
  localSpend = new Map();
21
+ thresholdAlertedKeys = new Set();
16
22
  directRedisFailed = false;
17
23
  directRedisReady = false;
18
24
  /**
19
25
  * Creates a GuardPro instance and reuses a pooled Redis connection for the same URL.
20
26
  */
21
27
  constructor(config) {
28
+ const budget = normalizeBudget(config.budget);
22
29
  this.redisUrl = config.redisUrl;
23
- this.budget = config.budget;
30
+ this.budget = budget.maxUsd;
31
+ this.budgetThresholdUsd = budget.thresholdUsd;
24
32
  this.windowSeconds = config.windowSeconds ?? 86_400;
33
+ this.projectId = readString(config.projectId);
34
+ this.runId = readString(config.runId);
35
+ this.alerts = normalizeAlerts(config.alerts);
25
36
  this.webhooks = {
26
37
  ...config.webhooks,
27
38
  slack: config.webhooks?.slack ?? config.slackWebhook,
@@ -56,9 +67,11 @@ export class GuardPro {
56
67
  const context = this.createContext(projectId, estimatedCost);
57
68
  const reason = `Project "${projectId}" exceeded budget. ` +
58
69
  `Spend: $${total.toFixed(6)} / Budget: $${this.budget.toFixed(6)}`;
59
- await notifyBlockWebhooks(this.webhooks, { reason, context });
70
+ void notifyBlockWebhooks(this.webhooks, { reason, context });
71
+ void sendCostGuardAlert(this.alerts, this.createAlertPayload('blocked', 'budget_exceeded', 'critical', projectId, estimatedCost, total));
60
72
  throw new GuardError(reason, context, 'BUDGET_EXCEEDED');
61
73
  }
74
+ this.alertThresholdIfNeeded(projectId, total);
62
75
  }
63
76
  /**
64
77
  * Returns current spend for a project from Redis when available, otherwise from local fallback state.
@@ -265,6 +278,30 @@ export class GuardPro {
265
278
  prompt: `project:${projectId}`,
266
279
  };
267
280
  }
281
+ alertThresholdIfNeeded(projectId, total) {
282
+ if (this.budgetThresholdUsd === undefined || total < this.budgetThresholdUsd)
283
+ return;
284
+ const key = this.getSpendKey(projectId);
285
+ if (this.thresholdAlertedKeys.has(key))
286
+ return;
287
+ this.thresholdAlertedKeys.add(key);
288
+ void sendCostGuardAlert(this.alerts, this.createAlertPayload('threshold', 'budget_threshold', 'warning', projectId, undefined, total));
289
+ }
290
+ createAlertPayload(event, reason, severity, projectId, estimatedCost, total) {
291
+ return {
292
+ event,
293
+ reason,
294
+ severity,
295
+ projectId: this.projectId ?? projectId,
296
+ runId: this.runId,
297
+ estimatedCostUsd: estimatedCost === undefined ? undefined : roundMoney(estimatedCost),
298
+ estimatedSavedUsd: estimatedCost === undefined ? undefined : roundMoney(estimatedCost),
299
+ budgetLimitUsd: roundMoney(this.budget),
300
+ budgetUsedUsd: roundMoney(total),
301
+ timestamp: new Date().toISOString(),
302
+ packageName: '@salimassili/ai-costguard',
303
+ };
304
+ }
268
305
  }
269
306
  /**
270
307
  * Creates GuardPro.
@@ -272,4 +309,56 @@ export class GuardPro {
272
309
  export function getProGuard(config) {
273
310
  return new GuardPro(config);
274
311
  }
312
+ function normalizeBudget(configBudget) {
313
+ if (typeof configBudget === 'number') {
314
+ return { maxUsd: validateMoney(configBudget, 'budget') };
315
+ }
316
+ const maxUsd = validateMoney(configBudget.maxUsd, 'budget.maxUsd');
317
+ const thresholdUsd = configBudget.thresholdUsd === undefined
318
+ ? normalizeThresholdPercent(configBudget.thresholdPercent, maxUsd)
319
+ : validateMoney(configBudget.thresholdUsd, 'budget.thresholdUsd');
320
+ if (thresholdUsd !== undefined && thresholdUsd > maxUsd) {
321
+ throw new Error('budget threshold must be less than or equal to budget.maxUsd');
322
+ }
323
+ return { maxUsd, thresholdUsd };
324
+ }
325
+ function normalizeThresholdPercent(value, maxUsd) {
326
+ if (value === undefined)
327
+ return undefined;
328
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || value > 1) {
329
+ throw new Error('budget.thresholdPercent must be a number greater than 0 and less than or equal to 1');
330
+ }
331
+ return maxUsd * value;
332
+ }
333
+ function normalizeAlerts(alerts) {
334
+ if (!alerts)
335
+ return undefined;
336
+ if (alerts.timeoutMs !== undefined && (!Number.isFinite(alerts.timeoutMs) || alerts.timeoutMs < 0)) {
337
+ throw new Error('alerts.timeoutMs must be a non-negative number');
338
+ }
339
+ if (alerts.format !== undefined && alerts.format !== 'json' && alerts.format !== 'slack') {
340
+ throw new Error('alerts.format must be "json" or "slack"');
341
+ }
342
+ for (const event of alerts.events ?? []) {
343
+ if (event !== 'blocked' && event !== 'threshold') {
344
+ throw new Error('alerts.events can only include "blocked" or "threshold"');
345
+ }
346
+ }
347
+ return {
348
+ ...alerts,
349
+ webhookUrl: readString(alerts.webhookUrl),
350
+ };
351
+ }
352
+ function readString(value) {
353
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
354
+ }
355
+ function validateMoney(value, field) {
356
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
357
+ throw new Error(`${field} must be a non-negative finite number`);
358
+ }
359
+ return value;
360
+ }
361
+ function roundMoney(value) {
362
+ return Math.round(validateMoney(value, 'money') * 1_000_000) / 1_000_000;
363
+ }
275
364
  //# sourceMappingURL=GuardPro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GuardPro.js","sourceRoot":"","sources":["../../src/core/GuardPro.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GuardPro.js","sourceRoot":"","sources":["../../src/core/GuardPro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CostGuardAlertPayload, CostGuardAlertsConfig } from './types.js';
2
+ /**
3
+ * Sends a local webhook alert on a best-effort basis.
4
+ */
5
+ export declare function sendCostGuardAlert(config: CostGuardAlertsConfig | undefined, payload: CostGuardAlertPayload): Promise<void>;
6
+ //# sourceMappingURL=alerts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/core/alerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,qBAAqB,GAAG,SAAS,EACzC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,52 @@
1
+ const DEFAULT_ALERT_EVENTS = ['blocked'];
2
+ const DEFAULT_TIMEOUT_MS = 1500;
3
+ const MIN_TIMEOUT_MS = 100;
4
+ /**
5
+ * Sends a local webhook alert on a best-effort basis.
6
+ */
7
+ export async function sendCostGuardAlert(config, payload) {
8
+ if (!config)
9
+ return;
10
+ const webhookUrl = config.webhookUrl?.trim();
11
+ if (!webhookUrl)
12
+ return;
13
+ const events = config.events?.length ? config.events : DEFAULT_ALERT_EVENTS;
14
+ if (!events.includes(payload.event))
15
+ return;
16
+ try {
17
+ const controller = new AbortController();
18
+ const timeout = setTimeout(() => controller.abort(), Math.max(MIN_TIMEOUT_MS, config.timeoutMs ?? DEFAULT_TIMEOUT_MS));
19
+ try {
20
+ await fetch(webhookUrl, {
21
+ method: 'POST',
22
+ headers: { 'content-type': 'application/json' },
23
+ body: shouldUseSlackFormat(config) ? slackBody(payload) : JSON.stringify(payload),
24
+ signal: controller.signal,
25
+ });
26
+ }
27
+ finally {
28
+ clearTimeout(timeout);
29
+ }
30
+ }
31
+ catch {
32
+ // Alerts are observability only; enforcement and application behavior must not depend on delivery.
33
+ }
34
+ }
35
+ function shouldUseSlackFormat(config) {
36
+ return config.slack === true || config.format === 'slack';
37
+ }
38
+ function slackBody(payload) {
39
+ const action = payload.event === 'blocked'
40
+ ? `blocked ${humanReason(payload.reason)} before provider call`
41
+ : `reported ${humanReason(payload.reason)}`;
42
+ const saved = payload.estimatedSavedUsd === undefined
43
+ ? ''
44
+ : ` Estimated saved: $${payload.estimatedSavedUsd.toFixed(6)}.`;
45
+ return JSON.stringify({
46
+ text: `AI CostGuard ${action}.${saved}`,
47
+ });
48
+ }
49
+ function humanReason(reason) {
50
+ return reason.replace(/_/gu, ' ');
51
+ }
52
+ //# sourceMappingURL=alerts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/core/alerts.ts"],"names":[],"mappings":"AAMA,MAAM,oBAAoB,GAAmC,CAAC,SAAS,CAAC,CAAC;AACzE,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAyC,EACzC,OAA8B;IAE9B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;IAE5C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC,CACjE,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,UAAU,EAAE;gBACtB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBACjF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mGAAmG;IACrG,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA6B;IACzD,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;AAC5D,CAAC;AAED,SAAS,SAAS,CAAC,OAA8B;IAC/C,MAAM,MAAM,GACV,OAAO,CAAC,KAAK,KAAK,SAAS;QACzB,CAAC,CAAC,WAAW,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB;QAC/D,CAAC,CAAC,YAAY,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IAChD,MAAM,KAAK,GACT,OAAO,CAAC,iBAAiB,KAAK,SAAS;QACrC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,sBAAsB,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAEpE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,gBAAgB,MAAM,IAAI,KAAK,EAAE;KACxC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC"}
@@ -16,6 +16,59 @@ export interface GuardWebhookConfig {
16
16
  /** Per-request timeout in milliseconds. Defaults to 1500. */
17
17
  timeoutMs?: number;
18
18
  }
19
+ /**
20
+ * Alert event names supported by the local webhook alert API.
21
+ */
22
+ export type CostGuardAlertEvent = 'blocked' | 'threshold';
23
+ /**
24
+ * Alert severity used in local webhook payloads.
25
+ */
26
+ export type CostGuardAlertSeverity = 'info' | 'warning' | 'critical';
27
+ /**
28
+ * Local webhook alert configuration. Alerts are best-effort and disabled unless webhookUrl is supplied.
29
+ */
30
+ export interface CostGuardAlertsConfig {
31
+ /** User-owned webhook endpoint. Never logged by AI CostGuard. */
32
+ webhookUrl?: string;
33
+ /** Alert events to send. Defaults to ["blocked"]. */
34
+ events?: CostGuardAlertEvent[];
35
+ /** Per-alert timeout in milliseconds. Defaults to 1500. */
36
+ timeoutMs?: number;
37
+ /** Payload format. Defaults to "json". */
38
+ format?: 'json' | 'slack';
39
+ /** Convenience flag for Slack-compatible message bodies. */
40
+ slack?: boolean;
41
+ }
42
+ /**
43
+ * Stable local webhook payload sent for alert events.
44
+ */
45
+ export interface CostGuardAlertPayload {
46
+ event: CostGuardAlertEvent;
47
+ reason: string;
48
+ severity: CostGuardAlertSeverity;
49
+ projectId?: string;
50
+ runId?: string;
51
+ model?: string;
52
+ provider?: string;
53
+ estimatedCostUsd?: number;
54
+ estimatedSavedUsd?: number;
55
+ budgetLimitUsd?: number;
56
+ budgetUsedUsd?: number;
57
+ timestamp: string;
58
+ packageName: '@salimassili/ai-costguard';
59
+ packageVersion?: string;
60
+ }
61
+ /**
62
+ * Budget configuration. A number keeps legacy behavior; object form enables threshold alerts.
63
+ */
64
+ export interface GuardBudgetConfig {
65
+ /** Maximum process-local estimated spend in USD. */
66
+ maxUsd: number;
67
+ /** Optional threshold as a fraction from 0 to 1, for example 0.8 for 80%. */
68
+ thresholdPercent?: number;
69
+ /** Optional absolute threshold in USD. Takes precedence over thresholdPercent. */
70
+ thresholdUsd?: number;
71
+ }
19
72
  /**
20
73
  * Scope used to isolate budgets and behavior history.
21
74
  */
@@ -26,13 +79,15 @@ export interface GuardScope {
26
79
  userId?: string;
27
80
  /** Agent run, workflow, request, or conversation identifier. */
28
81
  sessionId?: string;
82
+ /** Agent run identifier used by alert payloads and scope isolation. */
83
+ runId?: string;
29
84
  }
30
85
  /**
31
86
  * Runtime configuration for the free process-local guard.
32
87
  */
33
88
  export interface GuardConfig {
34
89
  /** Process-local budget in USD for each scope. Defaults to 10. */
35
- budget?: number;
90
+ budget?: number | GuardBudgetConfig;
36
91
  /** Enables loop, retry-storm, and step-count checks. Defaults to true. */
37
92
  behaviorAnalysis?: boolean;
38
93
  /** Maximum prompt history retained for similarity checks. Defaults to 32. */
@@ -66,6 +121,8 @@ export interface GuardConfig {
66
121
  scope?: GuardScope;
67
122
  /** Optional runtime pricing entries that take precedence over built-ins. */
68
123
  pricingOverrides?: ModelPricing[];
124
+ /** Local webhook alerts for block and threshold events. Disabled unless webhookUrl is supplied. */
125
+ alerts?: CostGuardAlertsConfig;
69
126
  /** Slack and Discord webhook destinations for block events. */
70
127
  webhooks?: GuardWebhookConfig;
71
128
  /** Optional JSONL file path for local dashboard/event history. Disabled by default. */
@@ -76,6 +133,10 @@ export interface GuardConfig {
76
133
  slackWebhook?: string;
77
134
  /** Convenience Discord webhook URL. Equivalent to webhooks.discord. */
78
135
  discordWebhook?: string;
136
+ /** Top-level project identifier, equivalent to scope.projectId when scope omits projectId. */
137
+ projectId?: string;
138
+ /** Top-level run identifier, equivalent to scope.runId when scope omits runId. */
139
+ runId?: string;
79
140
  }
80
141
  /**
81
142
  * Normalized request data evaluated before an AI API call is allowed.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,iBAAiB,GACjB,oBAAoB,GACpB,eAAe,GACf,sBAAsB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,sBAAsB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,2BAA2B,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACpC,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6GAA6G;IAC7G,aAAa,CAAC,EAAE;QACd,0DAA0D;QAC1D,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,oFAAoF;QACpF,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,2EAA2E;QAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC1C,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,YAAY,CAAC;IACnC,0DAA0D;IAC1D,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC;IAClC,mGAAmG;IACnG,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACrC,uEAAuE;IACvE,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACrC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,iDAAiD;IACjD,OAAO,EAAE,cAAc,CAAC;IACxB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,5 +4,5 @@ export { BUILTIN_PRICING_LAST_UPDATED, getPricing, getPricingMeta, registerPrici
4
4
  export type { ModelPricing, PricingMeta } from './pricing/index.js';
5
5
  export { registerTokenizer } from './core/tokenizer.js';
6
6
  export type { TokenizerFn } from './core/tokenizer.js';
7
- export type { GuardConfig, GuardErrorCode, GuardEvent, GuardEventHandler, GuardEventName, GuardScope, GuardState, GuardWebhookConfig, RequestContext, } from './core/types.js';
7
+ export type { GuardConfig, GuardBudgetConfig, CostGuardAlertsConfig, CostGuardAlertEvent, CostGuardAlertPayload, CostGuardAlertSeverity, GuardErrorCode, GuardEvent, GuardEventHandler, GuardEventName, GuardScope, GuardState, GuardWebhookConfig, RequestContext, } from './core/types.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5H,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5H,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,GACf,MAAM,iBAAiB,CAAC"}
@@ -10,10 +10,12 @@ node examples/integrations/openai-agent-loop.mjs
10
10
  node examples/integrations/anthropic-workflow-budget.mjs
11
11
  node examples/integrations/vercel-ai-chatbot.mjs
12
12
  node examples/integrations/langchain-retry-storm.mjs
13
- node examples/integrations/mastra-agent.mjs
14
- node examples/integrations/crewai-budget-gate.mjs
15
- node examples/integrations/ci-budget-check.mjs
16
- ```
13
+ node examples/integrations/mastra-agent.mjs
14
+ node examples/integrations/crewai-budget-gate.mjs
15
+ node examples/integrations/webhook-alerts.mjs
16
+ node examples/integrations/slack-alerts.mjs
17
+ node examples/integrations/ci-budget-check.mjs
18
+ ```
17
19
 
18
20
  ## OpenAI SDK
19
21
 
@@ -140,11 +142,45 @@ CrewAI is Python-native, so this TypeScript package cannot instrument internal P
140
142
  - Wrap a Node launcher or API boundary with `guardFunction()` before it starts the Python workflow.
141
143
  - Use provider-side billing alerts for final reconciliation.
142
144
 
143
- Runnable mock: `examples/integrations/crewai-budget-gate.mjs`
144
-
145
- ## CI Budget Check
146
-
147
- Use the CLI to fail a pipeline before a planned agent run can exceed budget.
145
+ Runnable mock: `examples/integrations/crewai-budget-gate.mjs`
146
+
147
+ ## Local Webhook And Slack Alerts
148
+
149
+ Alerts are local-first and optional. AI CostGuard only sends to a webhook URL you provide, and alert failures never change guard decisions.
150
+
151
+ ```ts
152
+ import { guard } from '@salimassili/ai-costguard';
153
+
154
+ const openai = guard(client, {
155
+ budget: { maxUsd: 5, thresholdPercent: 0.8 },
156
+ projectId: 'agent-api',
157
+ runId: 'run-1',
158
+ alerts: {
159
+ webhookUrl: process.env.COSTGUARD_WEBHOOK_URL,
160
+ events: ['blocked', 'threshold'],
161
+ timeoutMs: 1500,
162
+ },
163
+ });
164
+ ```
165
+
166
+ For Slack incoming webhooks, use `format: 'slack'` or `slack: true`:
167
+
168
+ ```ts
169
+ const openai = guard(client, {
170
+ budget: { maxUsd: 5 },
171
+ alerts: {
172
+ webhookUrl: process.env.COSTGUARD_SLACK_WEBHOOK,
173
+ events: ['blocked'],
174
+ format: 'slack',
175
+ },
176
+ });
177
+ ```
178
+
179
+ Runnable mocks: `examples/integrations/webhook-alerts.mjs` and `examples/integrations/slack-alerts.mjs`
180
+
181
+ ## CI Budget Check
182
+
183
+ Use the CLI to fail a pipeline before a planned agent run can exceed budget.
148
184
 
149
185
  ```bash
150
186
  ai-costguard check --budget 0.25 --model gpt-4o-mini --input-tokens 800 --tokens 1200 --max-steps 20
@@ -0,0 +1,59 @@
1
+ import { guard, GuardError, registerTokenizer } from '@salimassili/ai-costguard';
2
+
3
+ const webhookUrl = process.env.COSTGUARD_SLACK_WEBHOOK;
4
+ let providerCalls = 0;
5
+
6
+ registerTokenizer('gpt-4o-mini', (text) => Math.ceil(text.length / 4));
7
+
8
+ const mockedOpenAI = {
9
+ chat: {
10
+ completions: {
11
+ create: async () => {
12
+ providerCalls += 1;
13
+ return { ok: true };
14
+ },
15
+ },
16
+ },
17
+ };
18
+
19
+ const openai = guard(mockedOpenAI, {
20
+ budget: { maxUsd: 0.0001 },
21
+ projectId: 'slack-alert-demo',
22
+ runId: 'local-run-1',
23
+ alerts: {
24
+ webhookUrl,
25
+ events: ['blocked'],
26
+ format: 'slack',
27
+ timeoutMs: 1000,
28
+ },
29
+ });
30
+
31
+ try {
32
+ await openai.chat.completions.create({
33
+ model: 'gpt-4o-mini',
34
+ messages: [{ role: 'user', content: 'Reserve a long output for an expensive agent step.' }],
35
+ max_tokens: 800,
36
+ });
37
+
38
+ throw new Error('Expected AI CostGuard to block the mocked provider call.');
39
+ } catch (error) {
40
+ if (!(error instanceof GuardError)) throw error;
41
+
42
+ console.log(
43
+ JSON.stringify(
44
+ {
45
+ demo: 'slack-alerts',
46
+ slackAlert: webhookUrl ? 'enabled from COSTGUARD_SLACK_WEBHOOK' : 'off by default',
47
+ blocked: true,
48
+ reason: error.code,
49
+ providerCalls,
50
+ },
51
+ null,
52
+ 2
53
+ )
54
+ );
55
+ }
56
+
57
+ if (providerCalls !== 0) {
58
+ throw new Error(`Provider executed ${providerCalls} time(s); expected 0.`);
59
+ }
@@ -0,0 +1,58 @@
1
+ import { guard, GuardError, registerTokenizer } from '@salimassili/ai-costguard';
2
+
3
+ const webhookUrl = process.env.COSTGUARD_WEBHOOK_URL;
4
+ let providerCalls = 0;
5
+
6
+ registerTokenizer('gpt-4o-mini', (text) => Math.ceil(text.length / 4));
7
+
8
+ const mockedOpenAI = {
9
+ chat: {
10
+ completions: {
11
+ create: async () => {
12
+ providerCalls += 1;
13
+ return { ok: true };
14
+ },
15
+ },
16
+ },
17
+ };
18
+
19
+ const openai = guard(mockedOpenAI, {
20
+ budget: { maxUsd: 0.0001 },
21
+ projectId: 'webhook-alert-demo',
22
+ runId: 'local-run-1',
23
+ alerts: {
24
+ webhookUrl,
25
+ events: ['blocked'],
26
+ timeoutMs: 1000,
27
+ },
28
+ });
29
+
30
+ try {
31
+ await openai.chat.completions.create({
32
+ model: 'gpt-4o-mini',
33
+ messages: [{ role: 'user', content: 'Reserve a long output for an expensive agent step.' }],
34
+ max_tokens: 800,
35
+ });
36
+
37
+ throw new Error('Expected AI CostGuard to block the mocked provider call.');
38
+ } catch (error) {
39
+ if (!(error instanceof GuardError)) throw error;
40
+
41
+ console.log(
42
+ JSON.stringify(
43
+ {
44
+ demo: 'webhook-alerts',
45
+ alert: webhookUrl ? 'enabled from COSTGUARD_WEBHOOK_URL' : 'off by default',
46
+ blocked: true,
47
+ reason: error.code,
48
+ providerCalls,
49
+ },
50
+ null,
51
+ 2
52
+ )
53
+ );
54
+ }
55
+
56
+ if (providerCalls !== 0) {
57
+ throw new Error(`Provider executed ${providerCalls} time(s); expected 0.`);
58
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salimassili/ai-costguard",
3
- "version": "2.1.4",
3
+ "version": "2.2.0",
4
4
  "description": "Local-first runtime safety layer for AI agents that blocks runaway costs, loops, retries, and budget overruns before API calls execute.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",