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/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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"}
@@ -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"}