sona-code 0.1.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 +119 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2979 -0
- package/dist/cli.js.map +1 -0
- package/dist/compressor.d.ts +84 -0
- package/dist/compressor.d.ts.map +1 -0
- package/dist/compressor.js +237 -0
- package/dist/compressor.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +81 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +165 -0
- package/dist/middleware.js.map +1 -0
- package/dist/proxy.d.ts +105 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +548 -0
- package/dist/proxy.js.map +1 -0
- package/dist/rules.d.ts +30 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +201 -0
- package/dist/rules.js.map +1 -0
- package/dist/session.d.ts +156 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +351 -0
- package/dist/session.js.map +1 -0
- package/package.json +51 -0
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SONA Transparent Proxy Server
|
|
4
|
+
*
|
|
5
|
+
* Intercepts OpenAI/Anthropic API calls, compresses prompts,
|
|
6
|
+
* and forwards to the real API. Works with ANY tool that uses
|
|
7
|
+
* these SDKs without code changes.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SonaProxy = void 0;
|
|
11
|
+
exports.startProxy = startProxy;
|
|
12
|
+
const http_1 = require("http");
|
|
13
|
+
const https_1 = require("https");
|
|
14
|
+
const compressor_js_1 = require("./compressor.js");
|
|
15
|
+
const url_1 = require("url");
|
|
16
|
+
const DEFAULT_OPTIONS = {
|
|
17
|
+
port: 8787,
|
|
18
|
+
openaiBaseUrl: 'https://api.openai.com',
|
|
19
|
+
anthropicBaseUrl: 'https://api.anthropic.com',
|
|
20
|
+
openaiApiKey: '',
|
|
21
|
+
anthropicApiKey: '',
|
|
22
|
+
pricePerMillionTokens: 15.0,
|
|
23
|
+
maxLogEntries: 1000,
|
|
24
|
+
verbose: false,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* SONA Proxy Server
|
|
28
|
+
*/
|
|
29
|
+
class SonaProxy {
|
|
30
|
+
server = null;
|
|
31
|
+
compressor;
|
|
32
|
+
options;
|
|
33
|
+
stats;
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
36
|
+
this.compressor = new compressor_js_1.SonaCompressor({
|
|
37
|
+
pricePerMillionTokens: this.options.pricePerMillionTokens,
|
|
38
|
+
});
|
|
39
|
+
this.stats = this.initStats();
|
|
40
|
+
}
|
|
41
|
+
initStats() {
|
|
42
|
+
return {
|
|
43
|
+
startedAt: new Date(),
|
|
44
|
+
totalRequests: 0,
|
|
45
|
+
openaiRequests: 0,
|
|
46
|
+
anthropicRequests: 0,
|
|
47
|
+
totalOriginalTokens: 0,
|
|
48
|
+
totalCompressedTokens: 0,
|
|
49
|
+
totalTokensSaved: 0,
|
|
50
|
+
estimatedCostSaved: 0,
|
|
51
|
+
requestLog: [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Start the proxy server
|
|
56
|
+
*/
|
|
57
|
+
start() {
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
this.server = (0, http_1.createServer)((req, res) => this.handleRequest(req, res));
|
|
60
|
+
this.server.on('error', (err) => {
|
|
61
|
+
reject(err);
|
|
62
|
+
});
|
|
63
|
+
this.server.listen(this.options.port, () => {
|
|
64
|
+
resolve();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stop the proxy server
|
|
70
|
+
*/
|
|
71
|
+
stop() {
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
if (this.server) {
|
|
74
|
+
this.server.close(() => resolve());
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
resolve();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get current statistics
|
|
83
|
+
*/
|
|
84
|
+
getStats() {
|
|
85
|
+
return { ...this.stats };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Reset statistics
|
|
89
|
+
*/
|
|
90
|
+
resetStats() {
|
|
91
|
+
this.stats = this.initStats();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Handle incoming request
|
|
95
|
+
*/
|
|
96
|
+
async handleRequest(req, res) {
|
|
97
|
+
const startTime = Date.now();
|
|
98
|
+
// Handle stats endpoint
|
|
99
|
+
if (req.url === '/_sona/stats') {
|
|
100
|
+
return this.handleStatsRequest(res);
|
|
101
|
+
}
|
|
102
|
+
// Handle dashboard
|
|
103
|
+
if (req.url === '/_sona/dashboard' || req.url === '/') {
|
|
104
|
+
return this.handleDashboard(res);
|
|
105
|
+
}
|
|
106
|
+
// Handle health check
|
|
107
|
+
if (req.url === '/_sona/health') {
|
|
108
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
109
|
+
res.end(JSON.stringify({ status: 'ok', uptime: Date.now() - this.stats.startedAt.getTime() }));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Determine target API
|
|
113
|
+
const provider = this.detectProvider(req);
|
|
114
|
+
const targetBaseUrl = provider === 'openai'
|
|
115
|
+
? this.options.openaiBaseUrl
|
|
116
|
+
: this.options.anthropicBaseUrl;
|
|
117
|
+
// Read request body
|
|
118
|
+
const body = await this.readBody(req);
|
|
119
|
+
// Compress if applicable
|
|
120
|
+
const { compressedBody, originalTokens, compressedTokens } = this.compressRequestBody(body, provider);
|
|
121
|
+
// Check if we have the required API key
|
|
122
|
+
if (provider === 'openai' && !this.options.openaiApiKey) {
|
|
123
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
124
|
+
res.end(JSON.stringify({ error: 'OpenAI API key not configured', message: 'Run sona start and provide your OpenAI API key' }));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (provider === 'anthropic' && !this.options.anthropicApiKey) {
|
|
128
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
129
|
+
res.end(JSON.stringify({ error: 'Anthropic API key not configured', message: 'Run sona start and provide your Anthropic API key' }));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Forward request
|
|
133
|
+
try {
|
|
134
|
+
const response = await this.forwardRequest(req, targetBaseUrl, compressedBody, provider);
|
|
135
|
+
// Log stats
|
|
136
|
+
const latencyMs = Date.now() - startTime;
|
|
137
|
+
this.logRequest(provider, req.url || '', originalTokens, compressedTokens, latencyMs);
|
|
138
|
+
// Send response
|
|
139
|
+
res.writeHead(response.statusCode, response.headers);
|
|
140
|
+
res.end(response.body);
|
|
141
|
+
if (this.options.verbose) {
|
|
142
|
+
const saved = originalTokens - compressedTokens;
|
|
143
|
+
console.log(`[SONA] ${provider} ${req.url} - ${saved} tokens saved (${((saved / Math.max(originalTokens, 1)) * 100).toFixed(1)}%)`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('[SONA] Proxy error:', error);
|
|
148
|
+
res.writeHead(502, { 'Content-Type': 'application/json' });
|
|
149
|
+
res.end(JSON.stringify({ error: 'Proxy error', message: error.message }));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Detect which provider the request is for
|
|
154
|
+
*/
|
|
155
|
+
detectProvider(req) {
|
|
156
|
+
const url = req.url || '';
|
|
157
|
+
const headers = req.headers;
|
|
158
|
+
// Check for Anthropic-specific headers
|
|
159
|
+
if (headers['x-api-key'] && headers['anthropic-version']) {
|
|
160
|
+
return 'anthropic';
|
|
161
|
+
}
|
|
162
|
+
// Check URL patterns
|
|
163
|
+
if (url.includes('/v1/chat/completions') || url.includes('/v1/completions')) {
|
|
164
|
+
return 'openai';
|
|
165
|
+
}
|
|
166
|
+
if (url.includes('/v1/messages')) {
|
|
167
|
+
return 'anthropic';
|
|
168
|
+
}
|
|
169
|
+
// Check authorization header format
|
|
170
|
+
const auth = headers['authorization'];
|
|
171
|
+
if (auth && typeof auth === 'string') {
|
|
172
|
+
if (auth.startsWith('Bearer sk-')) {
|
|
173
|
+
return 'openai';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return 'unknown';
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Read request body
|
|
180
|
+
*/
|
|
181
|
+
readBody(req) {
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
let body = '';
|
|
184
|
+
req.on('data', chunk => body += chunk);
|
|
185
|
+
req.on('end', () => resolve(body));
|
|
186
|
+
req.on('error', reject);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Compress request body based on provider
|
|
191
|
+
*/
|
|
192
|
+
compressRequestBody(body, provider) {
|
|
193
|
+
if (!body) {
|
|
194
|
+
return { compressedBody: body, originalTokens: 0, compressedTokens: 0 };
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const parsed = JSON.parse(body);
|
|
198
|
+
let originalTokens = 0;
|
|
199
|
+
let compressedTokens = 0;
|
|
200
|
+
if (provider === 'openai' && parsed.messages) {
|
|
201
|
+
// OpenAI format
|
|
202
|
+
parsed.messages = parsed.messages.map((msg) => {
|
|
203
|
+
if (typeof msg.content === 'string') {
|
|
204
|
+
const result = this.compressor.compress(msg.content);
|
|
205
|
+
originalTokens += result.originalTokens;
|
|
206
|
+
compressedTokens += result.compressedTokens;
|
|
207
|
+
return { ...msg, content: result.compressedText };
|
|
208
|
+
}
|
|
209
|
+
return msg;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
else if (provider === 'anthropic') {
|
|
213
|
+
// Anthropic format
|
|
214
|
+
if (parsed.system && typeof parsed.system === 'string') {
|
|
215
|
+
const result = this.compressor.compress(parsed.system);
|
|
216
|
+
originalTokens += result.originalTokens;
|
|
217
|
+
compressedTokens += result.compressedTokens;
|
|
218
|
+
parsed.system = result.compressedText;
|
|
219
|
+
}
|
|
220
|
+
if (parsed.messages) {
|
|
221
|
+
parsed.messages = parsed.messages.map((msg) => {
|
|
222
|
+
if (typeof msg.content === 'string') {
|
|
223
|
+
const result = this.compressor.compress(msg.content);
|
|
224
|
+
originalTokens += result.originalTokens;
|
|
225
|
+
compressedTokens += result.compressedTokens;
|
|
226
|
+
return { ...msg, content: result.compressedText };
|
|
227
|
+
}
|
|
228
|
+
return msg;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
compressedBody: JSON.stringify(parsed),
|
|
234
|
+
originalTokens,
|
|
235
|
+
compressedTokens,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// If not JSON or parse error, return as-is
|
|
240
|
+
return { compressedBody: body, originalTokens: 0, compressedTokens: 0 };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Forward request to target API
|
|
245
|
+
*/
|
|
246
|
+
forwardRequest(req, targetBaseUrl, body, provider) {
|
|
247
|
+
return new Promise((resolve, reject) => {
|
|
248
|
+
const targetUrl = new url_1.URL(req.url || '/', targetBaseUrl);
|
|
249
|
+
// Build headers, injecting API key
|
|
250
|
+
const headers = {
|
|
251
|
+
...req.headers,
|
|
252
|
+
host: targetUrl.host,
|
|
253
|
+
'content-length': Buffer.byteLength(body).toString(),
|
|
254
|
+
};
|
|
255
|
+
// Inject the appropriate API key
|
|
256
|
+
if (provider === 'openai' && this.options.openaiApiKey) {
|
|
257
|
+
headers['authorization'] = `Bearer ${this.options.openaiApiKey}`;
|
|
258
|
+
}
|
|
259
|
+
else if (provider === 'anthropic' && this.options.anthropicApiKey) {
|
|
260
|
+
headers['x-api-key'] = this.options.anthropicApiKey;
|
|
261
|
+
}
|
|
262
|
+
const options = {
|
|
263
|
+
hostname: targetUrl.hostname,
|
|
264
|
+
port: targetUrl.port || 443,
|
|
265
|
+
path: targetUrl.pathname + targetUrl.search,
|
|
266
|
+
method: req.method,
|
|
267
|
+
headers: headers,
|
|
268
|
+
};
|
|
269
|
+
const proxyReq = (0, https_1.request)(options, (proxyRes) => {
|
|
270
|
+
let responseBody = '';
|
|
271
|
+
proxyRes.on('data', chunk => responseBody += chunk);
|
|
272
|
+
proxyRes.on('end', () => {
|
|
273
|
+
const respHeaders = {};
|
|
274
|
+
Object.entries(proxyRes.headers).forEach(([key, value]) => {
|
|
275
|
+
if (value !== undefined) {
|
|
276
|
+
respHeaders[key] = value;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
resolve({
|
|
280
|
+
statusCode: proxyRes.statusCode || 500,
|
|
281
|
+
headers: respHeaders,
|
|
282
|
+
body: responseBody,
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
proxyReq.on('error', reject);
|
|
287
|
+
proxyReq.write(body);
|
|
288
|
+
proxyReq.end();
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Log request to stats
|
|
293
|
+
*/
|
|
294
|
+
logRequest(provider, endpoint, originalTokens, compressedTokens, latencyMs) {
|
|
295
|
+
const tokensSaved = originalTokens - compressedTokens;
|
|
296
|
+
this.stats.totalRequests++;
|
|
297
|
+
if (provider === 'openai')
|
|
298
|
+
this.stats.openaiRequests++;
|
|
299
|
+
if (provider === 'anthropic')
|
|
300
|
+
this.stats.anthropicRequests++;
|
|
301
|
+
this.stats.totalOriginalTokens += originalTokens;
|
|
302
|
+
this.stats.totalCompressedTokens += compressedTokens;
|
|
303
|
+
this.stats.totalTokensSaved += tokensSaved;
|
|
304
|
+
this.stats.estimatedCostSaved += (tokensSaved * this.options.pricePerMillionTokens) / 1_000_000;
|
|
305
|
+
// Add to log (with limit)
|
|
306
|
+
this.stats.requestLog.push({
|
|
307
|
+
timestamp: new Date(),
|
|
308
|
+
provider,
|
|
309
|
+
endpoint,
|
|
310
|
+
originalTokens,
|
|
311
|
+
compressedTokens,
|
|
312
|
+
tokensSaved,
|
|
313
|
+
latencyMs,
|
|
314
|
+
});
|
|
315
|
+
if (this.stats.requestLog.length > this.options.maxLogEntries) {
|
|
316
|
+
this.stats.requestLog.shift();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Handle stats API request
|
|
321
|
+
*/
|
|
322
|
+
handleStatsRequest(res) {
|
|
323
|
+
const stats = this.getStats();
|
|
324
|
+
const savingsPercent = stats.totalOriginalTokens > 0
|
|
325
|
+
? ((stats.totalTokensSaved / stats.totalOriginalTokens) * 100).toFixed(1)
|
|
326
|
+
: '0.0';
|
|
327
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
328
|
+
res.end(JSON.stringify({
|
|
329
|
+
uptime: Date.now() - stats.startedAt.getTime(),
|
|
330
|
+
totalRequests: stats.totalRequests,
|
|
331
|
+
providers: {
|
|
332
|
+
openai: stats.openaiRequests,
|
|
333
|
+
anthropic: stats.anthropicRequests,
|
|
334
|
+
},
|
|
335
|
+
tokens: {
|
|
336
|
+
original: stats.totalOriginalTokens,
|
|
337
|
+
compressed: stats.totalCompressedTokens,
|
|
338
|
+
saved: stats.totalTokensSaved,
|
|
339
|
+
savingsPercent: parseFloat(savingsPercent),
|
|
340
|
+
},
|
|
341
|
+
cost: {
|
|
342
|
+
estimatedSaved: parseFloat(stats.estimatedCostSaved.toFixed(6)),
|
|
343
|
+
pricePerMillionTokens: this.options.pricePerMillionTokens,
|
|
344
|
+
},
|
|
345
|
+
recentRequests: stats.requestLog.slice(-10),
|
|
346
|
+
}, null, 2));
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Handle dashboard request
|
|
350
|
+
*/
|
|
351
|
+
handleDashboard(res) {
|
|
352
|
+
const stats = this.getStats();
|
|
353
|
+
const uptimeMs = Date.now() - stats.startedAt.getTime();
|
|
354
|
+
const uptimeStr = this.formatUptime(uptimeMs);
|
|
355
|
+
const savingsPercent = stats.totalOriginalTokens > 0
|
|
356
|
+
? ((stats.totalTokensSaved / stats.totalOriginalTokens) * 100).toFixed(1)
|
|
357
|
+
: '0.0';
|
|
358
|
+
const html = `<!DOCTYPE html>
|
|
359
|
+
<html lang="en">
|
|
360
|
+
<head>
|
|
361
|
+
<meta charset="UTF-8">
|
|
362
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
363
|
+
<title>SONA Dashboard</title>
|
|
364
|
+
<meta http-equiv="refresh" content="5">
|
|
365
|
+
<style>
|
|
366
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
367
|
+
body {
|
|
368
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
369
|
+
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
|
370
|
+
color: #fff;
|
|
371
|
+
min-height: 100vh;
|
|
372
|
+
padding: 2rem;
|
|
373
|
+
}
|
|
374
|
+
.container { max-width: 1200px; margin: 0 auto; }
|
|
375
|
+
h1 {
|
|
376
|
+
font-size: 2.5rem;
|
|
377
|
+
margin-bottom: 0.5rem;
|
|
378
|
+
background: linear-gradient(90deg, #00d9ff, #00ff88);
|
|
379
|
+
-webkit-background-clip: text;
|
|
380
|
+
-webkit-text-fill-color: transparent;
|
|
381
|
+
}
|
|
382
|
+
.subtitle { color: #888; margin-bottom: 2rem; }
|
|
383
|
+
.grid {
|
|
384
|
+
display: grid;
|
|
385
|
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
386
|
+
gap: 1.5rem;
|
|
387
|
+
margin-bottom: 2rem;
|
|
388
|
+
}
|
|
389
|
+
.card {
|
|
390
|
+
background: rgba(255,255,255,0.05);
|
|
391
|
+
border: 1px solid rgba(255,255,255,0.1);
|
|
392
|
+
border-radius: 12px;
|
|
393
|
+
padding: 1.5rem;
|
|
394
|
+
}
|
|
395
|
+
.card-title { color: #888; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; }
|
|
396
|
+
.card-value {
|
|
397
|
+
font-size: 2.5rem;
|
|
398
|
+
font-weight: 700;
|
|
399
|
+
margin: 0.5rem 0;
|
|
400
|
+
}
|
|
401
|
+
.card-value.green { color: #00ff88; }
|
|
402
|
+
.card-value.blue { color: #00d9ff; }
|
|
403
|
+
.card-value.yellow { color: #ffcc00; }
|
|
404
|
+
.card-subtitle { color: #666; font-size: 0.875rem; }
|
|
405
|
+
.log {
|
|
406
|
+
background: rgba(0,0,0,0.3);
|
|
407
|
+
border-radius: 12px;
|
|
408
|
+
padding: 1.5rem;
|
|
409
|
+
max-height: 400px;
|
|
410
|
+
overflow-y: auto;
|
|
411
|
+
}
|
|
412
|
+
.log-title { margin-bottom: 1rem; color: #888; }
|
|
413
|
+
.log-entry {
|
|
414
|
+
display: flex;
|
|
415
|
+
justify-content: space-between;
|
|
416
|
+
padding: 0.75rem;
|
|
417
|
+
border-bottom: 1px solid rgba(255,255,255,0.05);
|
|
418
|
+
font-family: 'Monaco', 'Menlo', monospace;
|
|
419
|
+
font-size: 0.8rem;
|
|
420
|
+
}
|
|
421
|
+
.log-entry:last-child { border-bottom: none; }
|
|
422
|
+
.provider {
|
|
423
|
+
display: inline-block;
|
|
424
|
+
padding: 0.2rem 0.5rem;
|
|
425
|
+
border-radius: 4px;
|
|
426
|
+
font-size: 0.7rem;
|
|
427
|
+
text-transform: uppercase;
|
|
428
|
+
}
|
|
429
|
+
.provider.openai { background: #10a37f; }
|
|
430
|
+
.provider.anthropic { background: #d4a373; }
|
|
431
|
+
.saved { color: #00ff88; }
|
|
432
|
+
.status-bar {
|
|
433
|
+
display: flex;
|
|
434
|
+
align-items: center;
|
|
435
|
+
gap: 1rem;
|
|
436
|
+
margin-bottom: 2rem;
|
|
437
|
+
}
|
|
438
|
+
.status-dot {
|
|
439
|
+
width: 10px;
|
|
440
|
+
height: 10px;
|
|
441
|
+
border-radius: 50%;
|
|
442
|
+
background: #00ff88;
|
|
443
|
+
animation: pulse 2s infinite;
|
|
444
|
+
}
|
|
445
|
+
@keyframes pulse {
|
|
446
|
+
0%, 100% { opacity: 1; }
|
|
447
|
+
50% { opacity: 0.5; }
|
|
448
|
+
}
|
|
449
|
+
.env-box {
|
|
450
|
+
background: rgba(0,0,0,0.3);
|
|
451
|
+
border-radius: 8px;
|
|
452
|
+
padding: 1rem;
|
|
453
|
+
font-family: 'Monaco', 'Menlo', monospace;
|
|
454
|
+
font-size: 0.8rem;
|
|
455
|
+
margin-top: 2rem;
|
|
456
|
+
}
|
|
457
|
+
.env-box code { color: #00d9ff; }
|
|
458
|
+
</style>
|
|
459
|
+
</head>
|
|
460
|
+
<body>
|
|
461
|
+
<div class="container">
|
|
462
|
+
<div class="status-bar">
|
|
463
|
+
<div class="status-dot"></div>
|
|
464
|
+
<span>Proxy Running</span>
|
|
465
|
+
<span style="color: #666">|</span>
|
|
466
|
+
<span style="color: #888">Uptime: ${uptimeStr}</span>
|
|
467
|
+
</div>
|
|
468
|
+
|
|
469
|
+
<h1>🔮 SONA</h1>
|
|
470
|
+
<p class="subtitle">AI Coding Agent</p>
|
|
471
|
+
|
|
472
|
+
<div class="grid">
|
|
473
|
+
<div class="card">
|
|
474
|
+
<div class="card-title">Total Requests</div>
|
|
475
|
+
<div class="card-value blue">${stats.totalRequests.toLocaleString()}</div>
|
|
476
|
+
<div class="card-subtitle">OpenAI: ${stats.openaiRequests} | Anthropic: ${stats.anthropicRequests}</div>
|
|
477
|
+
</div>
|
|
478
|
+
|
|
479
|
+
<div class="card">
|
|
480
|
+
<div class="card-title">Tokens Saved</div>
|
|
481
|
+
<div class="card-value green">${stats.totalTokensSaved.toLocaleString()}</div>
|
|
482
|
+
<div class="card-subtitle">${savingsPercent}% compression ratio</div>
|
|
483
|
+
</div>
|
|
484
|
+
|
|
485
|
+
<div class="card">
|
|
486
|
+
<div class="card-title">Estimated Savings</div>
|
|
487
|
+
<div class="card-value yellow">$${stats.estimatedCostSaved.toFixed(4)}</div>
|
|
488
|
+
<div class="card-subtitle">at $${this.options.pricePerMillionTokens}/1M tokens</div>
|
|
489
|
+
</div>
|
|
490
|
+
|
|
491
|
+
<div class="card">
|
|
492
|
+
<div class="card-title">Original Tokens</div>
|
|
493
|
+
<div class="card-value">${stats.totalOriginalTokens.toLocaleString()}</div>
|
|
494
|
+
<div class="card-subtitle">→ ${stats.totalCompressedTokens.toLocaleString()} after compression</div>
|
|
495
|
+
</div>
|
|
496
|
+
</div>
|
|
497
|
+
|
|
498
|
+
<div class="log">
|
|
499
|
+
<div class="log-title">Recent Requests</div>
|
|
500
|
+
${stats.requestLog.slice(-10).reverse().map(entry => `
|
|
501
|
+
<div class="log-entry">
|
|
502
|
+
<span>
|
|
503
|
+
<span class="provider ${entry.provider}">${entry.provider}</span>
|
|
504
|
+
${entry.endpoint}
|
|
505
|
+
</span>
|
|
506
|
+
<span class="saved">-${entry.tokensSaved} tokens (${entry.latencyMs}ms)</span>
|
|
507
|
+
</div>
|
|
508
|
+
`).join('') || '<div class="log-entry" style="color: #666">No requests yet</div>'}
|
|
509
|
+
</div>
|
|
510
|
+
|
|
511
|
+
<div class="env-box">
|
|
512
|
+
<strong>Configure your tools:</strong><br><br>
|
|
513
|
+
<code>export OPENAI_BASE_URL=http://localhost:${this.options.port}</code><br>
|
|
514
|
+
<code>export ANTHROPIC_BASE_URL=http://localhost:${this.options.port}</code>
|
|
515
|
+
</div>
|
|
516
|
+
</div>
|
|
517
|
+
</body>
|
|
518
|
+
</html>`;
|
|
519
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
520
|
+
res.end(html);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Format uptime duration
|
|
524
|
+
*/
|
|
525
|
+
formatUptime(ms) {
|
|
526
|
+
const seconds = Math.floor(ms / 1000);
|
|
527
|
+
const minutes = Math.floor(seconds / 60);
|
|
528
|
+
const hours = Math.floor(minutes / 60);
|
|
529
|
+
const days = Math.floor(hours / 24);
|
|
530
|
+
if (days > 0)
|
|
531
|
+
return `${days}d ${hours % 24}h`;
|
|
532
|
+
if (hours > 0)
|
|
533
|
+
return `${hours}h ${minutes % 60}m`;
|
|
534
|
+
if (minutes > 0)
|
|
535
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
536
|
+
return `${seconds}s`;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
exports.SonaProxy = SonaProxy;
|
|
540
|
+
/**
|
|
541
|
+
* Start a proxy server
|
|
542
|
+
*/
|
|
543
|
+
async function startProxy(options) {
|
|
544
|
+
const proxy = new SonaProxy(options);
|
|
545
|
+
await proxy.start();
|
|
546
|
+
return proxy;
|
|
547
|
+
}
|
|
548
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/rules.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token-Safe Compression Rules
|
|
3
|
+
*
|
|
4
|
+
* These rules have been VALIDATED to reduce token count.
|
|
5
|
+
* Every pattern removes verbose phrases that add no semantic value.
|
|
6
|
+
*/
|
|
7
|
+
export interface CompressionRule {
|
|
8
|
+
pattern: RegExp;
|
|
9
|
+
replacement: string;
|
|
10
|
+
name: string;
|
|
11
|
+
tokensSaved: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Filler phrases that can be safely removed or simplified.
|
|
15
|
+
* Each rule has been tested against tiktoken to confirm token savings.
|
|
16
|
+
*/
|
|
17
|
+
export declare const FILLER_RULES: CompressionRule[];
|
|
18
|
+
/**
|
|
19
|
+
* Standard abbreviations that exist in tokenizer vocabulary
|
|
20
|
+
*/
|
|
21
|
+
export declare const ABBREVIATION_RULES: CompressionRule[];
|
|
22
|
+
/**
|
|
23
|
+
* Get all compression rules
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAllRules(): CompressionRule[];
|
|
26
|
+
/**
|
|
27
|
+
* Get total rule count
|
|
28
|
+
*/
|
|
29
|
+
export declare function getRuleCount(): number;
|
|
30
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,eAAe,EAqKzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAS/C,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,IAAI,eAAe,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|