@relayplane/proxy 1.5.45 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +258 -15
  2. package/assets/relayplane-proxy.service +20 -0
  3. package/dist/alerts.d.ts +72 -0
  4. package/dist/alerts.d.ts.map +1 -0
  5. package/dist/alerts.js +290 -0
  6. package/dist/alerts.js.map +1 -0
  7. package/dist/anomaly.d.ts +65 -0
  8. package/dist/anomaly.d.ts.map +1 -0
  9. package/dist/anomaly.js +193 -0
  10. package/dist/anomaly.js.map +1 -0
  11. package/dist/budget.d.ts +98 -0
  12. package/dist/budget.d.ts.map +1 -0
  13. package/dist/budget.js +356 -0
  14. package/dist/budget.js.map +1 -0
  15. package/dist/cli.js +512 -93
  16. package/dist/cli.js.map +1 -1
  17. package/dist/config.d.ts +28 -2
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +122 -24
  20. package/dist/config.js.map +1 -1
  21. package/dist/downgrade.d.ts +37 -0
  22. package/dist/downgrade.d.ts.map +1 -0
  23. package/dist/downgrade.js +79 -0
  24. package/dist/downgrade.js.map +1 -0
  25. package/dist/mesh/capture.d.ts +11 -0
  26. package/dist/mesh/capture.d.ts.map +1 -0
  27. package/dist/mesh/capture.js +43 -0
  28. package/dist/mesh/capture.js.map +1 -0
  29. package/dist/mesh/fitness.d.ts +14 -0
  30. package/dist/mesh/fitness.d.ts.map +1 -0
  31. package/dist/mesh/fitness.js +40 -0
  32. package/dist/mesh/fitness.js.map +1 -0
  33. package/dist/mesh/index.d.ts +39 -0
  34. package/dist/mesh/index.d.ts.map +1 -0
  35. package/dist/mesh/index.js +118 -0
  36. package/dist/mesh/index.js.map +1 -0
  37. package/dist/mesh/store.d.ts +30 -0
  38. package/dist/mesh/store.d.ts.map +1 -0
  39. package/dist/mesh/store.js +174 -0
  40. package/dist/mesh/store.js.map +1 -0
  41. package/dist/mesh/sync.d.ts +37 -0
  42. package/dist/mesh/sync.d.ts.map +1 -0
  43. package/dist/mesh/sync.js +154 -0
  44. package/dist/mesh/sync.js.map +1 -0
  45. package/dist/mesh/types.d.ts +57 -0
  46. package/dist/mesh/types.d.ts.map +1 -0
  47. package/dist/mesh/types.js +7 -0
  48. package/dist/mesh/types.js.map +1 -0
  49. package/dist/rate-limiter.d.ts +64 -0
  50. package/dist/rate-limiter.d.ts.map +1 -0
  51. package/dist/rate-limiter.js +159 -0
  52. package/dist/rate-limiter.js.map +1 -0
  53. package/dist/relay-config.d.ts +9 -0
  54. package/dist/relay-config.d.ts.map +1 -1
  55. package/dist/relay-config.js +2 -0
  56. package/dist/relay-config.js.map +1 -1
  57. package/dist/response-cache.d.ts +139 -0
  58. package/dist/response-cache.d.ts.map +1 -0
  59. package/dist/response-cache.js +515 -0
  60. package/dist/response-cache.js.map +1 -0
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +5 -1
  63. package/dist/server.js.map +1 -1
  64. package/dist/standalone-proxy.d.ts +2 -1
  65. package/dist/standalone-proxy.d.ts.map +1 -1
  66. package/dist/standalone-proxy.js +662 -26
  67. package/dist/standalone-proxy.js.map +1 -1
  68. package/dist/swarm-client.d.ts +8 -8
  69. package/dist/swarm-client.d.ts.map +1 -1
  70. package/dist/swarm-client.js +24 -24
  71. package/dist/swarm-client.js.map +1 -1
  72. package/dist/telemetry.d.ts.map +1 -1
  73. package/dist/telemetry.js +11 -8
  74. package/dist/telemetry.js.map +1 -1
  75. package/dist/utils/model-suggestions.d.ts.map +1 -1
  76. package/dist/utils/model-suggestions.js +19 -2
  77. package/dist/utils/model-suggestions.js.map +1 -1
  78. package/dist/utils/version-status.d.ts +9 -0
  79. package/dist/utils/version-status.d.ts.map +1 -0
  80. package/dist/utils/version-status.js +28 -0
  81. package/dist/utils/version-status.js.map +1 -0
  82. package/package.json +7 -3
package/dist/budget.js ADDED
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ /**
3
+ * RelayPlane Budget Enforcement
4
+ *
5
+ * SQLite-based spend tracking with in-memory cache for <5ms hot-path checks.
6
+ * Tracks daily/hourly windows and per-request limits.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.BudgetManager = exports.DEFAULT_BUDGET_CONFIG = void 0;
45
+ exports.getDailyWindow = getDailyWindow;
46
+ exports.getHourlyWindow = getHourlyWindow;
47
+ exports.getBudgetManager = getBudgetManager;
48
+ exports.resetBudgetManager = resetBudgetManager;
49
+ const path = __importStar(require("node:path"));
50
+ const os = __importStar(require("node:os"));
51
+ const fs = __importStar(require("node:fs"));
52
+ // ─── Defaults ────────────────────────────────────────────────────────
53
+ exports.DEFAULT_BUDGET_CONFIG = {
54
+ enabled: false,
55
+ dailyUsd: 50,
56
+ hourlyUsd: 10,
57
+ perRequestUsd: 2,
58
+ onBreach: 'downgrade',
59
+ downgradeTo: 'claude-sonnet-4-6',
60
+ alertThresholds: [50, 80, 95],
61
+ };
62
+ // ─── Window helpers ──────────────────────────────────────────────────
63
+ function getDailyWindow(timestamp) {
64
+ const d = timestamp ? new Date(timestamp) : new Date();
65
+ return d.toISOString().slice(0, 10); // YYYY-MM-DD
66
+ }
67
+ function getHourlyWindow(timestamp) {
68
+ const d = timestamp ? new Date(timestamp) : new Date();
69
+ return d.toISOString().slice(0, 13); // YYYY-MM-DDTHH
70
+ }
71
+ function openDatabase(dbPath) {
72
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
73
+ const Database = require('better-sqlite3');
74
+ const db = new Database(dbPath);
75
+ db.pragma('journal_mode = WAL');
76
+ db.pragma('synchronous = NORMAL');
77
+ return db;
78
+ }
79
+ // ─── BudgetManager ──────────────────────────────────────────────────
80
+ class BudgetManager {
81
+ config;
82
+ db = null;
83
+ _initialized = false;
84
+ // In-memory cache for <5ms hot-path
85
+ dailySpendCache = 0;
86
+ hourlySpendCache = 0;
87
+ cachedDailyWindow = '';
88
+ cachedHourlyWindow = '';
89
+ firedThresholds = new Set();
90
+ // Pending async writes
91
+ pendingWrites = [];
92
+ flushTimer = null;
93
+ constructor(config) {
94
+ this.config = { ...exports.DEFAULT_BUDGET_CONFIG, ...config };
95
+ }
96
+ /** Initialize SQLite storage. Safe to call multiple times. */
97
+ init() {
98
+ if (this._initialized)
99
+ return;
100
+ if (!this.config.enabled)
101
+ return;
102
+ this._initialized = true;
103
+ const budgetDir = path.join(os.homedir(), '.relayplane');
104
+ fs.mkdirSync(budgetDir, { recursive: true });
105
+ try {
106
+ const dbPath = path.join(budgetDir, 'budget.db');
107
+ this.db = openDatabase(dbPath);
108
+ this.db.exec(`
109
+ CREATE TABLE IF NOT EXISTS spend_log (
110
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
111
+ amount REAL NOT NULL,
112
+ model TEXT NOT NULL,
113
+ daily_window TEXT NOT NULL,
114
+ hourly_window TEXT NOT NULL,
115
+ timestamp INTEGER NOT NULL
116
+ );
117
+ CREATE INDEX IF NOT EXISTS idx_daily_window ON spend_log(daily_window);
118
+ CREATE INDEX IF NOT EXISTS idx_hourly_window ON spend_log(hourly_window);
119
+ `);
120
+ // Load current window totals into memory
121
+ this.refreshCache();
122
+ }
123
+ catch (err) {
124
+ console.warn('[RelayPlane Budget] SQLite unavailable, memory-only mode:', err.message);
125
+ this.db = null;
126
+ }
127
+ }
128
+ /** Update config at runtime */
129
+ updateConfig(config) {
130
+ this.config = { ...this.config, ...config };
131
+ }
132
+ getConfig() {
133
+ return { ...this.config };
134
+ }
135
+ /**
136
+ * Pre-request budget check. Must be <5ms.
137
+ * Uses in-memory cache, never touches SQLite.
138
+ */
139
+ checkBudget(estimatedCost) {
140
+ if (!this.config.enabled) {
141
+ return {
142
+ allowed: true, breached: false, breachType: 'none',
143
+ action: 'allow', currentDailySpend: 0, currentHourlySpend: 0,
144
+ thresholdsCrossed: [],
145
+ };
146
+ }
147
+ // Ensure cache is for current windows
148
+ this.ensureCacheWindows();
149
+ // Per-request check
150
+ if (estimatedCost !== undefined && estimatedCost > this.config.perRequestUsd) {
151
+ return {
152
+ allowed: this.config.onBreach !== 'block',
153
+ breached: true,
154
+ breachType: 'per-request',
155
+ action: this.config.onBreach,
156
+ currentDailySpend: this.dailySpendCache,
157
+ currentHourlySpend: this.hourlySpendCache,
158
+ thresholdsCrossed: [],
159
+ };
160
+ }
161
+ // Hourly check
162
+ if (this.hourlySpendCache >= this.config.hourlyUsd) {
163
+ return {
164
+ allowed: this.config.onBreach !== 'block',
165
+ breached: true,
166
+ breachType: 'hourly',
167
+ action: this.config.onBreach,
168
+ currentDailySpend: this.dailySpendCache,
169
+ currentHourlySpend: this.hourlySpendCache,
170
+ thresholdsCrossed: [],
171
+ };
172
+ }
173
+ // Daily check
174
+ if (this.dailySpendCache >= this.config.dailyUsd) {
175
+ return {
176
+ allowed: this.config.onBreach !== 'block',
177
+ breached: true,
178
+ breachType: 'daily',
179
+ action: this.config.onBreach,
180
+ currentDailySpend: this.dailySpendCache,
181
+ currentHourlySpend: this.hourlySpendCache,
182
+ thresholdsCrossed: [],
183
+ };
184
+ }
185
+ // Check thresholds
186
+ const thresholdsCrossed = [];
187
+ for (const threshold of this.config.alertThresholds) {
188
+ const pct = (this.dailySpendCache / this.config.dailyUsd) * 100;
189
+ const key = `${this.cachedDailyWindow}:${threshold}`;
190
+ if (pct >= threshold && !this.firedThresholds.has(key)) {
191
+ thresholdsCrossed.push(threshold);
192
+ }
193
+ }
194
+ return {
195
+ allowed: true, breached: false, breachType: 'none',
196
+ action: 'allow',
197
+ currentDailySpend: this.dailySpendCache,
198
+ currentHourlySpend: this.hourlySpendCache,
199
+ thresholdsCrossed,
200
+ };
201
+ }
202
+ /**
203
+ * Record spend after a request completes.
204
+ * Updates in-memory cache immediately, writes to SQLite async.
205
+ */
206
+ recordSpend(amount, model) {
207
+ if (!this.config.enabled)
208
+ return;
209
+ this.ensureCacheWindows();
210
+ // Update in-memory cache immediately
211
+ this.dailySpendCache += amount;
212
+ this.hourlySpendCache += amount;
213
+ // Queue async write
214
+ const record = {
215
+ amount,
216
+ model,
217
+ timestamp: Date.now(),
218
+ dailyWindow: this.cachedDailyWindow,
219
+ hourlyWindow: this.cachedHourlyWindow,
220
+ };
221
+ this.pendingWrites.push(record);
222
+ this.scheduleFlush();
223
+ }
224
+ /** Mark a threshold as fired (for deduplication) */
225
+ markThresholdFired(threshold) {
226
+ const key = `${this.cachedDailyWindow}:${threshold}`;
227
+ this.firedThresholds.add(key);
228
+ }
229
+ /** Get current budget status */
230
+ getStatus() {
231
+ this.ensureCacheWindows();
232
+ const dailyPercent = this.config.dailyUsd > 0
233
+ ? (this.dailySpendCache / this.config.dailyUsd) * 100 : 0;
234
+ const hourlyPercent = this.config.hourlyUsd > 0
235
+ ? (this.hourlySpendCache / this.config.hourlyUsd) * 100 : 0;
236
+ let breachType = 'none';
237
+ if (this.hourlySpendCache >= this.config.hourlyUsd)
238
+ breachType = 'hourly';
239
+ else if (this.dailySpendCache >= this.config.dailyUsd)
240
+ breachType = 'daily';
241
+ return {
242
+ dailySpend: this.dailySpendCache,
243
+ dailyLimit: this.config.dailyUsd,
244
+ dailyPercent,
245
+ hourlySpend: this.hourlySpendCache,
246
+ hourlyLimit: this.config.hourlyUsd,
247
+ hourlyPercent,
248
+ dailyWindow: this.cachedDailyWindow,
249
+ hourlyWindow: this.cachedHourlyWindow,
250
+ breached: breachType !== 'none',
251
+ breachType,
252
+ };
253
+ }
254
+ /** Reset current window spend */
255
+ reset() {
256
+ this.dailySpendCache = 0;
257
+ this.hourlySpendCache = 0;
258
+ this.firedThresholds.clear();
259
+ if (this.db) {
260
+ const dw = getDailyWindow();
261
+ const hw = getHourlyWindow();
262
+ this.db.prepare('DELETE FROM spend_log WHERE daily_window = ?').run(dw);
263
+ this.cachedDailyWindow = dw;
264
+ this.cachedHourlyWindow = hw;
265
+ }
266
+ }
267
+ /** Set budget limits */
268
+ setLimits(limits) {
269
+ if (limits.dailyUsd !== undefined)
270
+ this.config.dailyUsd = limits.dailyUsd;
271
+ if (limits.hourlyUsd !== undefined)
272
+ this.config.hourlyUsd = limits.hourlyUsd;
273
+ if (limits.perRequestUsd !== undefined)
274
+ this.config.perRequestUsd = limits.perRequestUsd;
275
+ }
276
+ /** Shutdown: flush pending writes */
277
+ close() {
278
+ this.flushPendingWrites();
279
+ if (this.flushTimer) {
280
+ clearTimeout(this.flushTimer);
281
+ this.flushTimer = null;
282
+ }
283
+ if (this.db) {
284
+ this.db.close();
285
+ this.db = null;
286
+ }
287
+ }
288
+ // ─── Private ──────────────────────────────────────────────────────
289
+ ensureCacheWindows() {
290
+ const dw = getDailyWindow();
291
+ const hw = getHourlyWindow();
292
+ if (dw !== this.cachedDailyWindow) {
293
+ this.cachedDailyWindow = dw;
294
+ this.dailySpendCache = 0;
295
+ this.firedThresholds.clear();
296
+ if (this.db) {
297
+ const row = this.db.prepare('SELECT COALESCE(SUM(amount), 0) as total FROM spend_log WHERE daily_window = ?').get(dw);
298
+ if (row)
299
+ this.dailySpendCache = row.total;
300
+ }
301
+ }
302
+ if (hw !== this.cachedHourlyWindow) {
303
+ this.cachedHourlyWindow = hw;
304
+ this.hourlySpendCache = 0;
305
+ if (this.db) {
306
+ const row = this.db.prepare('SELECT COALESCE(SUM(amount), 0) as total FROM spend_log WHERE hourly_window = ?').get(hw);
307
+ if (row)
308
+ this.hourlySpendCache = row.total;
309
+ }
310
+ }
311
+ }
312
+ refreshCache() {
313
+ this.cachedDailyWindow = '';
314
+ this.cachedHourlyWindow = '';
315
+ this.ensureCacheWindows();
316
+ }
317
+ scheduleFlush() {
318
+ if (this.flushTimer)
319
+ return;
320
+ this.flushTimer = setTimeout(() => {
321
+ this.flushTimer = null;
322
+ this.flushPendingWrites();
323
+ }, 1000);
324
+ }
325
+ flushPendingWrites() {
326
+ if (!this.db || this.pendingWrites.length === 0)
327
+ return;
328
+ const writes = this.pendingWrites.splice(0);
329
+ try {
330
+ const stmt = this.db.prepare('INSERT INTO spend_log (amount, model, daily_window, hourly_window, timestamp) VALUES (?, ?, ?, ?, ?)');
331
+ for (const w of writes) {
332
+ stmt.run(w.amount, w.model, w.dailyWindow, w.hourlyWindow, w.timestamp);
333
+ }
334
+ }
335
+ catch (err) {
336
+ console.warn('[RelayPlane Budget] SQLite flush failed:', err.message);
337
+ // In-memory cache is still accurate; SQLite is best-effort persistence
338
+ }
339
+ }
340
+ }
341
+ exports.BudgetManager = BudgetManager;
342
+ // ─── Singleton ──────────────────────────────────────────────────────
343
+ let _instance = null;
344
+ function getBudgetManager(config) {
345
+ if (!_instance) {
346
+ _instance = new BudgetManager(config);
347
+ }
348
+ return _instance;
349
+ }
350
+ function resetBudgetManager() {
351
+ if (_instance) {
352
+ _instance.close();
353
+ _instance = null;
354
+ }
355
+ }
356
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}