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.
- package/README.md +64 -0
- package/bin/opengauge.js +70 -0
- package/dist/core/optimizer/checkpoint.d.ts +37 -0
- package/dist/core/optimizer/checkpoint.d.ts.map +1 -0
- package/dist/core/optimizer/checkpoint.js +81 -0
- package/dist/core/optimizer/checkpoint.js.map +1 -0
- package/dist/core/optimizer/compressor.d.ts +41 -0
- package/dist/core/optimizer/compressor.d.ts.map +1 -0
- package/dist/core/optimizer/compressor.js +134 -0
- package/dist/core/optimizer/compressor.js.map +1 -0
- package/dist/core/optimizer/dedup.d.ts +48 -0
- package/dist/core/optimizer/dedup.d.ts.map +1 -0
- package/dist/core/optimizer/dedup.js +147 -0
- package/dist/core/optimizer/dedup.js.map +1 -0
- package/dist/core/providers/adapter.d.ts +48 -0
- package/dist/core/providers/adapter.d.ts.map +1 -0
- package/dist/core/providers/adapter.js +22 -0
- package/dist/core/providers/adapter.js.map +1 -0
- package/dist/core/providers/anthropic.d.ts +12 -0
- package/dist/core/providers/anthropic.d.ts.map +1 -0
- package/dist/core/providers/anthropic.js +155 -0
- package/dist/core/providers/anthropic.js.map +1 -0
- package/dist/core/providers/gemini.d.ts +13 -0
- package/dist/core/providers/gemini.d.ts.map +1 -0
- package/dist/core/providers/gemini.js +154 -0
- package/dist/core/providers/gemini.js.map +1 -0
- package/dist/core/providers/ollama.d.ts +11 -0
- package/dist/core/providers/ollama.d.ts.map +1 -0
- package/dist/core/providers/ollama.js +119 -0
- package/dist/core/providers/ollama.js.map +1 -0
- package/dist/core/providers/openai.d.ts +12 -0
- package/dist/core/providers/openai.d.ts.map +1 -0
- package/dist/core/providers/openai.js +169 -0
- package/dist/core/providers/openai.js.map +1 -0
- package/dist/core/rag/assembler.d.ts +47 -0
- package/dist/core/rag/assembler.d.ts.map +1 -0
- package/dist/core/rag/assembler.js +178 -0
- package/dist/core/rag/assembler.js.map +1 -0
- package/dist/core/rag/embedder.d.ts +16 -0
- package/dist/core/rag/embedder.d.ts.map +1 -0
- package/dist/core/rag/embedder.js +223 -0
- package/dist/core/rag/embedder.js.map +1 -0
- package/dist/core/rag/retriever.d.ts +20 -0
- package/dist/core/rag/retriever.d.ts.map +1 -0
- package/dist/core/rag/retriever.js +71 -0
- package/dist/core/rag/retriever.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +48 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/queries.d.ts +72 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +169 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +71 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/server/config.d.ts +25 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +69 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +61 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/index.d.ts +6 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +272 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/sse.d.ts +21 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +40 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/ui/static/app.js +515 -0
- package/dist/ui/static/index.html +13 -0
- package/dist/ui/static/styles.css +506 -0
- package/dist/ui/static/vendor.js +26 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../../src/core/rag/embedder.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuGH,sBAuDC;AA8CD,gCAMC;AAhND,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAEpB,IAAI,OAAO,GAAQ,IAAI,CAAC;AACxB,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,IAAI,SAAS,GAAQ,IAAI,CAAC;AAE1B,yCAAyC;AACzC,+DAA+D;AAC/D,wCAAwC;AACxC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;GAGG;AACH,KAAK,UAAU,UAAU;IACvB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,cAAc;QAAE,OAAO,IAAI,CAAC,CAAC,uCAAuC;IAExE,cAAc,GAAG,IAAI,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,wDAAa,kBAAkB,GAAC,CAAC;QAE7C,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAE/D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,oEAAoE,QAAQ,EAAE,CAAC,CAAC;YAC5F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE;YACrD,kBAAkB,EAAE,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wEAAwE,EAAE,KAAK,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,IAAY;IAKlC,sDAAsD;IACtD,MAAM,KAAK,GAAG,IAAI;SACf,WAAW,EAAE;SACb,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC;IAEhC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,wBAAwB;IAE5D,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAElD,oBAAoB;IACpB,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7B,2CAA2C;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB;IACpB,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,sBAAsB;AACtD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;IAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,yDAAyD;QACzD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,wDAAa,kBAAkB,GAAC,CAAC;QAC7C,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEvE,MAAM,KAAK,GAAG;YACZ,SAAS,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClE,cAAc,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YACjF,cAAc,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;SAChF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEtC,qCAAqC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAoB,CAAC;QACzC,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,UAAU;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QAC5B,CAAC;QAED,eAAe;QACf,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC;IAChB,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtC,2CAA2C;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,IAAI,IAAI,GAAG,CAAC,CAAC;gBACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACjD,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,KAAe;IAC9C,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retriever — sqlite-vec similarity search for relevant context
|
|
3
|
+
*
|
|
4
|
+
* Queries the embeddings virtual table to find messages most similar
|
|
5
|
+
* to the current query.
|
|
6
|
+
*/
|
|
7
|
+
import { Queries, Message } from '../../db/queries';
|
|
8
|
+
export interface RetrievedMessage extends Message {
|
|
9
|
+
similarity: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Retrieve the top-K most relevant past messages for a query.
|
|
13
|
+
*
|
|
14
|
+
* @param query - The user's current message text.
|
|
15
|
+
* @param conversationId - Limit search to a specific conversation, or null for all.
|
|
16
|
+
* @param queries - Database queries instance.
|
|
17
|
+
* @param k - Number of results to return. Default 15.
|
|
18
|
+
*/
|
|
19
|
+
export declare function retrieveSimilar(query: string, conversationId: string | null, queries: Queries, k?: number): Promise<RetrievedMessage[]>;
|
|
20
|
+
//# sourceMappingURL=retriever.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../../src/core/rag/retriever.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,OAAO,EAAE,OAAO,EAChB,CAAC,GAAE,MAAW,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0D7B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retriever — sqlite-vec similarity search for relevant context
|
|
4
|
+
*
|
|
5
|
+
* Queries the embeddings virtual table to find messages most similar
|
|
6
|
+
* to the current query.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.retrieveSimilar = retrieveSimilar;
|
|
10
|
+
const embedder_1 = require("./embedder");
|
|
11
|
+
const dedup_1 = require("../optimizer/dedup");
|
|
12
|
+
/**
|
|
13
|
+
* Retrieve the top-K most relevant past messages for a query.
|
|
14
|
+
*
|
|
15
|
+
* @param query - The user's current message text.
|
|
16
|
+
* @param conversationId - Limit search to a specific conversation, or null for all.
|
|
17
|
+
* @param queries - Database queries instance.
|
|
18
|
+
* @param k - Number of results to return. Default 15.
|
|
19
|
+
*/
|
|
20
|
+
async function retrieveSimilar(query, conversationId, queries, k = 15) {
|
|
21
|
+
const queryEmbedding = await (0, embedder_1.embed)(query);
|
|
22
|
+
if (!queryEmbedding)
|
|
23
|
+
return [];
|
|
24
|
+
// Try sqlite-vec search first
|
|
25
|
+
const vecResults = queries.searchSimilar(queryEmbedding, k * 2);
|
|
26
|
+
if (vecResults.length > 0) {
|
|
27
|
+
// Get full message data for each result
|
|
28
|
+
const allMessages = conversationId
|
|
29
|
+
? queries.getMessages(conversationId)
|
|
30
|
+
: [];
|
|
31
|
+
const messageMap = new Map();
|
|
32
|
+
for (const msg of allMessages) {
|
|
33
|
+
messageMap.set(msg.id, msg);
|
|
34
|
+
}
|
|
35
|
+
const retrieved = [];
|
|
36
|
+
for (const result of vecResults) {
|
|
37
|
+
const msg = messageMap.get(result.message_id);
|
|
38
|
+
if (msg) {
|
|
39
|
+
// sqlite-vec returns distance, convert to similarity (1 - distance for cosine)
|
|
40
|
+
retrieved.push({
|
|
41
|
+
...msg,
|
|
42
|
+
similarity: 1 - result.distance,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Filter to conversation if specified and sort by similarity
|
|
47
|
+
return retrieved
|
|
48
|
+
.filter((m) => !conversationId || m.conversation_id === conversationId)
|
|
49
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
50
|
+
.slice(0, k);
|
|
51
|
+
}
|
|
52
|
+
// Fallback: in-memory similarity search using cached fallback embeddings
|
|
53
|
+
if (!conversationId)
|
|
54
|
+
return [];
|
|
55
|
+
const messages = queries.getMessages(conversationId);
|
|
56
|
+
// For short conversations, skip RAG — all messages will be in the recent window
|
|
57
|
+
if (messages.length <= 15)
|
|
58
|
+
return [];
|
|
59
|
+
const scored = [];
|
|
60
|
+
for (const msg of messages) {
|
|
61
|
+
const msgEmbedding = await (0, embedder_1.embed)(msg.content);
|
|
62
|
+
if (!msgEmbedding)
|
|
63
|
+
continue;
|
|
64
|
+
const similarity = (0, dedup_1.cosineSimilarity)(queryEmbedding, msgEmbedding);
|
|
65
|
+
scored.push({ ...msg, similarity });
|
|
66
|
+
}
|
|
67
|
+
return scored
|
|
68
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
69
|
+
.slice(0, k);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=retriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../../src/core/rag/retriever.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAkBH,0CA+DC;AA9ED,yCAAmC;AACnC,8CAAsD;AAMtD;;;;;;;GAOG;AACI,KAAK,UAAU,eAAe,CACnC,KAAa,EACb,cAA6B,EAC7B,OAAgB,EAChB,IAAY,EAAE;IAEd,MAAM,cAAc,GAAG,MAAM,IAAA,gBAAK,EAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAE/B,8BAA8B;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEhE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,wCAAwC;QACxC,MAAM,WAAW,GAAG,cAAc;YAChC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,GAAG,EAAE,CAAC;gBACR,+EAA+E;gBAC/E,SAAS,CAAC,IAAI,CAAC;oBACb,GAAG,GAAG;oBACN,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,OAAO,SAAS;aACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,eAAe,KAAK,cAAc,CAAC;aACtE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAErD,gFAAgF;IAChF,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,MAAM,IAAA,gBAAK,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,UAAU,GAAG,IAAA,wBAAgB,EAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,MAAM;SACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;SAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAQtC,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAwBzC;AAED,wBAAgB,OAAO,IAAI,IAAI,CAK9B"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getDbPath = getDbPath;
|
|
7
|
+
exports.getDb = getDb;
|
|
8
|
+
exports.closeDb = closeDb;
|
|
9
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const os_1 = __importDefault(require("os"));
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const schema_1 = require("./schema");
|
|
14
|
+
let db = null;
|
|
15
|
+
function getDbPath() {
|
|
16
|
+
const dir = path_1.default.join(os_1.default.homedir(), '.opengauge');
|
|
17
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
18
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
return path_1.default.join(dir, 'opengauge.db');
|
|
21
|
+
}
|
|
22
|
+
function getDb() {
|
|
23
|
+
if (db)
|
|
24
|
+
return db;
|
|
25
|
+
const dbPath = getDbPath();
|
|
26
|
+
db = new better_sqlite3_1.default(dbPath);
|
|
27
|
+
// Enable WAL mode for better concurrent read performance
|
|
28
|
+
db.pragma('journal_mode = WAL');
|
|
29
|
+
db.pragma('foreign_keys = ON');
|
|
30
|
+
// Try to load sqlite-vec extension
|
|
31
|
+
try {
|
|
32
|
+
db.loadExtension('vec0');
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// sqlite-vec may not be available; embeddings table will be skipped
|
|
36
|
+
console.warn('sqlite-vec extension not found. Vector search will be unavailable. ' +
|
|
37
|
+
'Install sqlite-vec for full RAG support.');
|
|
38
|
+
}
|
|
39
|
+
(0, schema_1.initSchema)(db);
|
|
40
|
+
return db;
|
|
41
|
+
}
|
|
42
|
+
function closeDb() {
|
|
43
|
+
if (db) {
|
|
44
|
+
db.close();
|
|
45
|
+
db = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":";;;;;AAQA,8BAMC;AAED,sBAwBC;AAED,0BAKC;AA/CD,oEAAsC;AACtC,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,qCAAsC;AAEtC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,SAAgB,SAAS;IACvB,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,KAAK;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;IAE1B,yDAAyD;IACzD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,mCAAmC;IACnC,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,OAAO,CAAC,IAAI,CACV,qEAAqE;YACrE,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,IAAA,mBAAU,EAAC,EAAE,CAAC,CAAC;IAEf,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export interface Conversation {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string | null;
|
|
5
|
+
provider: string;
|
|
6
|
+
model: string;
|
|
7
|
+
created_at: number;
|
|
8
|
+
updated_at: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Message {
|
|
11
|
+
id: string;
|
|
12
|
+
conversation_id: string;
|
|
13
|
+
role: 'user' | 'assistant' | 'system';
|
|
14
|
+
content: string;
|
|
15
|
+
tokens_raw: number | null;
|
|
16
|
+
tokens_sent: number | null;
|
|
17
|
+
created_at: number;
|
|
18
|
+
}
|
|
19
|
+
export interface TokenUsage {
|
|
20
|
+
id: string;
|
|
21
|
+
conversation_id: string;
|
|
22
|
+
provider: string;
|
|
23
|
+
model: string;
|
|
24
|
+
tokens_in: number;
|
|
25
|
+
tokens_out: number;
|
|
26
|
+
tokens_saved: number;
|
|
27
|
+
cost_estimate: number | null;
|
|
28
|
+
created_at: number;
|
|
29
|
+
}
|
|
30
|
+
export interface Checkpoint {
|
|
31
|
+
id: string;
|
|
32
|
+
conversation_id: string;
|
|
33
|
+
summary: string;
|
|
34
|
+
covers_until: number;
|
|
35
|
+
created_at: number;
|
|
36
|
+
}
|
|
37
|
+
export declare class Queries {
|
|
38
|
+
private db;
|
|
39
|
+
private stmtInsertConversation;
|
|
40
|
+
private stmtUpdateConversation;
|
|
41
|
+
private stmtGetConversation;
|
|
42
|
+
private stmtListConversations;
|
|
43
|
+
private stmtDeleteConversation;
|
|
44
|
+
private stmtInsertMessage;
|
|
45
|
+
private stmtGetMessages;
|
|
46
|
+
private stmtGetMessageCount;
|
|
47
|
+
private stmtInsertTokenUsage;
|
|
48
|
+
private stmtGetTokenUsageByConversation;
|
|
49
|
+
private stmtGetAggregatedTokenUsage;
|
|
50
|
+
private stmtInsertCheckpoint;
|
|
51
|
+
private stmtGetLatestCheckpoint;
|
|
52
|
+
constructor(db: Database.Database);
|
|
53
|
+
createConversation(provider: string, model: string, title?: string): Conversation;
|
|
54
|
+
updateConversation(id: string, title: string): void;
|
|
55
|
+
getConversation(id: string): Conversation | undefined;
|
|
56
|
+
listConversations(): Conversation[];
|
|
57
|
+
deleteConversation(id: string): void;
|
|
58
|
+
insertMessage(conversationId: string, role: 'user' | 'assistant' | 'system', content: string, tokensRaw?: number, tokensSent?: number): Message;
|
|
59
|
+
getMessages(conversationId: string): Message[];
|
|
60
|
+
getMessageCount(conversationId: string): number;
|
|
61
|
+
insertTokenUsage(conversationId: string, provider: string, model: string, tokensIn: number, tokensOut: number, tokensSaved?: number, costEstimate?: number): TokenUsage;
|
|
62
|
+
getTokenUsageByConversation(conversationId: string): TokenUsage[];
|
|
63
|
+
getAggregatedTokenUsage(): any[];
|
|
64
|
+
insertCheckpoint(conversationId: string, summary: string, coversUntil: number): Checkpoint;
|
|
65
|
+
getLatestCheckpoint(conversationId: string): Checkpoint | undefined;
|
|
66
|
+
insertEmbedding(messageId: string, vector: Float32Array): void;
|
|
67
|
+
searchSimilar(queryVector: Float32Array, limit?: number): Array<{
|
|
68
|
+
message_id: string;
|
|
69
|
+
distance: number;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAoB;IAG9B,OAAO,CAAC,sBAAsB,CAAqB;IACnD,OAAO,CAAC,sBAAsB,CAAqB;IACnD,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,qBAAqB,CAAqB;IAClD,OAAO,CAAC,sBAAsB,CAAqB;IAEnD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,+BAA+B,CAAqB;IAC5D,OAAO,CAAC,2BAA2B,CAAqB;IAExD,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,uBAAuB,CAAqB;gBAExC,EAAE,EAAE,QAAQ,CAAC,QAAQ;IA2EjC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;IAOjF,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAInD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIrD,iBAAiB,IAAI,YAAY,EAAE;IAInC,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMpC,aAAa,CACX,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,EACrC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO;IAcV,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE;IAI9C,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IAO/C,gBAAgB,CACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAU,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,UAAU;IAOb,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,EAAE;IAIjE,uBAAuB,IAAI,GAAG,EAAE;IAMhC,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU;IAO1F,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAMnE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAU9D,aAAa,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAc9G"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Queries = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
class Queries {
|
|
6
|
+
db;
|
|
7
|
+
// Prepared statements
|
|
8
|
+
stmtInsertConversation;
|
|
9
|
+
stmtUpdateConversation;
|
|
10
|
+
stmtGetConversation;
|
|
11
|
+
stmtListConversations;
|
|
12
|
+
stmtDeleteConversation;
|
|
13
|
+
stmtInsertMessage;
|
|
14
|
+
stmtGetMessages;
|
|
15
|
+
stmtGetMessageCount;
|
|
16
|
+
stmtInsertTokenUsage;
|
|
17
|
+
stmtGetTokenUsageByConversation;
|
|
18
|
+
stmtGetAggregatedTokenUsage;
|
|
19
|
+
stmtInsertCheckpoint;
|
|
20
|
+
stmtGetLatestCheckpoint;
|
|
21
|
+
constructor(db) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
// Conversation statements
|
|
24
|
+
this.stmtInsertConversation = db.prepare(`
|
|
25
|
+
INSERT INTO conversations (id, title, provider, model, created_at, updated_at)
|
|
26
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
27
|
+
`);
|
|
28
|
+
this.stmtUpdateConversation = db.prepare(`
|
|
29
|
+
UPDATE conversations SET title = ?, updated_at = ? WHERE id = ?
|
|
30
|
+
`);
|
|
31
|
+
this.stmtGetConversation = db.prepare(`
|
|
32
|
+
SELECT * FROM conversations WHERE id = ?
|
|
33
|
+
`);
|
|
34
|
+
this.stmtListConversations = db.prepare(`
|
|
35
|
+
SELECT * FROM conversations ORDER BY updated_at DESC
|
|
36
|
+
`);
|
|
37
|
+
this.stmtDeleteConversation = db.prepare(`
|
|
38
|
+
DELETE FROM conversations WHERE id = ?
|
|
39
|
+
`);
|
|
40
|
+
// Message statements
|
|
41
|
+
this.stmtInsertMessage = db.prepare(`
|
|
42
|
+
INSERT INTO messages (id, conversation_id, role, content, tokens_raw, tokens_sent, created_at)
|
|
43
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
44
|
+
`);
|
|
45
|
+
this.stmtGetMessages = db.prepare(`
|
|
46
|
+
SELECT * FROM messages WHERE conversation_id = ? ORDER BY created_at ASC
|
|
47
|
+
`);
|
|
48
|
+
this.stmtGetMessageCount = db.prepare(`
|
|
49
|
+
SELECT COUNT(*) as count FROM messages WHERE conversation_id = ?
|
|
50
|
+
`);
|
|
51
|
+
// Token usage statements
|
|
52
|
+
this.stmtInsertTokenUsage = db.prepare(`
|
|
53
|
+
INSERT INTO token_usage (id, conversation_id, provider, model, tokens_in, tokens_out, tokens_saved, cost_estimate, created_at)
|
|
54
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
55
|
+
`);
|
|
56
|
+
this.stmtGetTokenUsageByConversation = db.prepare(`
|
|
57
|
+
SELECT * FROM token_usage WHERE conversation_id = ? ORDER BY created_at DESC
|
|
58
|
+
`);
|
|
59
|
+
this.stmtGetAggregatedTokenUsage = db.prepare(`
|
|
60
|
+
SELECT
|
|
61
|
+
provider,
|
|
62
|
+
model,
|
|
63
|
+
SUM(tokens_in) as total_tokens_in,
|
|
64
|
+
SUM(tokens_out) as total_tokens_out,
|
|
65
|
+
SUM(tokens_saved) as total_tokens_saved,
|
|
66
|
+
SUM(cost_estimate) as total_cost,
|
|
67
|
+
COUNT(*) as request_count
|
|
68
|
+
FROM token_usage
|
|
69
|
+
GROUP BY provider, model
|
|
70
|
+
`);
|
|
71
|
+
// Checkpoint statements
|
|
72
|
+
this.stmtInsertCheckpoint = db.prepare(`
|
|
73
|
+
INSERT INTO checkpoints (id, conversation_id, summary, covers_until, created_at)
|
|
74
|
+
VALUES (?, ?, ?, ?, ?)
|
|
75
|
+
`);
|
|
76
|
+
this.stmtGetLatestCheckpoint = db.prepare(`
|
|
77
|
+
SELECT * FROM checkpoints WHERE conversation_id = ? ORDER BY created_at DESC LIMIT 1
|
|
78
|
+
`);
|
|
79
|
+
}
|
|
80
|
+
// ---- Conversations ----
|
|
81
|
+
createConversation(provider, model, title) {
|
|
82
|
+
const id = (0, uuid_1.v4)();
|
|
83
|
+
const now = Date.now();
|
|
84
|
+
this.stmtInsertConversation.run(id, title || null, provider, model, now, now);
|
|
85
|
+
return { id, title: title || null, provider, model, created_at: now, updated_at: now };
|
|
86
|
+
}
|
|
87
|
+
updateConversation(id, title) {
|
|
88
|
+
this.stmtUpdateConversation.run(title, Date.now(), id);
|
|
89
|
+
}
|
|
90
|
+
getConversation(id) {
|
|
91
|
+
return this.stmtGetConversation.get(id);
|
|
92
|
+
}
|
|
93
|
+
listConversations() {
|
|
94
|
+
return this.stmtListConversations.all();
|
|
95
|
+
}
|
|
96
|
+
deleteConversation(id) {
|
|
97
|
+
this.stmtDeleteConversation.run(id);
|
|
98
|
+
}
|
|
99
|
+
// ---- Messages ----
|
|
100
|
+
insertMessage(conversationId, role, content, tokensRaw, tokensSent) {
|
|
101
|
+
const id = (0, uuid_1.v4)();
|
|
102
|
+
const now = Date.now();
|
|
103
|
+
this.stmtInsertMessage.run(id, conversationId, role, content, tokensRaw ?? null, tokensSent ?? null, now);
|
|
104
|
+
// Update conversation updated_at
|
|
105
|
+
this.stmtUpdateConversation.run(null, now, conversationId);
|
|
106
|
+
// Re-read to keep title if it existed
|
|
107
|
+
const conv = this.getConversation(conversationId);
|
|
108
|
+
if (conv) {
|
|
109
|
+
this.db.prepare('UPDATE conversations SET updated_at = ? WHERE id = ?').run(now, conversationId);
|
|
110
|
+
}
|
|
111
|
+
return { id, conversation_id: conversationId, role, content, tokens_raw: tokensRaw ?? null, tokens_sent: tokensSent ?? null, created_at: now };
|
|
112
|
+
}
|
|
113
|
+
getMessages(conversationId) {
|
|
114
|
+
return this.stmtGetMessages.all(conversationId);
|
|
115
|
+
}
|
|
116
|
+
getMessageCount(conversationId) {
|
|
117
|
+
const row = this.stmtGetMessageCount.get(conversationId);
|
|
118
|
+
return row.count;
|
|
119
|
+
}
|
|
120
|
+
// ---- Token Usage ----
|
|
121
|
+
insertTokenUsage(conversationId, provider, model, tokensIn, tokensOut, tokensSaved = 0, costEstimate) {
|
|
122
|
+
const id = (0, uuid_1.v4)();
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
this.stmtInsertTokenUsage.run(id, conversationId, provider, model, tokensIn, tokensOut, tokensSaved, costEstimate ?? null, now);
|
|
125
|
+
return { id, conversation_id: conversationId, provider, model, tokens_in: tokensIn, tokens_out: tokensOut, tokens_saved: tokensSaved, cost_estimate: costEstimate ?? null, created_at: now };
|
|
126
|
+
}
|
|
127
|
+
getTokenUsageByConversation(conversationId) {
|
|
128
|
+
return this.stmtGetTokenUsageByConversation.all(conversationId);
|
|
129
|
+
}
|
|
130
|
+
getAggregatedTokenUsage() {
|
|
131
|
+
return this.stmtGetAggregatedTokenUsage.all();
|
|
132
|
+
}
|
|
133
|
+
// ---- Checkpoints ----
|
|
134
|
+
insertCheckpoint(conversationId, summary, coversUntil) {
|
|
135
|
+
const id = (0, uuid_1.v4)();
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
this.stmtInsertCheckpoint.run(id, conversationId, summary, coversUntil, now);
|
|
138
|
+
return { id, conversation_id: conversationId, summary, covers_until: coversUntil, created_at: now };
|
|
139
|
+
}
|
|
140
|
+
getLatestCheckpoint(conversationId) {
|
|
141
|
+
return this.stmtGetLatestCheckpoint.get(conversationId);
|
|
142
|
+
}
|
|
143
|
+
// ---- Embeddings ----
|
|
144
|
+
insertEmbedding(messageId, vector) {
|
|
145
|
+
try {
|
|
146
|
+
this.db.prepare('INSERT INTO embeddings (message_id, vector) VALUES (?, ?)').run(messageId, Buffer.from(vector.buffer));
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// sqlite-vec not available
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
searchSimilar(queryVector, limit = 15) {
|
|
153
|
+
try {
|
|
154
|
+
const rows = this.db.prepare(`
|
|
155
|
+
SELECT message_id, distance
|
|
156
|
+
FROM embeddings
|
|
157
|
+
WHERE vector MATCH ?
|
|
158
|
+
ORDER BY distance
|
|
159
|
+
LIMIT ?
|
|
160
|
+
`).all(Buffer.from(queryVector.buffer), limit);
|
|
161
|
+
return rows;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.Queries = Queries;
|
|
169
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAkEtD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initSchema = initSchema;
|
|
4
|
+
function initSchema(db) {
|
|
5
|
+
db.exec(`
|
|
6
|
+
-- Conversations
|
|
7
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
8
|
+
id TEXT PRIMARY KEY,
|
|
9
|
+
title TEXT,
|
|
10
|
+
provider TEXT NOT NULL,
|
|
11
|
+
model TEXT NOT NULL,
|
|
12
|
+
created_at INTEGER NOT NULL,
|
|
13
|
+
updated_at INTEGER NOT NULL
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
-- Messages
|
|
17
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
18
|
+
id TEXT PRIMARY KEY,
|
|
19
|
+
conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
|
20
|
+
role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system')),
|
|
21
|
+
content TEXT NOT NULL,
|
|
22
|
+
tokens_raw INTEGER,
|
|
23
|
+
tokens_sent INTEGER,
|
|
24
|
+
created_at INTEGER NOT NULL
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_messages_conversation
|
|
28
|
+
ON messages(conversation_id, created_at);
|
|
29
|
+
|
|
30
|
+
-- Token usage analytics
|
|
31
|
+
CREATE TABLE IF NOT EXISTS token_usage (
|
|
32
|
+
id TEXT PRIMARY KEY,
|
|
33
|
+
conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
|
34
|
+
provider TEXT NOT NULL,
|
|
35
|
+
model TEXT NOT NULL,
|
|
36
|
+
tokens_in INTEGER NOT NULL,
|
|
37
|
+
tokens_out INTEGER NOT NULL,
|
|
38
|
+
tokens_saved INTEGER DEFAULT 0,
|
|
39
|
+
cost_estimate REAL,
|
|
40
|
+
created_at INTEGER NOT NULL
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_token_usage_conversation
|
|
44
|
+
ON token_usage(conversation_id);
|
|
45
|
+
|
|
46
|
+
-- Conversation checkpoints
|
|
47
|
+
CREATE TABLE IF NOT EXISTS checkpoints (
|
|
48
|
+
id TEXT PRIMARY KEY,
|
|
49
|
+
conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
|
50
|
+
summary TEXT NOT NULL,
|
|
51
|
+
covers_until INTEGER NOT NULL,
|
|
52
|
+
created_at INTEGER NOT NULL
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_checkpoints_conversation
|
|
56
|
+
ON checkpoints(conversation_id);
|
|
57
|
+
`);
|
|
58
|
+
// Try creating the embeddings virtual table (requires sqlite-vec)
|
|
59
|
+
try {
|
|
60
|
+
db.exec(`
|
|
61
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS embeddings USING vec0(
|
|
62
|
+
message_id TEXT PRIMARY KEY,
|
|
63
|
+
vector FLOAT[384]
|
|
64
|
+
);
|
|
65
|
+
`);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// sqlite-vec not available — skip
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":";;AAEA,gCAkEC;AAlED,SAAgB,UAAU,CAAC,EAAqB;IAC9C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDP,CAAC,CAAC;IAEH,kEAAkE;IAClE,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC;;;;;KAKP,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management — reads/writes YAML config
|
|
3
|
+
*/
|
|
4
|
+
import { ProviderConfig, ProviderName } from '../core/providers/adapter';
|
|
5
|
+
export interface AppConfig {
|
|
6
|
+
providers: Partial<Record<ProviderName, ProviderConfig>>;
|
|
7
|
+
defaults?: {
|
|
8
|
+
provider?: ProviderName;
|
|
9
|
+
system_prompt?: string;
|
|
10
|
+
};
|
|
11
|
+
optimizer?: {
|
|
12
|
+
compression_level?: number;
|
|
13
|
+
checkpoint_interval?: number;
|
|
14
|
+
keep_recent?: number;
|
|
15
|
+
rag_top_k?: number;
|
|
16
|
+
target_savings_percent?: number;
|
|
17
|
+
quality_floor_tokens?: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function getConfigPath(): string;
|
|
21
|
+
export declare function loadConfig(): AppConfig;
|
|
22
|
+
export declare function saveConfig(config: AppConfig): void;
|
|
23
|
+
export declare function updateProviderConfig(providerName: ProviderName, providerConfig: ProviderConfig): AppConfig;
|
|
24
|
+
export declare function getDefaultProvider(config: AppConfig): ProviderName | null;
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,YAAY,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;CACH;AAKD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,SAAS,CAWtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYlD;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,GAC7B,SAAS,CAQX;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,IAAI,CAazE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration management — reads/writes YAML config
|
|
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.getConfigPath = getConfigPath;
|
|
10
|
+
exports.loadConfig = loadConfig;
|
|
11
|
+
exports.saveConfig = saveConfig;
|
|
12
|
+
exports.updateProviderConfig = updateProviderConfig;
|
|
13
|
+
exports.getDefaultProvider = getDefaultProvider;
|
|
14
|
+
const fs_1 = __importDefault(require("fs"));
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const os_1 = __importDefault(require("os"));
|
|
17
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
18
|
+
const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.opengauge');
|
|
19
|
+
const CONFIG_PATH = path_1.default.join(CONFIG_DIR, 'config.yml');
|
|
20
|
+
function getConfigPath() {
|
|
21
|
+
return CONFIG_PATH;
|
|
22
|
+
}
|
|
23
|
+
function loadConfig() {
|
|
24
|
+
try {
|
|
25
|
+
if (fs_1.default.existsSync(CONFIG_PATH)) {
|
|
26
|
+
const content = fs_1.default.readFileSync(CONFIG_PATH, 'utf-8');
|
|
27
|
+
const config = js_yaml_1.default.load(content);
|
|
28
|
+
return config || { providers: {} };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.warn('Failed to load config:', error);
|
|
33
|
+
}
|
|
34
|
+
return { providers: {} };
|
|
35
|
+
}
|
|
36
|
+
function saveConfig(config) {
|
|
37
|
+
if (!fs_1.default.existsSync(CONFIG_DIR)) {
|
|
38
|
+
fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
const content = js_yaml_1.default.dump(config, {
|
|
41
|
+
indent: 2,
|
|
42
|
+
lineWidth: -1,
|
|
43
|
+
noRefs: true,
|
|
44
|
+
});
|
|
45
|
+
fs_1.default.writeFileSync(CONFIG_PATH, content, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
function updateProviderConfig(providerName, providerConfig) {
|
|
48
|
+
const config = loadConfig();
|
|
49
|
+
config.providers[providerName] = {
|
|
50
|
+
...config.providers[providerName],
|
|
51
|
+
...providerConfig,
|
|
52
|
+
};
|
|
53
|
+
saveConfig(config);
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
function getDefaultProvider(config) {
|
|
57
|
+
if (config.defaults?.provider)
|
|
58
|
+
return config.defaults.provider;
|
|
59
|
+
// Auto-detect: use the first configured provider
|
|
60
|
+
const providers = Object.keys(config.providers);
|
|
61
|
+
for (const name of providers) {
|
|
62
|
+
const p = config.providers[name];
|
|
63
|
+
if (p?.api_key || name === 'ollama') {
|
|
64
|
+
return name;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AA2BH,sCAEC;AAED,gCAWC;AAED,gCAYC;AAED,oDAWC;AAED,gDAaC;AAlFD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,sDAA2B;AAmB3B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAExD,SAAgB,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,iBAAI,CAAC,IAAI,CAAC,OAAO,CAAc,CAAC;YAC/C,OAAO,MAAM,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC3B,CAAC;AAED,SAAgB,UAAU,CAAC,MAAiB;IAC1C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,iBAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAChC,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,oBAAoB,CAClC,YAA0B,EAC1B,cAA8B;IAE9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG;QAC/B,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC;QACjC,GAAG,cAAc;KAClB,CAAC;IACF,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAiB;IAClD,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAE/D,iDAAiD;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAmB,CAAC;IAClE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fastify server setup for OpenGauge
|
|
3
|
+
*/
|
|
4
|
+
export declare function createServer(port?: number): Promise<import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,wBAAsB,YAAY,CAAC,IAAI,GAAE,MAAa,oUAkDrD"}
|