@nxuss/lemma 0.8.1 → 0.9.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 +144 -236
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +57 -119
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +868 -0
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/observability/IdeContextSync.js +3 -3
- package/dist/cjs/observability/IdeContextSync.js.map +1 -1
- package/dist/cjs/proxy/ProjectStore.d.ts +2 -0
- package/dist/cjs/proxy/ProjectStore.d.ts.map +1 -1
- package/dist/cjs/proxy/ProjectStore.js +3 -1
- package/dist/cjs/proxy/ProjectStore.js.map +1 -1
- package/dist/cjs/proxy/SseRelay.d.ts +4 -25
- package/dist/cjs/proxy/SseRelay.d.ts.map +1 -1
- package/dist/cjs/proxy/SseRelay.js +60 -63
- package/dist/cjs/proxy/SseRelay.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +29 -91
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +868 -0
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/observability/IdeContextSync.js +1 -1
- package/dist/esm/observability/IdeContextSync.js.map +1 -1
- package/dist/esm/proxy/ProjectStore.d.ts +2 -0
- package/dist/esm/proxy/ProjectStore.d.ts.map +1 -1
- package/dist/esm/proxy/ProjectStore.js +2 -0
- package/dist/esm/proxy/ProjectStore.js.map +1 -1
- package/dist/esm/proxy/SseRelay.d.ts +4 -25
- package/dist/esm/proxy/SseRelay.d.ts.map +1 -1
- package/dist/esm/proxy/SseRelay.js +60 -60
- package/dist/esm/proxy/SseRelay.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/protocol/iap.d.ts +0 -54
- package/dist/cjs/protocol/iap.d.ts.map +0 -1
- package/dist/cjs/protocol/iap.js +0 -108
- package/dist/cjs/protocol/iap.js.map +0 -1
- package/dist/cjs/subconscious/cache.d.ts +0 -34
- package/dist/cjs/subconscious/cache.d.ts.map +0 -1
- package/dist/cjs/subconscious/cache.js +0 -156
- package/dist/cjs/subconscious/cache.js.map +0 -1
- package/dist/cjs/subconscious/embeddings.d.ts +0 -25
- package/dist/cjs/subconscious/embeddings.d.ts.map +0 -1
- package/dist/cjs/subconscious/embeddings.js +0 -65
- package/dist/cjs/subconscious/embeddings.js.map +0 -1
- package/dist/esm/protocol/iap.d.ts +0 -54
- package/dist/esm/protocol/iap.d.ts.map +0 -1
- package/dist/esm/protocol/iap.js +0 -104
- package/dist/esm/protocol/iap.js.map +0 -1
- package/dist/esm/subconscious/cache.d.ts +0 -34
- package/dist/esm/subconscious/cache.d.ts.map +0 -1
- package/dist/esm/subconscious/cache.js +0 -152
- package/dist/esm/subconscious/cache.js.map +0 -1
- package/dist/esm/subconscious/embeddings.d.ts +0 -25
- package/dist/esm/subconscious/embeddings.d.ts.map +0 -1
- package/dist/esm/subconscious/embeddings.js +0 -58
- package/dist/esm/subconscious/embeddings.js.map +0 -1
|
@@ -1,58 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Handles Server-Sent Events (SSE) streaming in two modes:
|
|
5
|
-
*
|
|
6
|
-
* MISS mode: Pipes upstream SSE response from OpenAI/Anthropic to the client
|
|
7
|
-
* in real-time (transparent relay).
|
|
8
|
-
*
|
|
9
|
-
* HIT mode: Simulates an SSE stream from a cached response by chunking the
|
|
10
|
-
* text into ~5-word pieces and emitting them with a small delay.
|
|
11
|
-
* Visually identical to a real stream for IDEs like Cursor.
|
|
12
|
-
*
|
|
13
|
-
* Both modes:
|
|
14
|
-
* - Set correct SSE headers (text/event-stream, no-cache)
|
|
15
|
-
* - Inject X-Lemma-Cache, X-Lemma-Similarity, X-Lemma-Tier headers
|
|
16
|
-
* - Append the `data: [DONE]` sentinel
|
|
17
|
-
* - Support both OpenAI and Anthropic SSE envelope formats
|
|
18
|
-
*/
|
|
19
|
-
import http from 'http';
|
|
20
|
-
import https from 'https';
|
|
21
|
-
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
22
|
-
const CHUNK_WORDS = 5; // words per simulated chunk
|
|
23
|
-
const CHUNK_DELAY_MS = 15; // ms between simulated chunks
|
|
24
|
-
// ─── SseRelay ─────────────────────────────────────────────────────────────────
|
|
1
|
+
const CHUNK_SIZE = 30;
|
|
2
|
+
const CHUNK_DELAY_MS = 15;
|
|
25
3
|
export class SseRelay {
|
|
26
|
-
/**
|
|
27
|
-
* Simulate an SSE stream from a cached response.
|
|
28
|
-
*/
|
|
29
4
|
static async simulateHit(res, cachedResponse, opts) {
|
|
30
5
|
SseRelay.setSseHeaders(res, opts);
|
|
31
6
|
const text = SseRelay.extractTextFromResponse(cachedResponse, opts.provider);
|
|
32
|
-
const model = cachedResponse?.model || (opts.provider
|
|
33
|
-
const id = `lemma
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const sseData = SseRelay.buildChunkEvent(chunk, id, model, opts.provider, false);
|
|
39
|
-
res.write(`data: ${JSON.stringify(sseData)}\n\n`);
|
|
7
|
+
const model = cachedResponse?.model || SseRelay.defaultModel(opts.provider);
|
|
8
|
+
const id = `lemma-${Date.now()}`;
|
|
9
|
+
for (let i = 0; i < text.length; i += CHUNK_SIZE) {
|
|
10
|
+
const chunk = text.slice(i, i + CHUNK_SIZE);
|
|
11
|
+
const evt = SseRelay.buildChunkEvent(chunk, id, model, opts.provider, false);
|
|
12
|
+
res.write(SseRelay.formatSSE(evt, opts.provider));
|
|
40
13
|
await sleep(CHUNK_DELAY_MS);
|
|
41
14
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
15
|
+
const stopEvt = SseRelay.buildChunkEvent('', id, model, opts.provider, true);
|
|
16
|
+
res.write(SseRelay.formatSSE(stopEvt, opts.provider));
|
|
17
|
+
if (opts.provider !== 'gemini') {
|
|
18
|
+
res.write('data: [DONE]\n\n');
|
|
19
|
+
}
|
|
46
20
|
res.end();
|
|
47
21
|
}
|
|
48
|
-
/**
|
|
49
|
-
* Relay a live upstream SSE stream transparently.
|
|
50
|
-
*/
|
|
51
22
|
static async relayMiss(req, res, upstreamBody, provider, opts) {
|
|
52
23
|
SseRelay.setSseHeaders(res, opts);
|
|
53
24
|
const apiKey = provider === 'openai'
|
|
54
25
|
? process.env.OPENAI_API_KEY
|
|
55
|
-
:
|
|
26
|
+
: provider === 'anthropic'
|
|
27
|
+
? process.env.ANTHROPIC_API_KEY
|
|
28
|
+
: process.env.GEMINI_API_KEY;
|
|
56
29
|
if (!apiKey) {
|
|
57
30
|
res.write(`data: ${JSON.stringify({ error: `${provider.toUpperCase()}_API_KEY not set` })}\n\n`);
|
|
58
31
|
res.write('data: [DONE]\n\n');
|
|
@@ -62,7 +35,7 @@ export class SseRelay {
|
|
|
62
35
|
const { hostname, path, headers } = SseRelay.buildUpstreamRequest(provider, apiKey);
|
|
63
36
|
const body = JSON.stringify({ ...upstreamBody, stream: true });
|
|
64
37
|
await new Promise((resolve, reject) => {
|
|
65
|
-
const lib = hostname.startsWith('localhost') ? http : https;
|
|
38
|
+
const lib = hostname.startsWith('localhost') ? require('http') : require('https');
|
|
66
39
|
const reqOpts = {
|
|
67
40
|
hostname,
|
|
68
41
|
port: hostname.startsWith('localhost') ? 80 : 443,
|
|
@@ -95,19 +68,25 @@ export class SseRelay {
|
|
|
95
68
|
upstreamReq.end();
|
|
96
69
|
});
|
|
97
70
|
}
|
|
98
|
-
// ── Private helpers ─────────────────────────────────────────────────────────
|
|
99
71
|
static setSseHeaders(res, opts) {
|
|
100
72
|
res.setHeader('Content-Type', 'text/event-stream');
|
|
101
73
|
res.setHeader('Cache-Control', 'no-cache');
|
|
102
74
|
res.setHeader('Connection', 'keep-alive');
|
|
103
75
|
res.setHeader('X-Accel-Buffering', 'no');
|
|
104
|
-
res.setHeader('X-Lemma-Cache', 'HIT');
|
|
76
|
+
res.setHeader('X-Lemma-Cache', opts.cacheHeader || 'HIT');
|
|
105
77
|
res.setHeader('X-Lemma-Similarity', (opts.similarity ?? 1.0).toFixed(3));
|
|
106
78
|
res.setHeader('X-Lemma-Tier', opts.tier);
|
|
107
79
|
if (opts.latencyMs !== undefined) {
|
|
108
80
|
res.setHeader('X-Lemma-Latency', `${opts.latencyMs}ms`);
|
|
109
81
|
}
|
|
110
82
|
}
|
|
83
|
+
static defaultModel(provider) {
|
|
84
|
+
if (provider === 'openai')
|
|
85
|
+
return 'gpt-4';
|
|
86
|
+
if (provider === 'anthropic')
|
|
87
|
+
return 'claude-3-5-sonnet-20241022';
|
|
88
|
+
return 'gemini-1.5-pro';
|
|
89
|
+
}
|
|
111
90
|
static buildUpstreamRequest(provider, apiKey) {
|
|
112
91
|
if (provider === 'openai') {
|
|
113
92
|
return {
|
|
@@ -116,10 +95,17 @@ export class SseRelay {
|
|
|
116
95
|
headers: { Authorization: `Bearer ${apiKey}` },
|
|
117
96
|
};
|
|
118
97
|
}
|
|
98
|
+
if (provider === 'anthropic') {
|
|
99
|
+
return {
|
|
100
|
+
hostname: 'api.anthropic.com',
|
|
101
|
+
path: '/v1/messages',
|
|
102
|
+
headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
119
105
|
return {
|
|
120
|
-
hostname: '
|
|
121
|
-
path:
|
|
122
|
-
headers: {
|
|
106
|
+
hostname: 'generativelanguage.googleapis.com',
|
|
107
|
+
path: `/v1beta/models/${apiKey}`,
|
|
108
|
+
headers: {},
|
|
123
109
|
};
|
|
124
110
|
}
|
|
125
111
|
static buildChunkEvent(text, id, model, provider, isStop) {
|
|
@@ -136,27 +122,41 @@ export class SseRelay {
|
|
|
136
122
|
}],
|
|
137
123
|
};
|
|
138
124
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
125
|
+
if (provider === 'anthropic') {
|
|
126
|
+
if (isStop)
|
|
127
|
+
return { type: 'message_stop' };
|
|
128
|
+
return {
|
|
129
|
+
type: 'content_block_delta',
|
|
130
|
+
index: 0,
|
|
131
|
+
delta: { type: 'text_delta', text },
|
|
132
|
+
};
|
|
142
133
|
}
|
|
143
134
|
return {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
135
|
+
candidates: [{
|
|
136
|
+
content: { parts: [{ text }] },
|
|
137
|
+
finishReason: isStop ? 'STOP' : undefined,
|
|
138
|
+
}],
|
|
147
139
|
};
|
|
148
140
|
}
|
|
141
|
+
static formatSSE(data, provider) {
|
|
142
|
+
if (provider === 'gemini') {
|
|
143
|
+
return `${JSON.stringify(data)}\n`;
|
|
144
|
+
}
|
|
145
|
+
return `data: ${JSON.stringify(data)}\n\n`;
|
|
146
|
+
}
|
|
149
147
|
static extractTextFromResponse(response, provider) {
|
|
150
148
|
try {
|
|
151
149
|
if (provider === 'openai') {
|
|
152
150
|
return response?.choices?.[0]?.message?.content || '';
|
|
153
151
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
if (provider === 'anthropic') {
|
|
153
|
+
const content = response?.content;
|
|
154
|
+
if (Array.isArray(content)) {
|
|
155
|
+
return content.map((c) => c.text || '').join('');
|
|
156
|
+
}
|
|
157
|
+
return String(content || '');
|
|
158
158
|
}
|
|
159
|
-
return
|
|
159
|
+
return response?.candidates?.[0]?.content?.parts?.[0]?.text || '';
|
|
160
160
|
}
|
|
161
161
|
catch {
|
|
162
162
|
return '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SseRelay.js","sourceRoot":"","sources":["../../../src/proxy/SseRelay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SseRelay.js","sourceRoot":"","sources":["../../../src/proxy/SseRelay.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxuss/lemma",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Intelligent AI Gateway for IDEs & Agents — Semantic cache, Privacy Firewall, and Autonomous Cost-Optimization.",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Inter-Agent Protocol (I.A.P.) v1.0
|
|
3
|
-
* Standardized communication layer for autonomous AI agents
|
|
4
|
-
*/
|
|
5
|
-
import { IAPMessage, HandshakePayload, TaskRequest, TaskResponse } from '../types/index';
|
|
6
|
-
export type AgentHandshake = HandshakePayload;
|
|
7
|
-
export interface TaskBid {
|
|
8
|
-
taskId: string;
|
|
9
|
-
agentId: string;
|
|
10
|
-
bidAmount: number;
|
|
11
|
-
estimatedTime?: number;
|
|
12
|
-
confidence?: number;
|
|
13
|
-
metadata?: Record<string, any>;
|
|
14
|
-
}
|
|
15
|
-
export declare class IAPProtocol {
|
|
16
|
-
static readonly VERSION = "1.0.0";
|
|
17
|
-
/**
|
|
18
|
-
* Create a handshake message
|
|
19
|
-
*/
|
|
20
|
-
static createHandshake(handshake: HandshakePayload): IAPMessage;
|
|
21
|
-
/**
|
|
22
|
-
* Create a task request message
|
|
23
|
-
*/
|
|
24
|
-
static createTaskRequest(request: TaskRequest): IAPMessage;
|
|
25
|
-
/**
|
|
26
|
-
* Create a task response message
|
|
27
|
-
*/
|
|
28
|
-
static createTaskResponse(response: TaskResponse): IAPMessage;
|
|
29
|
-
/**
|
|
30
|
-
* Create a task bid message
|
|
31
|
-
*/
|
|
32
|
-
static createTaskBid(bid: TaskBid): IAPMessage;
|
|
33
|
-
/**
|
|
34
|
-
* Create a heartbeat message
|
|
35
|
-
*/
|
|
36
|
-
static createHeartbeat(agentId: string): IAPMessage;
|
|
37
|
-
/**
|
|
38
|
-
* Create an error message
|
|
39
|
-
*/
|
|
40
|
-
static createError(error: string, details?: Record<string, unknown>): IAPMessage;
|
|
41
|
-
/**
|
|
42
|
-
* Validate an IAP message
|
|
43
|
-
*/
|
|
44
|
-
static validate(message: unknown): message is IAPMessage;
|
|
45
|
-
/**
|
|
46
|
-
* Parse a raw message string into an IAP message
|
|
47
|
-
*/
|
|
48
|
-
static parse(raw: string): IAPMessage;
|
|
49
|
-
/**
|
|
50
|
-
* Serialize an IAP message to string
|
|
51
|
-
*/
|
|
52
|
-
static serialize(message: IAPMessage): string;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=iap.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"iap.d.ts","sourceRoot":"","sources":["../../../src/protocol/iap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAkB,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGzG,MAAM,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAElC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,UAAU;IAQ/D;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU;IAQ1D;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU;IAQ7D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU;IAQ9C;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAQnD;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;IAQhF;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,UAAU;IAexD;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAYrC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;CAG9C"}
|
package/dist/cjs/protocol/iap.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Inter-Agent Protocol (I.A.P.) v1.0
|
|
4
|
-
* Standardized communication layer for autonomous AI agents
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.IAPProtocol = void 0;
|
|
8
|
-
const index_1 = require("../types/index");
|
|
9
|
-
class IAPProtocol {
|
|
10
|
-
/**
|
|
11
|
-
* Create a handshake message
|
|
12
|
-
*/
|
|
13
|
-
static createHandshake(handshake) {
|
|
14
|
-
return {
|
|
15
|
-
type: index_1.IAPMessageType.HANDSHAKE,
|
|
16
|
-
payload: handshake,
|
|
17
|
-
timestamp: Date.now(),
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Create a task request message
|
|
22
|
-
*/
|
|
23
|
-
static createTaskRequest(request) {
|
|
24
|
-
return {
|
|
25
|
-
type: index_1.IAPMessageType.TASK_REQUEST,
|
|
26
|
-
payload: request,
|
|
27
|
-
timestamp: Date.now(),
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Create a task response message
|
|
32
|
-
*/
|
|
33
|
-
static createTaskResponse(response) {
|
|
34
|
-
return {
|
|
35
|
-
type: index_1.IAPMessageType.TASK_RESPONSE,
|
|
36
|
-
payload: response,
|
|
37
|
-
timestamp: Date.now(),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Create a task bid message
|
|
42
|
-
*/
|
|
43
|
-
static createTaskBid(bid) {
|
|
44
|
-
return {
|
|
45
|
-
type: index_1.IAPMessageType.TASK_ASSIGN,
|
|
46
|
-
payload: bid,
|
|
47
|
-
timestamp: Date.now(),
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Create a heartbeat message
|
|
52
|
-
*/
|
|
53
|
-
static createHeartbeat(agentId) {
|
|
54
|
-
return {
|
|
55
|
-
type: index_1.IAPMessageType.HEARTBEAT,
|
|
56
|
-
payload: { agentId },
|
|
57
|
-
timestamp: Date.now(),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Create an error message
|
|
62
|
-
*/
|
|
63
|
-
static createError(error, details) {
|
|
64
|
-
return {
|
|
65
|
-
type: index_1.IAPMessageType.ERROR,
|
|
66
|
-
payload: { error, ...details },
|
|
67
|
-
timestamp: Date.now(),
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Validate an IAP message
|
|
72
|
-
*/
|
|
73
|
-
static validate(message) {
|
|
74
|
-
if (typeof message !== 'object' || message === null) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
const msg = message;
|
|
78
|
-
if (!msg.type || !msg.payload || !msg.timestamp) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
// Check if type is a valid IAPMessageType enum value
|
|
82
|
-
return Object.values(index_1.IAPMessageType).includes(msg.type);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Parse a raw message string into an IAP message
|
|
86
|
-
*/
|
|
87
|
-
static parse(raw) {
|
|
88
|
-
try {
|
|
89
|
-
const parsed = JSON.parse(raw);
|
|
90
|
-
if (!this.validate(parsed)) {
|
|
91
|
-
throw new Error('Invalid IAP message format');
|
|
92
|
-
}
|
|
93
|
-
return parsed;
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
throw new Error(`Failed to parse IAP message: ${error}`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Serialize an IAP message to string
|
|
101
|
-
*/
|
|
102
|
-
static serialize(message) {
|
|
103
|
-
return JSON.stringify(message);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
exports.IAPProtocol = IAPProtocol;
|
|
107
|
-
IAPProtocol.VERSION = '1.0.0';
|
|
108
|
-
//# sourceMappingURL=iap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"iap.js","sourceRoot":"","sources":["../../../src/protocol/iap.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,0CAAyG;AAczG,MAAa,WAAW;IAGtB;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,SAA2B;QAChD,OAAO;YACL,IAAI,EAAE,sBAAc,CAAC,SAAS;YAC9B,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAoB;QAC3C,OAAO;YACL,IAAI,EAAE,sBAAc,CAAC,YAAY;YACjC,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAsB;QAC9C,OAAO;YACL,IAAI,EAAE,sBAAc,CAAC,aAAa;YAClC,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAY;QAC/B,OAAO;YACL,IAAI,EAAE,sBAAc,CAAC,WAAW;YAChC,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAe;QACpC,OAAO;YACL,IAAI,EAAE,sBAAc,CAAC,SAAS;YAC9B,OAAO,EAAE,EAAE,OAAO,EAAE;YACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa,EAAE,OAAiC;QACjE,OAAO;YACL,IAAI,EAAE,sBAAc,CAAC,KAAK;YAC1B,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE;YAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,GAAG,OAA8B,CAAC;QAE3C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qDAAqD;QACrD,OAAO,MAAM,CAAC,MAAM,CAAC,sBAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAsB,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAmB;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;;AA3GH,kCA4GC;AA3GiB,mBAAO,GAAG,OAAO,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Semantic cache using ChromaDB for vector storage
|
|
3
|
-
*/
|
|
4
|
-
import { TaskRequest, TaskResponse, SemanticCacheEntry } from '../types/index.js';
|
|
5
|
-
import { EmbeddingService } from './embeddings.js';
|
|
6
|
-
export declare class SemanticCache {
|
|
7
|
-
private client;
|
|
8
|
-
private collection;
|
|
9
|
-
private collectionName;
|
|
10
|
-
private embeddingService;
|
|
11
|
-
private similarityThreshold;
|
|
12
|
-
constructor(host: string, port: number, collectionName: string, embeddingService: EmbeddingService, similarityThreshold?: number);
|
|
13
|
-
/**
|
|
14
|
-
* Initialize the ChromaDB collection
|
|
15
|
-
*/
|
|
16
|
-
initialize(): Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* Search for similar cached tasks
|
|
19
|
-
*/
|
|
20
|
-
search(taskRequest: TaskRequest): Promise<SemanticCacheEntry | null>;
|
|
21
|
-
/**
|
|
22
|
-
* Store a new task-response pair in the cache
|
|
23
|
-
*/
|
|
24
|
-
store(taskRequest: TaskRequest, taskResponse: TaskResponse): Promise<void>;
|
|
25
|
-
/**
|
|
26
|
-
* Update access count for a cache entry
|
|
27
|
-
*/
|
|
28
|
-
private updateAccessCount;
|
|
29
|
-
/**
|
|
30
|
-
* Clear old cache entries (TTL cleanup)
|
|
31
|
-
*/
|
|
32
|
-
cleanup(ttl: number): Promise<void>;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/subconscious/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,mBAAmB,CAAS;gBAGlC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,GAAE,MAAa;IAQpC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAsD1E;;OAEG;IACG,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BhF;;OAEG;YACW,iBAAiB;IAmB/B;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwB1C"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Semantic cache using ChromaDB for vector storage
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SemanticCache = void 0;
|
|
7
|
-
const chromadb_1 = require("chromadb");
|
|
8
|
-
const embeddings_js_1 = require("./embeddings.js");
|
|
9
|
-
class SemanticCache {
|
|
10
|
-
constructor(host, port, collectionName, embeddingService, similarityThreshold = 0.95) {
|
|
11
|
-
this.collection = null;
|
|
12
|
-
this.client = new chromadb_1.ChromaClient({ path: `http://${host}:${port}` });
|
|
13
|
-
this.collectionName = collectionName;
|
|
14
|
-
this.embeddingService = embeddingService;
|
|
15
|
-
this.similarityThreshold = similarityThreshold;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Initialize the ChromaDB collection
|
|
19
|
-
*/
|
|
20
|
-
async initialize() {
|
|
21
|
-
try {
|
|
22
|
-
this.collection = await this.client.getOrCreateCollection({
|
|
23
|
-
name: this.collectionName,
|
|
24
|
-
metadata: { description: 'Subconscious Router semantic cache' },
|
|
25
|
-
});
|
|
26
|
-
console.log(`✓ Semantic cache initialized: ${this.collectionName}`);
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
console.error('Failed to initialize semantic cache:', error);
|
|
30
|
-
throw error;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Search for similar cached tasks
|
|
35
|
-
*/
|
|
36
|
-
async search(taskRequest) {
|
|
37
|
-
if (!this.collection) {
|
|
38
|
-
throw new Error('Cache not initialized');
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
// Generate embedding for the incoming task
|
|
42
|
-
const taskText = embeddings_js_1.EmbeddingService.serializeTask(taskRequest);
|
|
43
|
-
const queryEmbedding = await this.embeddingService.generateEmbedding(taskText);
|
|
44
|
-
// Query ChromaDB for similar entries
|
|
45
|
-
const results = await this.collection.query({
|
|
46
|
-
queryEmbeddings: [queryEmbedding],
|
|
47
|
-
nResults: 1,
|
|
48
|
-
});
|
|
49
|
-
// Check if we have results and if similarity exceeds threshold
|
|
50
|
-
if (results.ids[0].length === 0) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
const similarity = 1 - (results.distances?.[0]?.[0] ?? 1);
|
|
54
|
-
if (similarity < this.similarityThreshold) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
// Retrieve the cached entry
|
|
58
|
-
const metadata = results.metadatas[0][0];
|
|
59
|
-
const document = results.documents[0][0];
|
|
60
|
-
if (!metadata || !document) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
const cacheEntry = {
|
|
64
|
-
id: results.ids[0][0],
|
|
65
|
-
taskRequest: JSON.parse(metadata.taskRequest),
|
|
66
|
-
taskResponse: JSON.parse(metadata.taskResponse),
|
|
67
|
-
embedding: queryEmbedding,
|
|
68
|
-
timestamp: metadata.timestamp,
|
|
69
|
-
accessCount: metadata.accessCount + 1,
|
|
70
|
-
};
|
|
71
|
-
// Update access count
|
|
72
|
-
await this.updateAccessCount(cacheEntry.id, cacheEntry.accessCount);
|
|
73
|
-
return cacheEntry;
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
console.error('Cache search failed:', error);
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Store a new task-response pair in the cache
|
|
82
|
-
*/
|
|
83
|
-
async store(taskRequest, taskResponse) {
|
|
84
|
-
if (!this.collection) {
|
|
85
|
-
throw new Error('Cache not initialized');
|
|
86
|
-
}
|
|
87
|
-
try {
|
|
88
|
-
const taskText = embeddings_js_1.EmbeddingService.serializeTask(taskRequest);
|
|
89
|
-
const embedding = await this.embeddingService.generateEmbedding(taskText);
|
|
90
|
-
const id = `cache_${taskRequest.taskId}_${Date.now()}`;
|
|
91
|
-
await this.collection.add({
|
|
92
|
-
ids: [id],
|
|
93
|
-
embeddings: [embedding],
|
|
94
|
-
documents: [taskText],
|
|
95
|
-
metadatas: [{
|
|
96
|
-
taskRequest: JSON.stringify(taskRequest),
|
|
97
|
-
taskResponse: JSON.stringify(taskResponse),
|
|
98
|
-
timestamp: Date.now(),
|
|
99
|
-
accessCount: 0,
|
|
100
|
-
}],
|
|
101
|
-
});
|
|
102
|
-
console.log(`✓ Cached task ${taskRequest.taskId} with similarity indexing`);
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
console.error('Failed to store in cache:', error);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Update access count for a cache entry
|
|
110
|
-
*/
|
|
111
|
-
async updateAccessCount(id, newCount) {
|
|
112
|
-
if (!this.collection)
|
|
113
|
-
return;
|
|
114
|
-
try {
|
|
115
|
-
const result = await this.collection.get({ ids: [id] });
|
|
116
|
-
if (result.metadatas[0]) {
|
|
117
|
-
const metadata = result.metadatas[0];
|
|
118
|
-
metadata.accessCount = newCount;
|
|
119
|
-
await this.collection.update({
|
|
120
|
-
ids: [id],
|
|
121
|
-
metadatas: [metadata],
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
console.error('Failed to update access count:', error);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Clear old cache entries (TTL cleanup)
|
|
131
|
-
*/
|
|
132
|
-
async cleanup(ttl) {
|
|
133
|
-
if (!this.collection)
|
|
134
|
-
return;
|
|
135
|
-
try {
|
|
136
|
-
const now = Date.now();
|
|
137
|
-
const cutoff = now - ttl * 1000;
|
|
138
|
-
const allEntries = await this.collection.get();
|
|
139
|
-
const idsToDelete = [];
|
|
140
|
-
allEntries.metadatas.forEach((metadata, index) => {
|
|
141
|
-
if (metadata && metadata.timestamp < cutoff) {
|
|
142
|
-
idsToDelete.push(allEntries.ids[index]);
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
if (idsToDelete.length > 0) {
|
|
146
|
-
await this.collection.delete({ ids: idsToDelete });
|
|
147
|
-
console.log(`✓ Cleaned up ${idsToDelete.length} expired cache entries`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
console.error('Cache cleanup failed:', error);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
exports.SemanticCache = SemanticCache;
|
|
156
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/subconscious/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding service using Ollama for semantic vectorization
|
|
3
|
-
*/
|
|
4
|
-
export declare class EmbeddingService {
|
|
5
|
-
private baseUrl;
|
|
6
|
-
private model;
|
|
7
|
-
constructor(baseUrl: string, model: string);
|
|
8
|
-
/**
|
|
9
|
-
* Generate embeddings for a given text using Ollama
|
|
10
|
-
*/
|
|
11
|
-
generateEmbedding(text: string): Promise<number[]>;
|
|
12
|
-
/**
|
|
13
|
-
* Calculate cosine similarity between two vectors
|
|
14
|
-
*/
|
|
15
|
-
static cosineSimilarity(vecA: number[], vecB: number[]): number;
|
|
16
|
-
/**
|
|
17
|
-
* Serialize a task request into a searchable string
|
|
18
|
-
*/
|
|
19
|
-
static serializeTask(task: Record<string, unknown> | {
|
|
20
|
-
taskType: string;
|
|
21
|
-
payload?: any;
|
|
22
|
-
context?: any;
|
|
23
|
-
}): string;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/subconscious/embeddings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK1C;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAwB/D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,MAAM;CAOjH"}
|