palaryn 0.4.15 → 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.
- package/README.md +12 -9
- package/dist/src/alerting/index.d.ts +2 -0
- package/dist/src/alerting/index.d.ts.map +1 -0
- package/dist/src/alerting/index.js +6 -0
- package/dist/src/alerting/index.js.map +1 -0
- package/dist/src/alerting/webhook-alerter.d.ts +40 -0
- package/dist/src/alerting/webhook-alerter.d.ts.map +1 -0
- package/dist/src/alerting/webhook-alerter.js +172 -0
- package/dist/src/alerting/webhook-alerter.js.map +1 -0
- package/dist/src/budget/manager.d.ts +10 -0
- package/dist/src/budget/manager.d.ts.map +1 -1
- package/dist/src/budget/manager.js +181 -17
- package/dist/src/budget/manager.js.map +1 -1
- package/dist/src/dlp/exfiltration-backend.d.ts +6 -0
- package/dist/src/dlp/exfiltration-backend.d.ts.map +1 -0
- package/dist/src/dlp/exfiltration-backend.js +62 -0
- package/dist/src/dlp/exfiltration-backend.js.map +1 -0
- package/dist/src/dlp/index.d.ts +2 -1
- package/dist/src/dlp/index.d.ts.map +1 -1
- package/dist/src/dlp/index.js +5 -1
- package/dist/src/dlp/index.js.map +1 -1
- package/dist/src/dlp/patterns.d.ts.map +1 -1
- package/dist/src/dlp/patterns.js +5 -1
- package/dist/src/dlp/patterns.js.map +1 -1
- package/dist/src/dlp/prompt-injection-backend.d.ts.map +1 -1
- package/dist/src/dlp/prompt-injection-backend.js +14 -0
- package/dist/src/dlp/prompt-injection-backend.js.map +1 -1
- package/dist/src/dlp/prompt-injection-patterns.d.ts.map +1 -1
- package/dist/src/dlp/prompt-injection-patterns.js +57 -1
- package/dist/src/dlp/prompt-injection-patterns.js.map +1 -1
- package/dist/src/dlp/text-normalizer.d.ts +7 -0
- package/dist/src/dlp/text-normalizer.d.ts.map +1 -1
- package/dist/src/dlp/text-normalizer.js +24 -0
- package/dist/src/dlp/text-normalizer.js.map +1 -1
- package/dist/src/saas/routes.d.ts.map +1 -1
- package/dist/src/saas/routes.js +13 -2
- package/dist/src/saas/routes.js.map +1 -1
- package/dist/src/server/gateway.d.ts +1 -0
- package/dist/src/server/gateway.d.ts.map +1 -1
- package/dist/src/server/gateway.js +178 -39
- package/dist/src/server/gateway.js.map +1 -1
- package/dist/src/storage/interfaces.d.ts +4 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -1
- package/dist/src/tracing/index.d.ts +1 -1
- package/dist/src/tracing/index.d.ts.map +1 -1
- package/dist/src/tracing/index.js +4 -1
- package/dist/src/tracing/index.js.map +1 -1
- package/dist/src/tracing/provider.d.ts +56 -0
- package/dist/src/tracing/provider.d.ts.map +1 -1
- package/dist/src/tracing/provider.js +77 -1
- package/dist/src/tracing/provider.js.map +1 -1
- package/dist/src/types/budget.d.ts +4 -0
- package/dist/src/types/budget.d.ts.map +1 -1
- package/dist/src/types/config.d.ts +3 -0
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/tool-result.d.ts +2 -0
- package/dist/src/types/tool-result.d.ts.map +1 -1
- package/dist/tests/unit/adversarial-pipeline.test.js +4 -4
- package/dist/tests/unit/adversarial-pipeline.test.js.map +1 -1
- package/dist/tests/unit/tracing.test.js +14 -15
- package/dist/tests/unit/tracing.test.js.map +1 -1
- package/dist/tests/unit/webhook-alerter.test.d.ts +2 -0
- package/dist/tests/unit/webhook-alerter.test.d.ts.map +1 -0
- package/dist/tests/unit/webhook-alerter.test.js +217 -0
- package/dist/tests/unit/webhook-alerter.test.js.map +1 -0
- package/package.json +1 -1
- package/src/alerting/index.ts +1 -0
- package/src/alerting/webhook-alerter.ts +212 -0
- package/src/budget/manager.ts +192 -18
- package/src/dlp/exfiltration-backend.ts +63 -0
- package/src/dlp/index.ts +2 -1
- package/src/dlp/patterns.ts +6 -1
- package/src/dlp/prompt-injection-backend.ts +16 -1
- package/src/dlp/prompt-injection-patterns.ts +59 -1
- package/src/dlp/text-normalizer.ts +26 -0
- package/src/saas/routes.ts +13 -2
- package/src/server/gateway.ts +163 -43
- package/src/storage/interfaces.ts +4 -0
- package/src/tracing/index.ts +1 -1
- package/src/tracing/provider.ts +88 -0
- package/src/types/budget.ts +4 -0
- package/src/types/config.ts +3 -0
- package/src/types/tool-result.ts +2 -0
package/README.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Palaryn
|
|
2
2
|
|
|
3
|
-
**
|
|
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
|
|
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
|
|
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
|
|
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 &
|
|
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** —
|
|
193
|
-
- **
|
|
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
|
-
│
|
|
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.
|
|
375
|
+
*"Your agents can use tools. Under your rules."*
|
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAe,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAgB9C,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAc;IAEpC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/budget/manager.ts"],"names":[],"mappings":"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"}
|