palaryn 0.4.14 → 0.4.16

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 (83) hide show
  1. package/README.md +12 -9
  2. package/dist/src/alerting/index.d.ts +2 -0
  3. package/dist/src/alerting/index.d.ts.map +1 -0
  4. package/dist/src/alerting/index.js +6 -0
  5. package/dist/src/alerting/index.js.map +1 -0
  6. package/dist/src/alerting/webhook-alerter.d.ts +40 -0
  7. package/dist/src/alerting/webhook-alerter.d.ts.map +1 -0
  8. package/dist/src/alerting/webhook-alerter.js +172 -0
  9. package/dist/src/alerting/webhook-alerter.js.map +1 -0
  10. package/dist/src/budget/manager.d.ts +10 -0
  11. package/dist/src/budget/manager.d.ts.map +1 -1
  12. package/dist/src/budget/manager.js +181 -17
  13. package/dist/src/budget/manager.js.map +1 -1
  14. package/dist/src/dlp/exfiltration-backend.d.ts +6 -0
  15. package/dist/src/dlp/exfiltration-backend.d.ts.map +1 -0
  16. package/dist/src/dlp/exfiltration-backend.js +62 -0
  17. package/dist/src/dlp/exfiltration-backend.js.map +1 -0
  18. package/dist/src/dlp/index.d.ts +2 -1
  19. package/dist/src/dlp/index.d.ts.map +1 -1
  20. package/dist/src/dlp/index.js +5 -1
  21. package/dist/src/dlp/index.js.map +1 -1
  22. package/dist/src/dlp/patterns.d.ts.map +1 -1
  23. package/dist/src/dlp/patterns.js +5 -1
  24. package/dist/src/dlp/patterns.js.map +1 -1
  25. package/dist/src/dlp/prompt-injection-backend.d.ts.map +1 -1
  26. package/dist/src/dlp/prompt-injection-backend.js +14 -0
  27. package/dist/src/dlp/prompt-injection-backend.js.map +1 -1
  28. package/dist/src/dlp/prompt-injection-patterns.d.ts.map +1 -1
  29. package/dist/src/dlp/prompt-injection-patterns.js +57 -1
  30. package/dist/src/dlp/prompt-injection-patterns.js.map +1 -1
  31. package/dist/src/dlp/text-normalizer.d.ts +7 -0
  32. package/dist/src/dlp/text-normalizer.d.ts.map +1 -1
  33. package/dist/src/dlp/text-normalizer.js +24 -0
  34. package/dist/src/dlp/text-normalizer.js.map +1 -1
  35. package/dist/src/saas/routes.d.ts.map +1 -1
  36. package/dist/src/saas/routes.js +13 -2
  37. package/dist/src/saas/routes.js.map +1 -1
  38. package/dist/src/server/gateway.d.ts +1 -0
  39. package/dist/src/server/gateway.d.ts.map +1 -1
  40. package/dist/src/server/gateway.js +178 -39
  41. package/dist/src/server/gateway.js.map +1 -1
  42. package/dist/src/storage/interfaces.d.ts +4 -0
  43. package/dist/src/storage/interfaces.d.ts.map +1 -1
  44. package/dist/src/tracing/index.d.ts +1 -1
  45. package/dist/src/tracing/index.d.ts.map +1 -1
  46. package/dist/src/tracing/index.js +4 -1
  47. package/dist/src/tracing/index.js.map +1 -1
  48. package/dist/src/tracing/provider.d.ts +56 -0
  49. package/dist/src/tracing/provider.d.ts.map +1 -1
  50. package/dist/src/tracing/provider.js +77 -1
  51. package/dist/src/tracing/provider.js.map +1 -1
  52. package/dist/src/types/budget.d.ts +4 -0
  53. package/dist/src/types/budget.d.ts.map +1 -1
  54. package/dist/src/types/config.d.ts +3 -0
  55. package/dist/src/types/config.d.ts.map +1 -1
  56. package/dist/src/types/tool-result.d.ts +2 -0
  57. package/dist/src/types/tool-result.d.ts.map +1 -1
  58. package/dist/tests/unit/adversarial-pipeline.test.js +4 -4
  59. package/dist/tests/unit/adversarial-pipeline.test.js.map +1 -1
  60. package/dist/tests/unit/tracing.test.js +14 -15
  61. package/dist/tests/unit/tracing.test.js.map +1 -1
  62. package/dist/tests/unit/webhook-alerter.test.d.ts +2 -0
  63. package/dist/tests/unit/webhook-alerter.test.d.ts.map +1 -0
  64. package/dist/tests/unit/webhook-alerter.test.js +217 -0
  65. package/dist/tests/unit/webhook-alerter.test.js.map +1 -0
  66. package/package.json +1 -1
  67. package/src/alerting/index.ts +1 -0
  68. package/src/alerting/webhook-alerter.ts +212 -0
  69. package/src/budget/manager.ts +192 -18
  70. package/src/dlp/exfiltration-backend.ts +63 -0
  71. package/src/dlp/index.ts +2 -1
  72. package/src/dlp/patterns.ts +6 -1
  73. package/src/dlp/prompt-injection-backend.ts +16 -1
  74. package/src/dlp/prompt-injection-patterns.ts +59 -1
  75. package/src/dlp/text-normalizer.ts +26 -0
  76. package/src/saas/routes.ts +13 -2
  77. package/src/server/gateway.ts +163 -43
  78. package/src/storage/interfaces.ts +4 -0
  79. package/src/tracing/index.ts +1 -1
  80. package/src/tracing/provider.ts +88 -0
  81. package/src/types/budget.ts +4 -0
  82. package/src/types/config.ts +3 -0
  83. package/src/types/tool-result.ts +2 -0
package/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Palaryn
2
2
 
3
- **A model-agnostic infrastructure layer that gives AI agents safe, auditable, and cost-controlled access to the outside world.**
3
+ **The AI Agent Firewall. Policy enforcement, data loss prevention, budget controls, and full audit trails for every tool call your agents make.**
4
4
 
5
- Palaryn sits as a single choke point between AI agents and external services. Every tool call is intercepted, evaluated against security policies, checked for sensitive data, metered against budgets, and logged immutably. Works with Claude, OpenAI, LangGraph, n8n, or any custom orchestrator.
5
+ Palaryn is a governance layer that sits between AI agents and the outside world. Every outbound action is intercepted and evaluated: security policies decide what's allowed, DLP scanning catches secrets and prompt injections, budgets enforce hard spending limits, and immutable audit logs record everything. Works with Claude, OpenAI, LangGraph, n8n, or any custom orchestrator.
6
+
7
+ Palaryn is **not** an observability platform — it's an enforcement layer that **emits** rich OpenTelemetry traces to your existing stack (Datadog, Grafana, Elastic, etc.).
6
8
 
7
9
  ---
8
10
 
@@ -29,7 +31,7 @@ palaryn --help
29
31
 
30
32
  ## Quick Start
31
33
 
32
- The fastest way to try Palaryn is a single curl call against the hosted gateway:
34
+ The fastest way to try Palaryn is a single curl call against the hosted firewall:
33
35
 
34
36
  ```bash
35
37
  curl -X POST https://app.palaryn.com/v1/tool/execute \
@@ -60,7 +62,7 @@ The response includes the policy decision, DLP scan results, budget report, and
60
62
 
61
63
  ## Integration Methods
62
64
 
63
- Palaryn has a single pipeline (auth → rate limit → policy → DLP → budget → execute → audit) with multiple entry points:
65
+ Palaryn enforces a single pipeline (auth → rate limit → policy → DLP → budget → execute → audit) with multiple entry points:
64
66
 
65
67
  | Method | Protocol | Code Change | Best For |
66
68
  |---|---|---|---|
@@ -185,12 +187,13 @@ docker compose --profile dev up
185
187
  - **Response caching** — TTL-based caching of GET responses and idempotent call deduplication
186
188
  - **Anomaly detection** — Rolling baselines with z-score anomaly flagging
187
189
 
188
- ### Audit & Observability
190
+ ### Audit & Integrations
189
191
 
190
192
  - **Immutable audit log** — Append-only event log for every stage of the pipeline
191
193
  - **Full traceability** — Correlation via `task_id` and `tool_call_id` across the tool call lifecycle
192
- - **OpenTelemetry** — Spans per tool call, Prometheus metrics (latency, error rate, cost, tokens)
193
- - **Dashboard** — React SPA with real-time pipeline visualization, traces, budget charts, and settings
194
+ - **OpenTelemetry export** — Rich per-step spans with GenAI semantic conventions pipe enforcement data to Datadog, Grafana, Elastic, or any OTel-compatible backend
195
+ - **Prometheus metrics** — 18 metric types (latency, error rate, cost, tokens, DLP detections, policy decisions)
196
+ - **Webhook alerting** — Real-time alerts for DLP detections, budget thresholds, policy denials, and anomalies
194
197
 
195
198
  ---
196
199
 
@@ -321,7 +324,7 @@ Agents / Orchestrators
321
324
  │ MCP / REST API / HTTP Proxy
322
325
 
323
326
  ┌──────────────────────────────────────┐
324
- Palaryn Gateway
327
+ Palaryn Firewall
325
328
  │ ┌──────┬───────┬─────┬──────┬─────┐│
326
329
  │ │ Auth │ Rate │ DLP │Policy│Budgt││
327
330
  │ │ │ Limit │ │ │ ││
@@ -369,4 +372,4 @@ Full documentation is available at [app.palaryn.com/docs](https://app.palaryn.co
369
372
 
370
373
  ---
371
374
 
372
- *"Your agents can use tools. Safely."*
375
+ *"Your agents can use tools. Under your rules."*
@@ -0,0 +1,2 @@
1
+ export { WebhookAlerter, AlertingConfig, AlertPayload, AlertEventType } from './webhook-alerter';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/alerting/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookAlerter = void 0;
4
+ var webhook_alerter_1 = require("./webhook-alerter");
5
+ Object.defineProperty(exports, "WebhookAlerter", { enumerable: true, get: function () { return webhook_alerter_1.WebhookAlerter; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/alerting/index.ts"],"names":[],"mappings":";;;AAAA,qDAAiG;AAAxF,iHAAA,cAAc,OAAA"}
@@ -0,0 +1,40 @@
1
+ export type AlertEventType = 'dlp.high_severity' | 'budget.threshold' | 'policy.denial' | 'anomaly.detected' | 'trust.score_drop';
2
+ export interface AlertPayload {
3
+ event: AlertEventType;
4
+ severity: 'low' | 'medium' | 'high' | 'critical';
5
+ details: Record<string, unknown>;
6
+ workspace_id?: string;
7
+ actor_id?: string;
8
+ timestamp: string;
9
+ }
10
+ export interface AlertingConfig {
11
+ enabled: boolean;
12
+ webhook_url: string;
13
+ webhook_headers?: Record<string, string>;
14
+ /** Which event types to send. If empty/undefined, all events are sent. */
15
+ events?: AlertEventType[];
16
+ /** Budget utilization percentage at which to alert (default 80). */
17
+ budget_threshold_percent?: number;
18
+ }
19
+ /**
20
+ * Fires webhook notifications for governance/security events.
21
+ * Non-blocking: errors are logged but never thrown to the caller.
22
+ * Follows the same fire-and-forget + retry pattern as ApprovalWebhook.
23
+ */
24
+ export declare class WebhookAlerter {
25
+ private webhookUrl;
26
+ private headers;
27
+ private eventFilter;
28
+ readonly budgetThresholdPercent: number;
29
+ constructor(config: AlertingConfig);
30
+ /** Send an alert if the event type passes the filter. Fire-and-forget. */
31
+ alert(payload: AlertPayload): void;
32
+ alertDLPHighSeverity(detections: string[], severity: 'high' | 'critical', workspaceId?: string, actorId?: string): void;
33
+ alertBudgetThreshold(utilizationPercent: number, budgetType: string, spentUsd: number, limitUsd: number, workspaceId?: string, actorId?: string): void;
34
+ alertPolicyDenial(ruleId: string, toolName: string, reasons: string[], workspaceId?: string, actorId?: string): void;
35
+ alertAnomalyDetected(anomalyTypes: string[], action: string, workspaceId?: string, actorId?: string): void;
36
+ alertTrustScoreDrop(score: number, previousScore: number, workspaceId?: string, actorId?: string): void;
37
+ private sendWithRetry;
38
+ private send;
39
+ }
40
+ //# sourceMappingURL=webhook-alerter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-alerter.d.ts","sourceRoot":"","sources":["../../../src/alerting/webhook-alerter.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,kBAAkB,GAClB,eAAe,GACf,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,oEAAoE;IACpE,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAA6B;IAChD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;gBAE5B,MAAM,EAAE,cAAc;IASlC,0EAA0E;IAC1E,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAWlC,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,GAAG,UAAU,EAC7B,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAWP,oBAAoB,CAClB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAWP,iBAAiB,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAWP,oBAAoB,CAClB,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAWP,mBAAmB,CACjB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;YAaO,aAAa;IAmB3B,OAAO,CAAC,IAAI;CA0Cb"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.WebhookAlerter = void 0;
37
+ const http = __importStar(require("http"));
38
+ const https = __importStar(require("https"));
39
+ const url_1 = require("url");
40
+ /**
41
+ * Fires webhook notifications for governance/security events.
42
+ * Non-blocking: errors are logged but never thrown to the caller.
43
+ * Follows the same fire-and-forget + retry pattern as ApprovalWebhook.
44
+ */
45
+ class WebhookAlerter {
46
+ constructor(config) {
47
+ this.webhookUrl = config.webhook_url;
48
+ this.headers = config.webhook_headers || {};
49
+ this.eventFilter = config.events && config.events.length > 0
50
+ ? new Set(config.events)
51
+ : null;
52
+ this.budgetThresholdPercent = config.budget_threshold_percent ?? 80;
53
+ }
54
+ /** Send an alert if the event type passes the filter. Fire-and-forget. */
55
+ alert(payload) {
56
+ if (this.eventFilter && !this.eventFilter.has(payload.event)) {
57
+ return; // filtered out
58
+ }
59
+ this.sendWithRetry(payload).catch((err) => {
60
+ console.error(`[WebhookAlerter] All retry attempts failed for ${payload.event}: ${err.message}`);
61
+ });
62
+ }
63
+ // Convenience methods for common alert scenarios
64
+ alertDLPHighSeverity(detections, severity, workspaceId, actorId) {
65
+ this.alert({
66
+ event: 'dlp.high_severity',
67
+ severity,
68
+ details: { detections, detection_count: detections.length },
69
+ workspace_id: workspaceId,
70
+ actor_id: actorId,
71
+ timestamp: new Date().toISOString(),
72
+ });
73
+ }
74
+ alertBudgetThreshold(utilizationPercent, budgetType, spentUsd, limitUsd, workspaceId, actorId) {
75
+ this.alert({
76
+ event: 'budget.threshold',
77
+ severity: utilizationPercent >= 100 ? 'critical' : 'high',
78
+ details: { utilization_percent: utilizationPercent, budget_type: budgetType, spent_usd: spentUsd, limit_usd: limitUsd },
79
+ workspace_id: workspaceId,
80
+ actor_id: actorId,
81
+ timestamp: new Date().toISOString(),
82
+ });
83
+ }
84
+ alertPolicyDenial(ruleId, toolName, reasons, workspaceId, actorId) {
85
+ this.alert({
86
+ event: 'policy.denial',
87
+ severity: 'medium',
88
+ details: { rule_id: ruleId, tool_name: toolName, reasons },
89
+ workspace_id: workspaceId,
90
+ actor_id: actorId,
91
+ timestamp: new Date().toISOString(),
92
+ });
93
+ }
94
+ alertAnomalyDetected(anomalyTypes, action, workspaceId, actorId) {
95
+ this.alert({
96
+ event: 'anomaly.detected',
97
+ severity: 'high',
98
+ details: { anomaly_types: anomalyTypes, action },
99
+ workspace_id: workspaceId,
100
+ actor_id: actorId,
101
+ timestamp: new Date().toISOString(),
102
+ });
103
+ }
104
+ alertTrustScoreDrop(score, previousScore, workspaceId, actorId) {
105
+ this.alert({
106
+ event: 'trust.score_drop',
107
+ severity: score < 30 ? 'critical' : 'high',
108
+ details: { score, previous_score: previousScore, drop: previousScore - score },
109
+ workspace_id: workspaceId,
110
+ actor_id: actorId,
111
+ timestamp: new Date().toISOString(),
112
+ });
113
+ }
114
+ // --- Internal ---
115
+ async sendWithRetry(payload, maxAttempts = 3) {
116
+ const backoffMs = [1000, 2000, 4000];
117
+ let lastError;
118
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
119
+ try {
120
+ await this.send(payload);
121
+ return;
122
+ }
123
+ catch (err) {
124
+ lastError = err instanceof Error ? err : new Error(String(err));
125
+ if (attempt < maxAttempts - 1) {
126
+ await new Promise(resolve => setTimeout(resolve, backoffMs[attempt]));
127
+ }
128
+ }
129
+ }
130
+ throw lastError;
131
+ }
132
+ send(payload) {
133
+ return new Promise((resolve, reject) => {
134
+ const url = new url_1.URL(this.webhookUrl);
135
+ const isHttps = url.protocol === 'https:';
136
+ const transport = isHttps ? https : http;
137
+ const bodyStr = JSON.stringify(payload);
138
+ const headers = {
139
+ 'Content-Type': 'application/json',
140
+ 'Content-Length': Buffer.byteLength(bodyStr).toString(),
141
+ 'User-Agent': 'Palaryn-Alerter/0.1',
142
+ ...this.headers,
143
+ };
144
+ const options = {
145
+ hostname: url.hostname,
146
+ port: url.port || (isHttps ? 443 : 80),
147
+ path: url.pathname + url.search,
148
+ method: 'POST',
149
+ headers,
150
+ timeout: 5000,
151
+ };
152
+ const req = transport.request(options, (res) => {
153
+ res.resume();
154
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
155
+ resolve();
156
+ }
157
+ else {
158
+ reject(new Error(`Webhook returned HTTP ${res.statusCode}`));
159
+ }
160
+ });
161
+ req.on('error', reject);
162
+ req.on('timeout', () => {
163
+ req.destroy();
164
+ reject(new Error('Webhook request timeout'));
165
+ });
166
+ req.write(bodyStr);
167
+ req.end();
168
+ });
169
+ }
170
+ }
171
+ exports.WebhookAlerter = WebhookAlerter;
172
+ //# sourceMappingURL=webhook-alerter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-alerter.js","sourceRoot":"","sources":["../../../src/alerting/webhook-alerter.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,10 @@ export declare class BudgetManager {
18
18
  private workspaceMonthlySpend;
19
19
  private callRetryCounts;
20
20
  private costRecords;
21
+ private userDailyCallCount;
22
+ private userMonthlyCallCount;
23
+ private workspaceDailyCallCount;
24
+ private workspaceMonthlyCallCount;
21
25
  private reservations;
22
26
  /** Promise-based mutex per budget key to serialize concurrent reservations */
23
27
  private budgetLocks;
@@ -84,6 +88,8 @@ export declare class BudgetManager {
84
88
  getActorSpending(actorId: string, days?: number): {
85
89
  daily_spend: number;
86
90
  monthly_spend: number;
91
+ daily_calls: number;
92
+ monthly_calls: number;
87
93
  task_count: number;
88
94
  total_spend: number;
89
95
  };
@@ -95,6 +101,10 @@ export declare class BudgetManager {
95
101
  user_monthly_total: number;
96
102
  workspace_daily_total: number;
97
103
  workspace_monthly_total: number;
104
+ user_daily_call_total: number;
105
+ user_monthly_call_total: number;
106
+ workspace_daily_call_total: number;
107
+ workspace_monthly_call_total: number;
98
108
  };
99
109
  }
100
110
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/budget/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/budget/manager.ts"],"names":[],"mappings":"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"}