opengauge 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.
Files changed (79) hide show
  1. package/README.md +64 -0
  2. package/bin/opengauge.js +70 -0
  3. package/dist/core/optimizer/checkpoint.d.ts +37 -0
  4. package/dist/core/optimizer/checkpoint.d.ts.map +1 -0
  5. package/dist/core/optimizer/checkpoint.js +81 -0
  6. package/dist/core/optimizer/checkpoint.js.map +1 -0
  7. package/dist/core/optimizer/compressor.d.ts +41 -0
  8. package/dist/core/optimizer/compressor.d.ts.map +1 -0
  9. package/dist/core/optimizer/compressor.js +134 -0
  10. package/dist/core/optimizer/compressor.js.map +1 -0
  11. package/dist/core/optimizer/dedup.d.ts +48 -0
  12. package/dist/core/optimizer/dedup.d.ts.map +1 -0
  13. package/dist/core/optimizer/dedup.js +147 -0
  14. package/dist/core/optimizer/dedup.js.map +1 -0
  15. package/dist/core/providers/adapter.d.ts +48 -0
  16. package/dist/core/providers/adapter.d.ts.map +1 -0
  17. package/dist/core/providers/adapter.js +22 -0
  18. package/dist/core/providers/adapter.js.map +1 -0
  19. package/dist/core/providers/anthropic.d.ts +12 -0
  20. package/dist/core/providers/anthropic.d.ts.map +1 -0
  21. package/dist/core/providers/anthropic.js +155 -0
  22. package/dist/core/providers/anthropic.js.map +1 -0
  23. package/dist/core/providers/gemini.d.ts +13 -0
  24. package/dist/core/providers/gemini.d.ts.map +1 -0
  25. package/dist/core/providers/gemini.js +154 -0
  26. package/dist/core/providers/gemini.js.map +1 -0
  27. package/dist/core/providers/ollama.d.ts +11 -0
  28. package/dist/core/providers/ollama.d.ts.map +1 -0
  29. package/dist/core/providers/ollama.js +119 -0
  30. package/dist/core/providers/ollama.js.map +1 -0
  31. package/dist/core/providers/openai.d.ts +12 -0
  32. package/dist/core/providers/openai.d.ts.map +1 -0
  33. package/dist/core/providers/openai.js +169 -0
  34. package/dist/core/providers/openai.js.map +1 -0
  35. package/dist/core/rag/assembler.d.ts +47 -0
  36. package/dist/core/rag/assembler.d.ts.map +1 -0
  37. package/dist/core/rag/assembler.js +178 -0
  38. package/dist/core/rag/assembler.js.map +1 -0
  39. package/dist/core/rag/embedder.d.ts +16 -0
  40. package/dist/core/rag/embedder.d.ts.map +1 -0
  41. package/dist/core/rag/embedder.js +223 -0
  42. package/dist/core/rag/embedder.js.map +1 -0
  43. package/dist/core/rag/retriever.d.ts +20 -0
  44. package/dist/core/rag/retriever.d.ts.map +1 -0
  45. package/dist/core/rag/retriever.js +71 -0
  46. package/dist/core/rag/retriever.js.map +1 -0
  47. package/dist/db/index.d.ts +5 -0
  48. package/dist/db/index.d.ts.map +1 -0
  49. package/dist/db/index.js +48 -0
  50. package/dist/db/index.js.map +1 -0
  51. package/dist/db/queries.d.ts +72 -0
  52. package/dist/db/queries.d.ts.map +1 -0
  53. package/dist/db/queries.js +169 -0
  54. package/dist/db/queries.js.map +1 -0
  55. package/dist/db/schema.d.ts +3 -0
  56. package/dist/db/schema.d.ts.map +1 -0
  57. package/dist/db/schema.js +71 -0
  58. package/dist/db/schema.js.map +1 -0
  59. package/dist/server/config.d.ts +25 -0
  60. package/dist/server/config.d.ts.map +1 -0
  61. package/dist/server/config.js +69 -0
  62. package/dist/server/config.js.map +1 -0
  63. package/dist/server/index.d.ts +5 -0
  64. package/dist/server/index.d.ts.map +1 -0
  65. package/dist/server/index.js +61 -0
  66. package/dist/server/index.js.map +1 -0
  67. package/dist/server/routes/index.d.ts +6 -0
  68. package/dist/server/routes/index.d.ts.map +1 -0
  69. package/dist/server/routes/index.js +272 -0
  70. package/dist/server/routes/index.js.map +1 -0
  71. package/dist/server/sse.d.ts +21 -0
  72. package/dist/server/sse.d.ts.map +1 -0
  73. package/dist/server/sse.js +40 -0
  74. package/dist/server/sse.js.map +1 -0
  75. package/dist/ui/static/app.js +515 -0
  76. package/dist/ui/static/index.html +13 -0
  77. package/dist/ui/static/styles.css +506 -0
  78. package/dist/ui/static/vendor.js +26 -0
  79. package/package.json +49 -0
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Fastify server setup for OpenGauge
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createServer = createServer;
10
+ const fastify_1 = __importDefault(require("fastify"));
11
+ const static_1 = __importDefault(require("@fastify/static"));
12
+ const cors_1 = __importDefault(require("@fastify/cors"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const routes_1 = require("./routes");
15
+ const db_1 = require("../db");
16
+ async function createServer(port = 3000) {
17
+ const app = (0, fastify_1.default)({
18
+ logger: {
19
+ level: 'info',
20
+ },
21
+ });
22
+ // CORS for local development
23
+ await app.register(cors_1.default, {
24
+ origin: true,
25
+ });
26
+ // Serve static UI files
27
+ // In development they're in src/ui/static, in production in dist/ui/static
28
+ let staticPath = path_1.default.join(__dirname, '..', 'ui', 'static');
29
+ if (!require('fs').existsSync(staticPath)) {
30
+ // Fallback: look relative to the project root (src/ui/static)
31
+ staticPath = path_1.default.join(__dirname, '..', '..', 'src', 'ui', 'static');
32
+ }
33
+ await app.register(static_1.default, {
34
+ root: staticPath,
35
+ prefix: '/',
36
+ });
37
+ // Initialize database
38
+ (0, db_1.getDb)();
39
+ // Register API routes
40
+ (0, routes_1.registerRoutes)(app);
41
+ // Graceful shutdown
42
+ const shutdown = async () => {
43
+ console.log('\nShutting down...');
44
+ (0, db_1.closeDb)();
45
+ await app.close();
46
+ process.exit(0);
47
+ };
48
+ process.on('SIGINT', shutdown);
49
+ process.on('SIGTERM', shutdown);
50
+ // Start server
51
+ try {
52
+ await app.listen({ port, host: '0.0.0.0' });
53
+ console.log(`\n OpenGauge is running at http://localhost:${port}\n`);
54
+ return app;
55
+ }
56
+ catch (err) {
57
+ app.log.error(err);
58
+ process.exit(1);
59
+ }
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AASH,oCAkDC;AAzDD,sDAA8B;AAC9B,6DAA4C;AAC5C,yDAAwC;AACxC,gDAAwB;AACxB,qCAA0C;AAC1C,8BAAuC;AAEhC,KAAK,UAAU,YAAY,CAAC,OAAe,IAAI;IACpD,MAAM,GAAG,GAAG,IAAA,iBAAO,EAAC;QAClB,MAAM,EAAE;YACN,KAAK,EAAE,MAAM;SACd;KACF,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,GAAG,CAAC,QAAQ,CAAC,cAAW,EAAE;QAC9B,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,wBAAwB;IACxB,2EAA2E;IAC3E,IAAI,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,8DAA8D;QAC9D,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,GAAG,CAAC,QAAQ,CAAC,gBAAa,EAAE;QAChC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,sBAAsB;IACtB,IAAA,UAAK,GAAE,CAAC;IAER,sBAAsB;IACtB,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;IAEpB,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,IAAA,YAAO,GAAE,CAAC;QACV,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,eAAe;IACf,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,IAAI,CAAC,CAAC;QACtE,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * API Route Handlers
3
+ */
4
+ import { FastifyInstance } from 'fastify';
5
+ export declare function registerRoutes(app: FastifyInstance): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA0BxE,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAoUzD"}
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ /**
3
+ * API Route Handlers
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerRoutes = registerRoutes;
7
+ const db_1 = require("../../db");
8
+ const queries_1 = require("../../db/queries");
9
+ const adapter_1 = require("../../core/providers/adapter");
10
+ const assembler_1 = require("../../core/rag/assembler");
11
+ const embedder_1 = require("../../core/rag/embedder");
12
+ const checkpoint_1 = require("../../core/optimizer/checkpoint");
13
+ const config_1 = require("../config");
14
+ const sse_1 = require("../sse");
15
+ function sanitizeAssistantText(text) {
16
+ return text
17
+ .replace(/[\p{Extended_Pictographic}\uFE0F]/gu, '')
18
+ .replace(/\*\*(.*?)\*\*/g, '$1')
19
+ .replace(/\*(.*?)\*/g, '$1')
20
+ .replace(/__(.*?)__/g, '$1')
21
+ .replace(/_(.*?)_/g, '$1')
22
+ .replace(/^#{1,6}\s+/gm, '')
23
+ .replace(/`([^`]+)`/g, '$1')
24
+ .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1');
25
+ }
26
+ function registerRoutes(app) {
27
+ const db = (0, db_1.getDb)();
28
+ const queries = new queries_1.Queries(db);
29
+ // ========== CHAT ==========
30
+ app.post('/api/chat', async (request, reply) => {
31
+ const body = request.body;
32
+ if (!body.message) {
33
+ return reply.status(400).send({ error: 'Message is required' });
34
+ }
35
+ const config = (0, config_1.loadConfig)();
36
+ const providerName = body.provider || (0, config_1.getDefaultProvider)(config);
37
+ if (!providerName) {
38
+ return reply.status(400).send({
39
+ error: 'No provider configured. Please set up a provider via /api/config or the UI.',
40
+ });
41
+ }
42
+ const providerConfig = config.providers[providerName];
43
+ if (!providerConfig && providerName !== 'ollama') {
44
+ return reply
45
+ .status(400)
46
+ .send({ error: `Provider "${providerName}" is not configured` });
47
+ }
48
+ let provider;
49
+ try {
50
+ provider = (0, adapter_1.createProvider)(providerName, providerConfig || {});
51
+ }
52
+ catch (err) {
53
+ return reply.status(500).send({ error: `Failed to create provider: ${err.message}` });
54
+ }
55
+ const model = body.model || provider.defaultModel;
56
+ // Get or create conversation
57
+ let conversationId = body.conversation_id;
58
+ if (!conversationId) {
59
+ const conv = queries.createConversation(providerName, model, undefined);
60
+ conversationId = conv.id;
61
+ }
62
+ // Store user message
63
+ const userMsg = queries.insertMessage(conversationId, 'user', body.message);
64
+ // Embed the user message (async, don't block)
65
+ (0, embedder_1.embed)(body.message).then((embedding) => {
66
+ if (embedding) {
67
+ queries.insertEmbedding(userMsg.id, embedding);
68
+ }
69
+ }).catch(() => { });
70
+ // Get the system prompt
71
+ const systemPrompt = body.system_prompt ||
72
+ config.defaults?.system_prompt ||
73
+ 'You are a helpful assistant.';
74
+ // Get latest checkpoint
75
+ const checkpoint = queries.getLatestCheckpoint(conversationId);
76
+ // Assemble context
77
+ const assemblerConfig = {
78
+ ...assembler_1.DEFAULT_ASSEMBLER_CONFIG,
79
+ compressionLevel: config.optimizer?.compression_level ?? 0.85,
80
+ ragTopK: config.optimizer?.rag_top_k ?? 15,
81
+ recentMessageCount: config.optimizer?.keep_recent ?? 2,
82
+ targetSavingsPercent: config.optimizer?.target_savings_percent ?? 90,
83
+ qualityFloorTokens: config.optimizer?.quality_floor_tokens ?? 320,
84
+ };
85
+ let contextResult;
86
+ try {
87
+ contextResult = await (0, assembler_1.assembleContext)(body.message, conversationId, systemPrompt, queries, checkpoint?.summary || null, assemblerConfig);
88
+ }
89
+ catch (err) {
90
+ return reply.status(500).send({ error: `Context assembly failed: ${err.message}` });
91
+ }
92
+ // SSE streaming response
93
+ (0, sse_1.initSSE)(reply);
94
+ // Send metadata event
95
+ (0, sse_1.sendSSE)(reply, 'meta', {
96
+ conversation_id: conversationId,
97
+ model,
98
+ provider: providerName,
99
+ tokens_raw: contextResult.tokensRaw,
100
+ tokens_sent: contextResult.tokensSent,
101
+ rag_results: contextResult.ragResultCount,
102
+ savings_percent: contextResult.tokensRaw > 0
103
+ ? Math.round(((contextResult.tokensRaw - contextResult.tokensSent) /
104
+ contextResult.tokensRaw) *
105
+ 100)
106
+ : 0,
107
+ });
108
+ // Stream from LLM
109
+ let fullResponse = '';
110
+ let tokensIn = 0;
111
+ let tokensOut = 0;
112
+ try {
113
+ const stream = provider.chatStream({
114
+ messages: contextResult.messages,
115
+ model,
116
+ stream: true,
117
+ });
118
+ for await (const chunk of stream) {
119
+ if (chunk.content) {
120
+ const cleanedChunk = sanitizeAssistantText(chunk.content);
121
+ fullResponse += cleanedChunk;
122
+ (0, sse_1.sendSSE)(reply, 'content', { text: cleanedChunk });
123
+ }
124
+ if (chunk.done) {
125
+ tokensIn = chunk.tokensIn || 0;
126
+ tokensOut = chunk.tokensOut || 0;
127
+ }
128
+ }
129
+ fullResponse = sanitizeAssistantText(fullResponse);
130
+ }
131
+ catch (err) {
132
+ (0, sse_1.sendSSE)(reply, 'error', { message: err.message });
133
+ (0, sse_1.endSSE)(reply);
134
+ return;
135
+ }
136
+ // Store assistant message
137
+ const assistantMsg = queries.insertMessage(conversationId, 'assistant', fullResponse, tokensIn, tokensOut);
138
+ // Embed the assistant message (async)
139
+ (0, embedder_1.embed)(fullResponse).then((embedding) => {
140
+ if (embedding) {
141
+ queries.insertEmbedding(assistantMsg.id, embedding);
142
+ }
143
+ }).catch(() => { });
144
+ // Store token usage
145
+ const tokensSaved = Math.max(0, contextResult.tokensRaw - contextResult.tokensSent);
146
+ queries.insertTokenUsage(conversationId, providerName, model, tokensIn, tokensOut, tokensSaved);
147
+ // Auto-generate title on first message
148
+ const conv = queries.getConversation(conversationId);
149
+ if (conv && !conv.title) {
150
+ try {
151
+ const titleResponse = await provider.chat({
152
+ messages: [
153
+ {
154
+ role: 'system',
155
+ content: 'Generate a short title (max 6 words) for this conversation. Reply with only the title, no quotes.',
156
+ },
157
+ { role: 'user', content: body.message },
158
+ ],
159
+ model,
160
+ maxTokens: 20,
161
+ temperature: 0.7,
162
+ });
163
+ queries.updateConversation(conversationId, titleResponse.content.trim());
164
+ }
165
+ catch {
166
+ queries.updateConversation(conversationId, body.message.slice(0, 50));
167
+ }
168
+ }
169
+ // Check if we should checkpoint
170
+ const messageCount = queries.getMessageCount(conversationId);
171
+ const checkpointConfig = {
172
+ interval: config.optimizer?.checkpoint_interval ?? checkpoint_1.DEFAULT_CHECKPOINT_CONFIG.interval,
173
+ keepRecent: config.optimizer?.keep_recent ?? checkpoint_1.DEFAULT_CHECKPOINT_CONFIG.keepRecent,
174
+ };
175
+ const lastCheckpointCount = checkpoint ? 0 : 0; // simplified
176
+ if ((0, checkpoint_1.shouldCheckpoint)(messageCount, lastCheckpointCount, checkpointConfig)) {
177
+ // Generate checkpoint in background
178
+ const messages = queries.getMessages(conversationId);
179
+ const chatMessages = messages
180
+ .slice(0, -checkpointConfig.keepRecent)
181
+ .map((m) => ({ role: m.role, content: m.content }));
182
+ if (chatMessages.length > 0) {
183
+ (0, checkpoint_1.generateCheckpointSummary)(chatMessages, provider, model)
184
+ .then((summary) => {
185
+ const lastMsg = messages[messages.length - checkpointConfig.keepRecent - 1];
186
+ queries.insertCheckpoint(conversationId, summary, lastMsg?.created_at || Date.now());
187
+ })
188
+ .catch((err) => console.warn('Checkpoint generation failed:', err));
189
+ }
190
+ }
191
+ // Send final event with usage stats
192
+ (0, sse_1.sendSSE)(reply, 'done', {
193
+ tokens_in: tokensIn,
194
+ tokens_out: tokensOut,
195
+ tokens_saved: tokensSaved,
196
+ });
197
+ (0, sse_1.endSSE)(reply);
198
+ });
199
+ // ========== CONVERSATIONS ==========
200
+ app.get('/api/conversations', async (_request, reply) => {
201
+ const conversations = queries.listConversations();
202
+ return reply.send(conversations);
203
+ });
204
+ app.get('/api/conversations/:id', async (request, reply) => {
205
+ const { id } = request.params;
206
+ const conversation = queries.getConversation(id);
207
+ if (!conversation) {
208
+ return reply.status(404).send({ error: 'Conversation not found' });
209
+ }
210
+ const messages = queries.getMessages(id);
211
+ return reply.send({ ...conversation, messages });
212
+ });
213
+ app.delete('/api/conversations/:id', async (request, reply) => {
214
+ const { id } = request.params;
215
+ queries.deleteConversation(id);
216
+ return reply.send({ success: true });
217
+ });
218
+ // ========== TOKEN USAGE ==========
219
+ app.get('/api/token-usage', async (_request, reply) => {
220
+ const aggregated = queries.getAggregatedTokenUsage();
221
+ return reply.send(aggregated);
222
+ });
223
+ // ========== CONFIG ==========
224
+ app.post('/api/config', async (request, reply) => {
225
+ const body = request.body;
226
+ const config = (0, config_1.loadConfig)();
227
+ if (body.providers) {
228
+ for (const [name, providerConfig] of Object.entries(body.providers)) {
229
+ config.providers[name] = {
230
+ ...config.providers[name],
231
+ ...providerConfig,
232
+ };
233
+ }
234
+ }
235
+ if (body.defaults) {
236
+ config.defaults = { ...config.defaults, ...body.defaults };
237
+ }
238
+ if (body.optimizer) {
239
+ config.optimizer = { ...config.optimizer, ...body.optimizer };
240
+ }
241
+ (0, config_1.saveConfig)(config);
242
+ return reply.send({ success: true, config });
243
+ });
244
+ app.get('/api/config', async (_request, reply) => {
245
+ const config = (0, config_1.loadConfig)();
246
+ // Mask API keys for security
247
+ const masked = { ...config, providers: {} };
248
+ for (const [name, providerConfig] of Object.entries(config.providers)) {
249
+ masked.providers[name] = {
250
+ ...providerConfig,
251
+ api_key: providerConfig?.api_key
252
+ ? `${providerConfig.api_key.slice(0, 8)}...${providerConfig.api_key.slice(-4)}`
253
+ : undefined,
254
+ };
255
+ }
256
+ return reply.send(masked);
257
+ });
258
+ // ========== HEALTH ==========
259
+ app.get('/api/health', async (_request, reply) => {
260
+ const config = (0, config_1.loadConfig)();
261
+ const conversations = queries.listConversations();
262
+ const tokenUsage = queries.getAggregatedTokenUsage();
263
+ return reply.send({
264
+ status: 'ok',
265
+ conversations: conversations.length,
266
+ configured_providers: Object.keys(config.providers),
267
+ token_usage_summary: tokenUsage,
268
+ timestamp: Date.now(),
269
+ });
270
+ });
271
+ }
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SSE (Server-Sent Events) streaming utilities for Fastify
3
+ */
4
+ import { FastifyReply } from 'fastify';
5
+ /**
6
+ * Set up SSE headers on a Fastify reply.
7
+ */
8
+ export declare function initSSE(reply: FastifyReply): void;
9
+ /**
10
+ * Send an SSE event.
11
+ */
12
+ export declare function sendSSE(reply: FastifyReply, event: string, data: any): void;
13
+ /**
14
+ * Send an SSE data-only message (default event).
15
+ */
16
+ export declare function sendSSEData(reply: FastifyReply, data: any): void;
17
+ /**
18
+ * End the SSE stream.
19
+ */
20
+ export declare function endSSE(reply: FastifyReply): void;
21
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/server/sse.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAOjD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAE3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAGhD"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * SSE (Server-Sent Events) streaming utilities for Fastify
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initSSE = initSSE;
7
+ exports.sendSSE = sendSSE;
8
+ exports.sendSSEData = sendSSEData;
9
+ exports.endSSE = endSSE;
10
+ /**
11
+ * Set up SSE headers on a Fastify reply.
12
+ */
13
+ function initSSE(reply) {
14
+ reply.raw.writeHead(200, {
15
+ 'Content-Type': 'text/event-stream',
16
+ 'Cache-Control': 'no-cache',
17
+ Connection: 'keep-alive',
18
+ 'X-Accel-Buffering': 'no',
19
+ });
20
+ }
21
+ /**
22
+ * Send an SSE event.
23
+ */
24
+ function sendSSE(reply, event, data) {
25
+ reply.raw.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
26
+ }
27
+ /**
28
+ * Send an SSE data-only message (default event).
29
+ */
30
+ function sendSSEData(reply, data) {
31
+ reply.raw.write(`data: ${JSON.stringify(data)}\n\n`);
32
+ }
33
+ /**
34
+ * End the SSE stream.
35
+ */
36
+ function endSSE(reply) {
37
+ reply.raw.write('data: [DONE]\n\n');
38
+ reply.raw.end();
39
+ }
40
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/server/sse.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAOH,0BAOC;AAKD,0BAEC;AAKD,kCAEC;AAKD,wBAGC;AAhCD;;GAEG;AACH,SAAgB,OAAO,CAAC,KAAmB;IACzC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACvB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;QACxB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,OAAO,CAAC,KAAmB,EAAE,KAAa,EAAE,IAAS;IACnE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,KAAmB,EAAE,IAAS;IACxD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAmB;IACxC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAClB,CAAC"}