@relayplane/proxy 1.5.46 → 1.7.2

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 (78) hide show
  1. package/README.md +297 -20
  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 +736 -50
  67. package/dist/standalone-proxy.js.map +1 -1
  68. package/dist/telemetry.d.ts.map +1 -1
  69. package/dist/telemetry.js +21 -5
  70. package/dist/telemetry.js.map +1 -1
  71. package/dist/utils/model-suggestions.d.ts.map +1 -1
  72. package/dist/utils/model-suggestions.js +19 -2
  73. package/dist/utils/model-suggestions.js.map +1 -1
  74. package/dist/utils/version-status.d.ts +9 -0
  75. package/dist/utils/version-status.d.ts.map +1 -0
  76. package/dist/utils/version-status.js +28 -0
  77. package/dist/utils/version-status.js.map +1 -0
  78. package/package.json +7 -3
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * Osmosis Knowledge Mesh — Mesh Sync
4
+ * Push local atoms to mesh server, pull high-fitness atoms back.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MeshSyncManager = void 0;
8
+ exports.pushToMesh = pushToMesh;
9
+ exports.pullFromMesh = pullFromMesh;
10
+ exports.syncWithMesh = syncWithMesh;
11
+ /**
12
+ * Push unsynced atoms to the mesh endpoint.
13
+ */
14
+ async function pushToMesh(store, endpoint, apiKey) {
15
+ const errors = [];
16
+ const now = new Date().toISOString();
17
+ const toSync = store.getUnsynced();
18
+ if (toSync.length === 0) {
19
+ store.setLastPushAt(endpoint, now);
20
+ return { pushed: 0, pulled: 0, deduped: 0, errors: [], timestamp: now };
21
+ }
22
+ let pushed = 0;
23
+ let deduped = 0;
24
+ try {
25
+ const payload = toSync.map(({ id, created_at, updated_at, synced, ...rest }) => rest);
26
+ const headers = { 'Content-Type': 'application/json' };
27
+ if (apiKey)
28
+ headers['Authorization'] = `Bearer ${apiKey}`;
29
+ const res = await fetch(`${endpoint}/atoms/batch`, {
30
+ method: 'POST',
31
+ headers,
32
+ body: JSON.stringify(payload),
33
+ signal: AbortSignal.timeout(15000),
34
+ });
35
+ if (res.ok) {
36
+ const body = await res.json();
37
+ pushed = body.accepted ?? toSync.length;
38
+ store.markSynced(toSync.map(a => a.id));
39
+ }
40
+ else {
41
+ const errBody = await res.text();
42
+ errors.push(`Push failed: ${res.status} ${errBody}`);
43
+ }
44
+ }
45
+ catch (err) {
46
+ errors.push(`Push error: ${err.message}`);
47
+ }
48
+ store.setLastPushAt(endpoint, now);
49
+ return { pushed, pulled: 0, deduped, errors, timestamp: now };
50
+ }
51
+ /**
52
+ * Pull high-fitness atoms from the mesh.
53
+ */
54
+ async function pullFromMesh(store, endpoint, apiKey) {
55
+ const errors = [];
56
+ const now = new Date().toISOString();
57
+ const since = store.getLastPullAt(endpoint);
58
+ try {
59
+ const url = since
60
+ ? `${endpoint}/atoms?since=${encodeURIComponent(since)}`
61
+ : `${endpoint}/atoms`;
62
+ const headers = {};
63
+ if (apiKey)
64
+ headers['Authorization'] = `Bearer ${apiKey}`;
65
+ const res = await fetch(url, { headers, signal: AbortSignal.timeout(15000) });
66
+ if (!res.ok) {
67
+ const errBody = await res.text();
68
+ return { pushed: 0, pulled: 0, deduped: 0, errors: [`Pull failed: ${res.status} ${errBody}`], timestamp: now };
69
+ }
70
+ const remoteAtoms = await res.json();
71
+ let pulled = 0;
72
+ for (const atom of remoteAtoms) {
73
+ try {
74
+ const { id, created_at, updated_at, synced, ...data } = atom;
75
+ store.insert({ ...data, synced: true });
76
+ pulled++;
77
+ }
78
+ catch (err) {
79
+ errors.push(`Pull insert error: ${err.message}`);
80
+ }
81
+ }
82
+ store.setLastPullAt(endpoint, now);
83
+ return { pushed: 0, pulled, deduped: 0, errors, timestamp: now };
84
+ }
85
+ catch (err) {
86
+ return { pushed: 0, pulled: 0, deduped: 0, errors: [`Pull error: ${err.message}`], timestamp: now };
87
+ }
88
+ }
89
+ /**
90
+ * Run a full sync cycle (push then pull).
91
+ */
92
+ async function syncWithMesh(store, endpoint, apiKey) {
93
+ const pushResult = await pushToMesh(store, endpoint, apiKey);
94
+ const pullResult = await pullFromMesh(store, endpoint, apiKey);
95
+ return {
96
+ pushed: pushResult.pushed,
97
+ pulled: pullResult.pulled,
98
+ deduped: pushResult.deduped + pullResult.deduped,
99
+ errors: [...pushResult.errors, ...pullResult.errors],
100
+ timestamp: new Date().toISOString(),
101
+ };
102
+ }
103
+ /**
104
+ * Auto-sync manager. Starts interval-based sync.
105
+ */
106
+ class MeshSyncManager {
107
+ store;
108
+ endpoint;
109
+ intervalMs;
110
+ apiKey;
111
+ timer = null;
112
+ lastSync = null;
113
+ lastErrors = [];
114
+ constructor(store, endpoint, intervalMs, apiKey) {
115
+ this.store = store;
116
+ this.endpoint = endpoint;
117
+ this.intervalMs = intervalMs;
118
+ this.apiKey = apiKey;
119
+ }
120
+ start() {
121
+ if (this.timer)
122
+ return;
123
+ // Initial sync after short delay
124
+ setTimeout(() => this.doSync(), 5000);
125
+ this.timer = setInterval(() => this.doSync(), this.intervalMs);
126
+ this.timer.unref();
127
+ }
128
+ stop() {
129
+ if (this.timer) {
130
+ clearInterval(this.timer);
131
+ this.timer = null;
132
+ }
133
+ }
134
+ async doSync() {
135
+ const result = await syncWithMesh(this.store, this.endpoint, this.apiKey);
136
+ this.lastSync = result.timestamp;
137
+ this.lastErrors = result.errors;
138
+ if (result.errors.length > 0) {
139
+ console.log(`[MESH] Sync errors: ${result.errors.join('; ')}`);
140
+ }
141
+ else if (result.pushed > 0 || result.pulled > 0) {
142
+ console.log(`[MESH] Synced: pushed ${result.pushed}, pulled ${result.pulled}`);
143
+ }
144
+ return result;
145
+ }
146
+ getLastSyncTime() {
147
+ return this.lastSync;
148
+ }
149
+ getLastErrors() {
150
+ return this.lastErrors;
151
+ }
152
+ }
153
+ exports.MeshSyncManager = MeshSyncManager;
154
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/mesh/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Osmosis Knowledge Mesh — Types
3
+ * Adapted from ~/osmosis/packages/core/src/types/
4
+ */
5
+ export type TrustTier = 'quarantine' | 'local' | 'verified' | 'canonical';
6
+ export type AtomType = 'tool' | 'negative' | 'pattern' | 'skill' | 'context';
7
+ export type Outcome = 'success' | 'failure' | 'partial';
8
+ export type Severity = 'low' | 'medium' | 'high' | 'critical';
9
+ export interface KnowledgeAtom {
10
+ id: string;
11
+ type: AtomType;
12
+ observation: string;
13
+ context: string;
14
+ confidence: number;
15
+ fitness_score: number;
16
+ trust_tier: TrustTier;
17
+ source_agent_hash: string;
18
+ created_at: string;
19
+ updated_at: string;
20
+ decay_rate: number;
21
+ tool_name?: string;
22
+ params_hash?: string;
23
+ outcome?: Outcome;
24
+ error_signature?: string | null;
25
+ latency_ms?: number | null;
26
+ reliability_score?: number;
27
+ anti_pattern?: string;
28
+ failure_cluster_size?: number;
29
+ error_type?: string;
30
+ severity?: Severity;
31
+ evidence_count?: number;
32
+ use_count?: number;
33
+ success_after_use?: number;
34
+ failure_after_use?: number;
35
+ last_used?: string | null;
36
+ synced?: boolean;
37
+ }
38
+ export interface CaptureEvent {
39
+ model: string;
40
+ provider: string;
41
+ task_type: string;
42
+ input_tokens: number;
43
+ output_tokens: number;
44
+ cost_usd: number;
45
+ latency_ms: number;
46
+ success: boolean;
47
+ error_type?: string;
48
+ timestamp: string;
49
+ }
50
+ export interface SyncResult {
51
+ pushed: number;
52
+ pulled: number;
53
+ deduped: number;
54
+ errors: string[];
55
+ timestamp: string;
56
+ }
57
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mesh/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAC1E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAC7E,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Osmosis Knowledge Mesh — Types
4
+ * Adapted from ~/osmosis/packages/core/src/types/
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mesh/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Rate Limiter - In-memory rate limiting for RelayPlane Proxy
3
+ *
4
+ * Hard limits:
5
+ * - Opus models: 10 requests per minute
6
+ * - Other models: 60 requests per minute (default)
7
+ *
8
+ * Auto-expires old entries every 5 minutes
9
+ */
10
+ export interface RateLimitConfig {
11
+ rpm: number;
12
+ maxTokens?: number;
13
+ }
14
+ export interface RateLimitCheck {
15
+ allowed: boolean;
16
+ remaining: number;
17
+ resetAt: number;
18
+ limit: number;
19
+ retryAfter?: number;
20
+ }
21
+ export declare const DEFAULT_LIMITS: Record<string, RateLimitConfig>;
22
+ declare class RateLimiter {
23
+ private buckets;
24
+ private lastCleanup;
25
+ private readonly CLEANUP_INTERVAL;
26
+ /**
27
+ * Check if a request is allowed under rate limits
28
+ */
29
+ checkLimit(workspaceId: string, model: string): RateLimitCheck;
30
+ /**
31
+ * Get current usage for a workspace/model
32
+ */
33
+ getUsage(workspaceId: string, model: string): {
34
+ used: number;
35
+ limit: number;
36
+ resetAt: number;
37
+ };
38
+ /**
39
+ * Reset limit for a specific workspace/model (emergency use)
40
+ */
41
+ resetLimit(workspaceId: string, model?: string): void;
42
+ /**
43
+ * Get all active limits (for debugging)
44
+ */
45
+ getActiveLimits(): Array<{
46
+ key: string;
47
+ count: number;
48
+ resetAt: number;
49
+ }>;
50
+ private getConfig;
51
+ private getModelKey;
52
+ private getCurrentMinute;
53
+ private maybeCleanup;
54
+ }
55
+ export declare const rateLimiter: RateLimiter;
56
+ export declare const checkLimit: (workspaceId: string, model: string) => RateLimitCheck;
57
+ export declare const getUsage: (workspaceId: string, model: string) => {
58
+ used: number;
59
+ limit: number;
60
+ resetAt: number;
61
+ };
62
+ export declare const resetLimit: (workspaceId: string, model?: string) => void;
63
+ export {};
64
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAe1D,CAAC;AAOF,cAAM,WAAW;IACf,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAElD;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc;IAsC9D;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAY9F;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAYrD;;OAEG;IACH,eAAe,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQzE,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,YAAY;CAerB;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC;AAG7C,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,EAAE,OAAO,MAAM,mBACjB,CAAC;AAE7C,eAAO,MAAM,QAAQ,GAAI,aAAa,MAAM,EAAE,OAAO,MAAM;UAjGH,MAAM;WAAS,MAAM;aAAW,MAAM;CAkGpD,CAAC;AAE3C,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,EAAE,QAAQ,MAAM,SAClB,CAAC"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * Rate Limiter - In-memory rate limiting for RelayPlane Proxy
4
+ *
5
+ * Hard limits:
6
+ * - Opus models: 10 requests per minute
7
+ * - Other models: 60 requests per minute (default)
8
+ *
9
+ * Auto-expires old entries every 5 minutes
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.resetLimit = exports.getUsage = exports.checkLimit = exports.rateLimiter = exports.DEFAULT_LIMITS = void 0;
13
+ // Hardcoded limits - Opus is expensive, be conservative
14
+ exports.DEFAULT_LIMITS = {
15
+ // Anthropic models
16
+ 'claude-opus-4-6': { rpm: 10, maxTokens: 4096 },
17
+ 'claude-opus': { rpm: 10, maxTokens: 4096 },
18
+ 'claude-sonnet-4-6': { rpm: 30 },
19
+ 'claude-haiku-4-5': { rpm: 60 },
20
+ // OpenAI models
21
+ 'gpt-4o': { rpm: 30 },
22
+ 'gpt-4': { rpm: 20 },
23
+ 'o1': { rpm: 10, maxTokens: 4096 },
24
+ 'o3-mini': { rpm: 30 },
25
+ // Default for unknown models
26
+ 'default': { rpm: 60 }
27
+ };
28
+ class RateLimiter {
29
+ buckets = new Map();
30
+ lastCleanup = Date.now();
31
+ CLEANUP_INTERVAL = 5 * 60 * 1000; // 5 minutes
32
+ /**
33
+ * Check if a request is allowed under rate limits
34
+ */
35
+ checkLimit(workspaceId, model) {
36
+ this.maybeCleanup();
37
+ const config = this.getConfig(model);
38
+ const key = `${workspaceId}:${this.getModelKey(model)}:${this.getCurrentMinute()}`;
39
+ const now = Date.now();
40
+ const windowMs = 60 * 1000; // 1 minute window
41
+ const resetAt = this.getCurrentMinute() + windowMs;
42
+ let entry = this.buckets.get(key);
43
+ if (!entry) {
44
+ entry = { count: 0, resetAt };
45
+ this.buckets.set(key, entry);
46
+ }
47
+ // Check if window expired and reset
48
+ if (now > entry.resetAt) {
49
+ entry.count = 0;
50
+ entry.resetAt = resetAt;
51
+ }
52
+ const remaining = Math.max(0, config.rpm - entry.count);
53
+ const allowed = entry.count < config.rpm;
54
+ if (allowed) {
55
+ entry.count++;
56
+ }
57
+ return {
58
+ allowed,
59
+ remaining,
60
+ resetAt,
61
+ limit: config.rpm,
62
+ retryAfter: allowed ? undefined : Math.ceil((resetAt - now) / 1000)
63
+ };
64
+ }
65
+ /**
66
+ * Get current usage for a workspace/model
67
+ */
68
+ getUsage(workspaceId, model) {
69
+ const config = this.getConfig(model);
70
+ const key = `${workspaceId}:${this.getModelKey(model)}:${this.getCurrentMinute()}`;
71
+ const entry = this.buckets.get(key);
72
+ return {
73
+ used: entry?.count || 0,
74
+ limit: config.rpm,
75
+ resetAt: entry?.resetAt || this.getCurrentMinute() + 60 * 1000
76
+ };
77
+ }
78
+ /**
79
+ * Reset limit for a specific workspace/model (emergency use)
80
+ */
81
+ resetLimit(workspaceId, model) {
82
+ const prefix = model
83
+ ? `${workspaceId}:${this.getModelKey(model)}:`
84
+ : `${workspaceId}:`;
85
+ for (const [key] of this.buckets) {
86
+ if (key.startsWith(prefix)) {
87
+ this.buckets.delete(key);
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Get all active limits (for debugging)
93
+ */
94
+ getActiveLimits() {
95
+ return Array.from(this.buckets.entries()).map(([key, entry]) => ({
96
+ key,
97
+ count: entry.count,
98
+ resetAt: entry.resetAt
99
+ }));
100
+ }
101
+ getConfig(model) {
102
+ // Normalize model name
103
+ const normalized = model.toLowerCase().replace(/[^a-z0-9-]/g, '');
104
+ // Check exact match first
105
+ if (exports.DEFAULT_LIMITS[normalized]) {
106
+ return exports.DEFAULT_LIMITS[normalized];
107
+ }
108
+ // Check partial match
109
+ for (const [key, config] of Object.entries(exports.DEFAULT_LIMITS)) {
110
+ if (normalized.includes(key) || key.includes(normalized)) {
111
+ return config;
112
+ }
113
+ }
114
+ return exports.DEFAULT_LIMITS.default;
115
+ }
116
+ getModelKey(model) {
117
+ const normalized = model.toLowerCase();
118
+ if (normalized.includes('opus'))
119
+ return 'opus';
120
+ if (normalized.includes('sonnet'))
121
+ return 'sonnet';
122
+ if (normalized.includes('haiku'))
123
+ return 'haiku';
124
+ if (normalized.includes('gpt-4o'))
125
+ return 'gpt-4o';
126
+ if (normalized.includes('gpt-4'))
127
+ return 'gpt-4';
128
+ if (normalized.includes('o1'))
129
+ return 'o1';
130
+ return 'default';
131
+ }
132
+ getCurrentMinute() {
133
+ const now = Date.now();
134
+ return Math.floor(now / 60000) * 60000;
135
+ }
136
+ maybeCleanup() {
137
+ const now = Date.now();
138
+ if (now - this.lastCleanup < this.CLEANUP_INTERVAL) {
139
+ return;
140
+ }
141
+ // Remove expired entries
142
+ for (const [key, entry] of this.buckets) {
143
+ if (now > entry.resetAt + 60000) { // Keep 1 minute grace period
144
+ this.buckets.delete(key);
145
+ }
146
+ }
147
+ this.lastCleanup = now;
148
+ }
149
+ }
150
+ // Singleton instance
151
+ exports.rateLimiter = new RateLimiter();
152
+ // Convenience exports
153
+ const checkLimit = (workspaceId, model) => exports.rateLimiter.checkLimit(workspaceId, model);
154
+ exports.checkLimit = checkLimit;
155
+ const getUsage = (workspaceId, model) => exports.rateLimiter.getUsage(workspaceId, model);
156
+ exports.getUsage = getUsage;
157
+ const resetLimit = (workspaceId, model) => exports.rateLimiter.resetLimit(workspaceId, model);
158
+ exports.resetLimit = resetLimit;
159
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,13 @@ export interface MeshConfig {
17
17
  dataDir: string;
18
18
  }
19
19
  export declare const DEFAULT_MESH_CONFIG: MeshConfig;
20
+ export interface ResponseCacheConfig {
21
+ enabled: boolean;
22
+ maxSizeMb: number;
23
+ defaultTtlSeconds: number;
24
+ ttlByTaskType?: Record<string, number>;
25
+ onlyWhenDeterministic: boolean;
26
+ }
20
27
  export interface RelayPlaneConfig {
21
28
  enabled: boolean;
22
29
  /** Proxy URL (default: http://127.0.0.1:4100) */
@@ -30,6 +37,8 @@ export interface RelayPlaneConfig {
30
37
  autoStart?: boolean;
31
38
  /** Mesh learning layer config */
32
39
  mesh?: Partial<MeshConfig>;
40
+ /** Response cache config */
41
+ cache?: Partial<ResponseCacheConfig>;
33
42
  }
34
43
  export declare const DEFAULT_RELAY_CONFIG: Required<RelayPlaneConfig>;
35
44
  export declare function resolveConfig(partial?: Partial<RelayPlaneConfig>): Required<RelayPlaneConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"relay-config.d.ts","sourceRoot":"","sources":["../src/relay-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,EAAE,UAOjC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5B;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,gBAAgB,CAU3D,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAY7F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAE3E"}
1
+ {"version":3,"file":"relay-config.d.ts","sourceRoot":"","sources":["../src/relay-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,EAAE,UAOjC,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,gBAAgB,CAW3D,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAa7F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAE3E"}
@@ -25,6 +25,7 @@ exports.DEFAULT_RELAY_CONFIG = {
25
25
  },
26
26
  autoStart: true,
27
27
  mesh: { ...exports.DEFAULT_MESH_CONFIG },
28
+ cache: { enabled: true, maxSizeMb: 100, defaultTtlSeconds: 3600, onlyWhenDeterministic: true },
28
29
  };
29
30
  function resolveConfig(partial) {
30
31
  if (!partial)
@@ -38,6 +39,7 @@ function resolveConfig(partial) {
38
39
  },
39
40
  autoStart: partial.autoStart ?? exports.DEFAULT_RELAY_CONFIG.autoStart,
40
41
  mesh: { ...exports.DEFAULT_MESH_CONFIG, ...partial.mesh },
42
+ cache: { ...exports.DEFAULT_RELAY_CONFIG.cache, ...partial.cache },
41
43
  };
42
44
  }
43
45
  function resolveMeshConfig(partial) {
@@ -1 +1 @@
1
- {"version":3,"file":"relay-config.js","sourceRoot":"","sources":["../src/relay-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAqDH,sCAYC;AAED,8CAEC;AApDY,QAAA,mBAAmB,GAAe;IAC7C,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,kCAAkC;IAC3C,cAAc,EAAE,OAAO;IACvB,gBAAgB,EAAE,OAAO;IACzB,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,mBAAmB;CAC3D,CAAC;AAiBW,QAAA,oBAAoB,GAA+B;IAC9D,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,uBAAuB;IACjC,cAAc,EAAE;QACd,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,MAAM;QACtB,gBAAgB,EAAE,KAAK;KACxB;IACD,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,EAAE,GAAG,2BAAmB,EAAE;CACjC,CAAC;AAEF,SAAgB,aAAa,CAAC,OAAmC;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,4BAAoB,EAAE,CAAC;IACjD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,4BAAoB,CAAC,OAAO;QACxD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,4BAAoB,CAAC,QAAQ;QAC3D,cAAc,EAAE;YACd,GAAG,4BAAoB,CAAC,cAAc;YACtC,GAAG,OAAO,CAAC,cAAc;SAC1B;QACD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,4BAAoB,CAAC,SAAS;QAC9D,IAAI,EAAE,EAAE,GAAG,2BAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;KAClD,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAA6B;IAC7D,OAAO,EAAE,GAAG,2BAAmB,EAAE,GAAG,OAAO,EAAE,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"relay-config.js","sourceRoot":"","sources":["../src/relay-config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAgEH,sCAaC;AAED,8CAEC;AAhEY,QAAA,mBAAmB,GAAe;IAC7C,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,kCAAkC;IAC3C,cAAc,EAAE,OAAO;IACvB,gBAAgB,EAAE,OAAO;IACzB,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,mBAAmB;CAC3D,CAAC;AA2BW,QAAA,oBAAoB,GAA+B;IAC9D,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,uBAAuB;IACjC,cAAc,EAAE;QACd,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,MAAM;QACtB,gBAAgB,EAAE,KAAK;KACxB;IACD,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,EAAE,GAAG,2BAAmB,EAAE;IAChC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE;CAC/F,CAAC;AAEF,SAAgB,aAAa,CAAC,OAAmC;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,4BAAoB,EAAE,CAAC;IACjD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,4BAAoB,CAAC,OAAO;QACxD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,4BAAoB,CAAC,QAAQ;QAC3D,cAAc,EAAE;YACd,GAAG,4BAAoB,CAAC,cAAc;YACtC,GAAG,OAAO,CAAC,cAAc;SAC1B;QACD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,4BAAoB,CAAC,SAAS;QAC9D,IAAI,EAAE,EAAE,GAAG,2BAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;QACjD,KAAK,EAAE,EAAE,GAAG,4BAAoB,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE;KAC3D,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAA6B;IAC7D,OAAO,EAAE,GAAG,2BAAmB,EAAE,GAAG,OAAO,EAAE,CAAC;AAChD,CAAC"}