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.
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ /**
3
+ * SONA Session Manager
4
+ *
5
+ * Handles continuous streaming compression across document processing sessions.
6
+ * Primary use case: Document processing and summary generation where multiple
7
+ * interactions happen with the LLM, each benefiting from compression.
8
+ *
9
+ * Key features:
10
+ * - Session-based tracking of cumulative savings
11
+ * - Streaming compression for real-time processing
12
+ * - Context preservation across conversation turns
13
+ * - RAG-optimized chunk compression
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.SonaSession = void 0;
17
+ exports.createSession = createSession;
18
+ const compressor_js_1 = require("./compressor.js");
19
+ const events_1 = require("events");
20
+ /**
21
+ * Document Processing Session
22
+ *
23
+ * Use this for continuous document processing workflows where
24
+ * you're feeding documents to an LLM for summarization, analysis,
25
+ * or other tasks.
26
+ */
27
+ class SonaSession extends events_1.EventEmitter {
28
+ compressor;
29
+ config;
30
+ stats;
31
+ activeDocument = null;
32
+ constructor(config = {}) {
33
+ super();
34
+ this.config = {
35
+ sessionId: config.sessionId || this.generateSessionId(),
36
+ pricePerMillionInput: config.pricePerMillionInput || 15.0,
37
+ pricePerMillionOutput: config.pricePerMillionOutput || 60.0,
38
+ protectedTerms: config.protectedTerms || [],
39
+ verbose: config.verbose || false,
40
+ };
41
+ this.compressor = new compressor_js_1.SonaCompressor({
42
+ protectedTerms: this.config.protectedTerms,
43
+ pricePerMillionTokens: this.config.pricePerMillionInput,
44
+ });
45
+ this.stats = this.initStats();
46
+ }
47
+ generateSessionId() {
48
+ return `sona_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
49
+ }
50
+ initStats() {
51
+ return {
52
+ sessionId: this.config.sessionId,
53
+ startedAt: new Date(),
54
+ lastActivityAt: new Date(),
55
+ totalRequests: 0,
56
+ documentChunksProcessed: 0,
57
+ conversationTurns: 0,
58
+ totalOriginalInputTokens: 0,
59
+ totalCompressedInputTokens: 0,
60
+ totalInputTokensSaved: 0,
61
+ inputSavingsPercent: 0,
62
+ estimatedInputCostSaved: 0,
63
+ pricePerMillionInput: this.config.pricePerMillionInput,
64
+ documents: [],
65
+ };
66
+ }
67
+ /**
68
+ * Start processing a new document
69
+ */
70
+ startDocument(documentId, name) {
71
+ // Close previous document if exists
72
+ if (this.activeDocument) {
73
+ this.endDocument();
74
+ }
75
+ this.activeDocument = {
76
+ documentId,
77
+ name,
78
+ startedAt: new Date(),
79
+ chunksProcessed: 0,
80
+ originalTokens: 0,
81
+ compressedTokens: 0,
82
+ tokensSaved: 0,
83
+ savingsPercent: 0,
84
+ };
85
+ if (this.config.verbose) {
86
+ console.log(`[SONA] Starting document: ${name || documentId}`);
87
+ }
88
+ this.emit('document:start', { documentId, name });
89
+ }
90
+ /**
91
+ * End current document processing
92
+ */
93
+ endDocument() {
94
+ if (!this.activeDocument)
95
+ return null;
96
+ // Calculate final savings percent
97
+ if (this.activeDocument.originalTokens > 0) {
98
+ this.activeDocument.savingsPercent =
99
+ (this.activeDocument.tokensSaved / this.activeDocument.originalTokens) * 100;
100
+ }
101
+ const doc = { ...this.activeDocument };
102
+ this.stats.documents.push(doc);
103
+ if (this.config.verbose) {
104
+ console.log(`[SONA] Document complete: ${doc.name || doc.documentId}`);
105
+ console.log(` Chunks: ${doc.chunksProcessed}, Tokens saved: ${doc.tokensSaved} (${doc.savingsPercent.toFixed(1)}%)`);
106
+ }
107
+ this.emit('document:end', doc);
108
+ this.activeDocument = null;
109
+ return doc;
110
+ }
111
+ /**
112
+ * Compress a document chunk for RAG or batch processing
113
+ *
114
+ * Use this when processing documents in chunks before sending to LLM
115
+ */
116
+ compressChunk(chunk) {
117
+ const result = this.compressor.compress(chunk);
118
+ this.recordCompression(result, 'chunk');
119
+ return result;
120
+ }
121
+ /**
122
+ * Compress multiple chunks (for RAG context)
123
+ */
124
+ compressChunks(chunks) {
125
+ const compressed = [];
126
+ let totalOriginal = 0;
127
+ let totalCompressed = 0;
128
+ for (const chunk of chunks) {
129
+ const result = this.compressChunk(chunk);
130
+ compressed.push(result.compressedText);
131
+ totalOriginal += result.originalTokens;
132
+ totalCompressed += result.compressedTokens;
133
+ }
134
+ return {
135
+ compressed,
136
+ stats: {
137
+ totalOriginal,
138
+ totalCompressed,
139
+ totalSaved: totalOriginal - totalCompressed,
140
+ },
141
+ };
142
+ }
143
+ /**
144
+ * Compress a conversation turn (user message to LLM)
145
+ */
146
+ compressTurn(content) {
147
+ const result = this.compressor.compress(content);
148
+ this.recordCompression(result, 'turn');
149
+ this.stats.conversationTurns++;
150
+ return result;
151
+ }
152
+ /**
153
+ * Compress messages array (OpenAI/Anthropic format)
154
+ * Typically compress user and system, preserve assistant responses
155
+ */
156
+ compressMessages(messages, options = {}) {
157
+ const { compressSystem = true, compressUser = true, compressAssistant = false } = options;
158
+ return messages.map(msg => {
159
+ const shouldCompress = (msg.role === 'system' && compressSystem) ||
160
+ (msg.role === 'user' && compressUser) ||
161
+ (msg.role === 'assistant' && compressAssistant);
162
+ if (!shouldCompress || typeof msg.content !== 'string') {
163
+ return msg;
164
+ }
165
+ const result = this.compressor.compress(msg.content);
166
+ this.recordCompression(result, 'message');
167
+ return { ...msg, content: result.compressedText };
168
+ });
169
+ }
170
+ /**
171
+ * Stream compress for real-time processing
172
+ * Yields compressed chunks as they're processed
173
+ */
174
+ async *streamCompress(textStream) {
175
+ let buffer = '';
176
+ let totalOriginal = 0;
177
+ let totalCompressed = 0;
178
+ for await (const chunk of textStream) {
179
+ buffer += chunk;
180
+ // Process complete sentences/paragraphs
181
+ const sentences = buffer.split(/(?<=[.!?])\s+/);
182
+ if (sentences.length > 1) {
183
+ // Keep last potentially incomplete sentence in buffer
184
+ buffer = sentences.pop() || '';
185
+ for (const sentence of sentences) {
186
+ const result = this.compressor.compress(sentence);
187
+ this.recordCompression(result, 'stream');
188
+ totalOriginal += result.originalTokens;
189
+ totalCompressed += result.compressedTokens;
190
+ yield {
191
+ type: 'compressed',
192
+ content: result.compressedText + ' ',
193
+ stats: {
194
+ originalTokens: result.originalTokens,
195
+ compressedTokens: result.compressedTokens,
196
+ tokensSaved: result.tokenSavings,
197
+ },
198
+ };
199
+ }
200
+ }
201
+ }
202
+ // Process remaining buffer
203
+ if (buffer.trim()) {
204
+ const result = this.compressor.compress(buffer);
205
+ this.recordCompression(result, 'stream');
206
+ totalOriginal += result.originalTokens;
207
+ totalCompressed += result.compressedTokens;
208
+ yield {
209
+ type: 'compressed',
210
+ content: result.compressedText,
211
+ stats: {
212
+ originalTokens: result.originalTokens,
213
+ compressedTokens: result.compressedTokens,
214
+ tokensSaved: result.tokenSavings,
215
+ },
216
+ };
217
+ }
218
+ // Final stats
219
+ yield {
220
+ type: 'stats',
221
+ content: '',
222
+ stats: {
223
+ originalTokens: totalOriginal,
224
+ compressedTokens: totalCompressed,
225
+ tokensSaved: totalOriginal - totalCompressed,
226
+ },
227
+ };
228
+ }
229
+ /**
230
+ * Record compression result in session stats
231
+ */
232
+ recordCompression(result, type) {
233
+ this.stats.lastActivityAt = new Date();
234
+ this.stats.totalRequests++;
235
+ this.stats.totalOriginalInputTokens += result.originalTokens;
236
+ this.stats.totalCompressedInputTokens += result.compressedTokens;
237
+ this.stats.totalInputTokensSaved += result.tokenSavings;
238
+ // Update savings percent
239
+ if (this.stats.totalOriginalInputTokens > 0) {
240
+ this.stats.inputSavingsPercent =
241
+ (this.stats.totalInputTokensSaved / this.stats.totalOriginalInputTokens) * 100;
242
+ }
243
+ // Update cost savings
244
+ this.stats.estimatedInputCostSaved =
245
+ (this.stats.totalInputTokensSaved * this.config.pricePerMillionInput) / 1_000_000;
246
+ // Update active document stats
247
+ if (this.activeDocument && type === 'chunk') {
248
+ this.stats.documentChunksProcessed++;
249
+ this.activeDocument.chunksProcessed++;
250
+ this.activeDocument.originalTokens += result.originalTokens;
251
+ this.activeDocument.compressedTokens += result.compressedTokens;
252
+ this.activeDocument.tokensSaved += result.tokenSavings;
253
+ }
254
+ // Emit event
255
+ this.emit('compression', {
256
+ type,
257
+ originalTokens: result.originalTokens,
258
+ compressedTokens: result.compressedTokens,
259
+ tokensSaved: result.tokenSavings,
260
+ savingsPercent: result.tokenSavingsPercent,
261
+ });
262
+ if (this.config.verbose) {
263
+ console.log(`[SONA] ${type}: -${result.tokenSavings} tokens (${result.tokenSavingsPercent.toFixed(1)}%)`);
264
+ }
265
+ }
266
+ /**
267
+ * Get current session statistics
268
+ */
269
+ getStats() {
270
+ return { ...this.stats };
271
+ }
272
+ /**
273
+ * Get formatted summary report
274
+ */
275
+ getSummaryReport() {
276
+ const s = this.stats;
277
+ const duration = Date.now() - s.startedAt.getTime();
278
+ const durationStr = this.formatDuration(duration);
279
+ let report = `
280
+ ╔══════════════════════════════════════════════════════════════╗
281
+ ║ SONA SESSION REPORT ║
282
+ ╠══════════════════════════════════════════════════════════════╣
283
+ ║ Session ID: ${s.sessionId.padEnd(44)}║
284
+ ║ Duration: ${durationStr.padEnd(44)}║
285
+ ╠══════════════════════════════════════════════════════════════╣
286
+ ║ COMPRESSION METRICS ║
287
+ ╠══════════════════════════════════════════════════════════════╣
288
+ ║ Total Requests: ${s.totalRequests.toString().padStart(10)} ║
289
+ ║ Document Chunks: ${s.documentChunksProcessed.toString().padStart(10)} ║
290
+ ║ Conversation Turns: ${s.conversationTurns.toString().padStart(10)} ║
291
+ ╠══════════════════════════════════════════════════════════════╣
292
+ ║ Original Input Tokens: ${s.totalOriginalInputTokens.toLocaleString().padStart(10)} ║
293
+ ║ Compressed Tokens: ${s.totalCompressedInputTokens.toLocaleString().padStart(10)} ║
294
+ ║ Tokens Saved: ${s.totalInputTokensSaved.toLocaleString().padStart(10)} (${s.inputSavingsPercent.toFixed(1)}%) ║
295
+ ╠══════════════════════════════════════════════════════════════╣
296
+ ║ COST SAVINGS ║
297
+ ╠══════════════════════════════════════════════════════════════╣
298
+ ║ This Session: $${s.estimatedInputCostSaved.toFixed(4).padStart(9)} ║
299
+ ║ Projected Monthly*: $${(s.estimatedInputCostSaved * 30 * 24 * 3600000 / Math.max(duration, 1)).toFixed(2).padStart(9)} ║
300
+ ║ * at current usage rate ║
301
+ ╚══════════════════════════════════════════════════════════════╝`;
302
+ if (s.documents.length > 0) {
303
+ report += `\n\nDOCUMENTS PROCESSED (${s.documents.length}):\n`;
304
+ for (const doc of s.documents) {
305
+ report += ` • ${doc.name || doc.documentId}: ${doc.chunksProcessed} chunks, ${doc.tokensSaved} tokens saved (${doc.savingsPercent.toFixed(1)}%)\n`;
306
+ }
307
+ }
308
+ return report;
309
+ }
310
+ formatDuration(ms) {
311
+ const seconds = Math.floor(ms / 1000);
312
+ const minutes = Math.floor(seconds / 60);
313
+ const hours = Math.floor(minutes / 60);
314
+ if (hours > 0)
315
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
316
+ if (minutes > 0)
317
+ return `${minutes}m ${seconds % 60}s`;
318
+ return `${seconds}s`;
319
+ }
320
+ /**
321
+ * Add a protected term that won't be compressed
322
+ */
323
+ addProtectedTerm(term) {
324
+ this.compressor.addProtectedTerm(term);
325
+ if (!this.config.protectedTerms.includes(term)) {
326
+ this.config.protectedTerms.push(term);
327
+ }
328
+ }
329
+ /**
330
+ * Get session ID
331
+ */
332
+ getSessionId() {
333
+ return this.config.sessionId;
334
+ }
335
+ /**
336
+ * Reset session statistics (keeps configuration)
337
+ */
338
+ reset() {
339
+ this.stats = this.initStats();
340
+ this.activeDocument = null;
341
+ this.emit('reset');
342
+ }
343
+ }
344
+ exports.SonaSession = SonaSession;
345
+ /**
346
+ * Create a new document processing session
347
+ */
348
+ function createSession(config) {
349
+ return new SonaSession(config);
350
+ }
351
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "sona-code",
3
+ "version": "0.1.0",
4
+ "description": "AI coding agent for your terminal. Fast, capable, cost-effective.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "sona": "dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc && chmod +x dist/cli.js",
12
+ "dev": "tsc --watch",
13
+ "test": "node --test",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "ai",
18
+ "coding",
19
+ "assistant",
20
+ "agent",
21
+ "cli",
22
+ "terminal",
23
+ "deepseek",
24
+ "llm",
25
+ "developer-tools"
26
+ ],
27
+ "author": "SONA Contributors",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/ZeradamK/sona-code.git"
32
+ },
33
+ "homepage": "https://github.com/ZeradamK/sona-code#readme",
34
+ "bugs": {
35
+ "url": "https://github.com/ZeradamK/sona-code/issues"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md"
43
+ ],
44
+ "dependencies": {
45
+ "commander": "^12.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.11.0",
49
+ "typescript": "^5.3.3"
50
+ }
51
+ }