@qwickapps/qwickbrain-proxy 1.0.2 → 1.0.3
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/.claude/engineering/bugs/BUG-qwickbrain-proxy-cache-and-design.md +840 -0
- package/.github/workflows/publish.yml +13 -0
- package/CHANGELOG.md +17 -0
- package/dist/db/schema.d.ts +63 -6
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +17 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/lib/__tests__/cache-manager.test.js +146 -83
- package/dist/lib/__tests__/cache-manager.test.js.map +1 -1
- package/dist/lib/__tests__/proxy-server.test.js +16 -44
- package/dist/lib/__tests__/proxy-server.test.js.map +1 -1
- package/dist/lib/__tests__/sse-invalidation-listener.test.d.ts +2 -0
- package/dist/lib/__tests__/sse-invalidation-listener.test.d.ts.map +1 -0
- package/dist/lib/__tests__/sse-invalidation-listener.test.js +245 -0
- package/dist/lib/__tests__/sse-invalidation-listener.test.js.map +1 -0
- package/dist/lib/__tests__/write-queue-manager.test.d.ts +2 -0
- package/dist/lib/__tests__/write-queue-manager.test.d.ts.map +1 -0
- package/dist/lib/__tests__/write-queue-manager.test.js +291 -0
- package/dist/lib/__tests__/write-queue-manager.test.js.map +1 -0
- package/dist/lib/cache-manager.d.ts +35 -6
- package/dist/lib/cache-manager.d.ts.map +1 -1
- package/dist/lib/cache-manager.js +154 -41
- package/dist/lib/cache-manager.js.map +1 -1
- package/dist/lib/proxy-server.d.ts +5 -0
- package/dist/lib/proxy-server.d.ts.map +1 -1
- package/dist/lib/proxy-server.js +150 -84
- package/dist/lib/proxy-server.js.map +1 -1
- package/dist/lib/qwickbrain-client.d.ts +4 -0
- package/dist/lib/qwickbrain-client.d.ts.map +1 -1
- package/dist/lib/qwickbrain-client.js +131 -2
- package/dist/lib/qwickbrain-client.js.map +1 -1
- package/dist/lib/sse-invalidation-listener.d.ts +27 -0
- package/dist/lib/sse-invalidation-listener.d.ts.map +1 -0
- package/dist/lib/sse-invalidation-listener.js +145 -0
- package/dist/lib/sse-invalidation-listener.js.map +1 -0
- package/dist/lib/tools.d.ts +21 -0
- package/dist/lib/tools.d.ts.map +1 -0
- package/dist/lib/tools.js +488 -0
- package/dist/lib/tools.js.map +1 -0
- package/dist/lib/write-queue-manager.d.ts +88 -0
- package/dist/lib/write-queue-manager.d.ts.map +1 -0
- package/dist/lib/write-queue-manager.js +191 -0
- package/dist/lib/write-queue-manager.js.map +1 -0
- package/dist/types/config.d.ts +7 -42
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +1 -6
- package/dist/types/config.js.map +1 -1
- package/drizzle/0002_lru_cache_migration.sql +94 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +6 -2
- package/scripts/rebuild-sqlite.sh +26 -0
- package/src/db/schema.ts +17 -2
- package/src/lib/__tests__/cache-manager.test.ts +180 -90
- package/src/lib/__tests__/proxy-server.test.ts +16 -51
- package/src/lib/__tests__/sse-invalidation-listener.test.ts +326 -0
- package/src/lib/__tests__/write-queue-manager.test.ts +383 -0
- package/src/lib/cache-manager.ts +198 -46
- package/src/lib/proxy-server.ts +190 -86
- package/src/lib/qwickbrain-client.ts +142 -2
- package/src/lib/sse-invalidation-listener.ts +171 -0
- package/src/lib/tools.ts +500 -0
- package/src/lib/write-queue-manager.ts +271 -0
- package/src/types/config.ts +1 -6
|
@@ -3,22 +3,51 @@ import type { Config } from '../types/config.js';
|
|
|
3
3
|
interface CachedItem<T> {
|
|
4
4
|
data: T;
|
|
5
5
|
cachedAt: Date;
|
|
6
|
-
expiresAt: Date;
|
|
7
6
|
age: number;
|
|
8
|
-
isExpired: boolean;
|
|
9
7
|
}
|
|
10
8
|
export declare class CacheManager {
|
|
11
9
|
private db;
|
|
12
10
|
private config;
|
|
11
|
+
private maxDynamicCacheSize;
|
|
13
12
|
constructor(db: DB, config: Config['cache']);
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Get current size of dynamic tier cache (excludes critical tier)
|
|
15
|
+
*/
|
|
16
|
+
private getDynamicCacheSize;
|
|
17
|
+
/**
|
|
18
|
+
* Evict LRU entries from dynamic tier to free up space
|
|
19
|
+
* NEVER touches critical tier
|
|
20
|
+
*/
|
|
21
|
+
private evictLRU;
|
|
22
|
+
/**
|
|
23
|
+
* Ensure sufficient cache space
|
|
24
|
+
* Critical items bypass this check
|
|
25
|
+
*/
|
|
26
|
+
private ensureCacheSize;
|
|
15
27
|
getDocument(docType: string, name: string, project?: string): Promise<CachedItem<any> | null>;
|
|
16
28
|
setDocument(docType: string, name: string, content: string, project?: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
17
29
|
getMemory(name: string, project?: string): Promise<CachedItem<any> | null>;
|
|
18
30
|
setMemory(name: string, content: string, project?: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Invalidate a document from cache (for SSE-based cache invalidation)
|
|
33
|
+
*/
|
|
34
|
+
invalidateDocument(docType: string, name: string, project?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Invalidate a memory from cache (for SSE-based cache invalidation)
|
|
37
|
+
*/
|
|
38
|
+
invalidateMemory(name: string, project?: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Get cache statistics
|
|
41
|
+
*/
|
|
42
|
+
getCacheStats(): Promise<{
|
|
43
|
+
criticalSize: number;
|
|
44
|
+
criticalCount: number;
|
|
45
|
+
dynamicSize: number;
|
|
46
|
+
dynamicCount: number;
|
|
47
|
+
totalSize: number;
|
|
48
|
+
totalCount: number;
|
|
49
|
+
memorySize: number;
|
|
50
|
+
memoryCount: number;
|
|
22
51
|
}>;
|
|
23
52
|
}
|
|
24
53
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/lib/cache-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/lib/cache-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKjD,UAAU,UAAU,CAAC,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,IAAI,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,YAAY;IAIrB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,mBAAmB,CAAS;gBAG1B,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;IAMjC;;OAEG;YACW,mBAAmB;IASjC;;;OAGG;YACW,QAAQ;IAuCtB;;;OAGG;YACW,eAAe;IAkBvB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAwC7F,WAAW,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAmCV,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAsC1E,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAgChB;;OAEG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxF;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CA6CH"}
|
|
@@ -1,19 +1,82 @@
|
|
|
1
|
-
import { eq, and,
|
|
1
|
+
import { eq, and, sql } from 'drizzle-orm';
|
|
2
2
|
import { documents, memories } from '../db/schema.js';
|
|
3
|
+
// Critical document types - never evicted, not counted toward storage limit
|
|
4
|
+
const CRITICAL_DOC_TYPES = ['workflow', 'rule', 'agent', 'template'];
|
|
3
5
|
export class CacheManager {
|
|
4
6
|
db;
|
|
5
7
|
config;
|
|
8
|
+
maxDynamicCacheSize; // Storage limit for dynamic tier only (bytes)
|
|
6
9
|
constructor(db, config) {
|
|
7
10
|
this.db = db;
|
|
8
11
|
this.config = config;
|
|
12
|
+
// Default to 100MB if not configured
|
|
13
|
+
this.maxDynamicCacheSize = config.maxCacheSizeBytes || 100 * 1024 * 1024;
|
|
9
14
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Get current size of dynamic tier cache (excludes critical tier)
|
|
17
|
+
*/
|
|
18
|
+
async getDynamicCacheSize() {
|
|
19
|
+
const result = await this.db
|
|
20
|
+
.select({ total: sql `COALESCE(sum(${documents.sizeBytes}), 0) + COALESCE((SELECT sum(${memories.sizeBytes}) FROM ${memories}), 0)` })
|
|
21
|
+
.from(documents)
|
|
22
|
+
.where(eq(documents.isCritical, false));
|
|
23
|
+
return result[0]?.total || 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Evict LRU entries from dynamic tier to free up space
|
|
27
|
+
* NEVER touches critical tier
|
|
28
|
+
*/
|
|
29
|
+
async evictLRU(bytesToFree) {
|
|
30
|
+
let freed = 0;
|
|
31
|
+
// Evict from documents (dynamic tier only)
|
|
32
|
+
const docCandidates = await this.db
|
|
33
|
+
.select()
|
|
34
|
+
.from(documents)
|
|
35
|
+
.where(eq(documents.isCritical, false))
|
|
36
|
+
.orderBy(documents.lastAccessedAt) // ASC = oldest first
|
|
37
|
+
.limit(100);
|
|
38
|
+
for (const doc of docCandidates) {
|
|
39
|
+
if (freed >= bytesToFree)
|
|
40
|
+
break;
|
|
41
|
+
await this.db.delete(documents).where(eq(documents.id, doc.id));
|
|
42
|
+
freed += doc.sizeBytes;
|
|
43
|
+
console.error(`LRU evicted document: ${doc.docType}:${doc.name} (${doc.sizeBytes} bytes)`);
|
|
44
|
+
}
|
|
45
|
+
// Evict from memories if needed
|
|
46
|
+
if (freed < bytesToFree) {
|
|
47
|
+
const memCandidates = await this.db
|
|
48
|
+
.select()
|
|
49
|
+
.from(memories)
|
|
50
|
+
.orderBy(memories.lastAccessedAt) // ASC = oldest first
|
|
51
|
+
.limit(100);
|
|
52
|
+
for (const mem of memCandidates) {
|
|
53
|
+
if (freed >= bytesToFree)
|
|
54
|
+
break;
|
|
55
|
+
await this.db.delete(memories).where(eq(memories.id, mem.id));
|
|
56
|
+
freed += mem.sizeBytes;
|
|
57
|
+
console.error(`LRU evicted memory: ${mem.name} (${mem.sizeBytes} bytes)`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
console.error(`LRU eviction complete: freed ${freed} bytes`);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Ensure sufficient cache space
|
|
64
|
+
* Critical items bypass this check
|
|
65
|
+
*/
|
|
66
|
+
async ensureCacheSize(requiredBytes, isCritical) {
|
|
67
|
+
// Critical files bypass storage limit check
|
|
68
|
+
if (isCritical) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Only count dynamic tier toward storage limit
|
|
72
|
+
const currentSize = await this.getDynamicCacheSize();
|
|
73
|
+
if (currentSize + requiredBytes <= this.maxDynamicCacheSize) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Evict LRU entries from dynamic tier only
|
|
77
|
+
const toEvict = currentSize + requiredBytes - this.maxDynamicCacheSize;
|
|
78
|
+
console.error(`Cache size limit reached: ${currentSize} + ${requiredBytes} > ${this.maxDynamicCacheSize}, evicting ${toEvict} bytes`);
|
|
79
|
+
await this.evictLRU(toEvict);
|
|
17
80
|
}
|
|
18
81
|
async getDocument(docType, name, project) {
|
|
19
82
|
const projectValue = project || '';
|
|
@@ -25,10 +88,12 @@ export class CacheManager {
|
|
|
25
88
|
if (!cached) {
|
|
26
89
|
return null;
|
|
27
90
|
}
|
|
91
|
+
// Update last accessed timestamp for LRU tracking
|
|
28
92
|
const now = new Date();
|
|
93
|
+
await this.db.update(documents)
|
|
94
|
+
.set({ lastAccessedAt: now })
|
|
95
|
+
.where(eq(documents.id, cached.id));
|
|
29
96
|
const age = Math.floor((now.getTime() - cached.cachedAt.getTime()) / 1000);
|
|
30
|
-
// Fix: Compare timestamp values explicitly to avoid Date comparison issues
|
|
31
|
-
const isExpired = now.getTime() > cached.expiresAt.getTime();
|
|
32
97
|
return {
|
|
33
98
|
data: {
|
|
34
99
|
name: cached.name,
|
|
@@ -38,18 +103,16 @@ export class CacheManager {
|
|
|
38
103
|
metadata: cached.metadata ? JSON.parse(cached.metadata) : {},
|
|
39
104
|
},
|
|
40
105
|
cachedAt: cached.cachedAt,
|
|
41
|
-
expiresAt: cached.expiresAt,
|
|
42
106
|
age,
|
|
43
|
-
isExpired,
|
|
44
107
|
};
|
|
45
108
|
}
|
|
46
109
|
async setDocument(docType, name, content, project, metadata) {
|
|
47
110
|
const now = new Date();
|
|
48
|
-
const ttl = this.getTTL('get_document');
|
|
49
|
-
const expiresAt = new Date(now.getTime() + ttl * 1000);
|
|
50
|
-
// Use empty string instead of null for project to make unique constraint work
|
|
51
|
-
// SQLite treats NULL as distinct values in unique constraints
|
|
52
111
|
const projectValue = project || '';
|
|
112
|
+
const isCritical = CRITICAL_DOC_TYPES.includes(docType);
|
|
113
|
+
const sizeBytes = Buffer.byteLength(content, 'utf8');
|
|
114
|
+
// Ensure space available (skips check if critical)
|
|
115
|
+
await this.ensureCacheSize(sizeBytes, isCritical);
|
|
53
116
|
await this.db
|
|
54
117
|
.insert(documents)
|
|
55
118
|
.values({
|
|
@@ -59,7 +122,9 @@ export class CacheManager {
|
|
|
59
122
|
content,
|
|
60
123
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
61
124
|
cachedAt: now,
|
|
62
|
-
|
|
125
|
+
lastAccessedAt: now,
|
|
126
|
+
isCritical,
|
|
127
|
+
sizeBytes,
|
|
63
128
|
synced: true,
|
|
64
129
|
})
|
|
65
130
|
.onConflictDoUpdate({
|
|
@@ -67,8 +132,8 @@ export class CacheManager {
|
|
|
67
132
|
set: {
|
|
68
133
|
content,
|
|
69
134
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
70
|
-
|
|
71
|
-
|
|
135
|
+
lastAccessedAt: now,
|
|
136
|
+
sizeBytes,
|
|
72
137
|
synced: true,
|
|
73
138
|
},
|
|
74
139
|
});
|
|
@@ -83,10 +148,12 @@ export class CacheManager {
|
|
|
83
148
|
if (!cached) {
|
|
84
149
|
return null;
|
|
85
150
|
}
|
|
151
|
+
// Update last accessed timestamp for LRU tracking
|
|
86
152
|
const now = new Date();
|
|
153
|
+
await this.db.update(memories)
|
|
154
|
+
.set({ lastAccessedAt: now })
|
|
155
|
+
.where(eq(memories.id, cached.id));
|
|
87
156
|
const age = Math.floor((now.getTime() - cached.cachedAt.getTime()) / 1000);
|
|
88
|
-
// Fix: Compare timestamp values explicitly to avoid Date comparison issues
|
|
89
|
-
const isExpired = now.getTime() > cached.expiresAt.getTime();
|
|
90
157
|
return {
|
|
91
158
|
data: {
|
|
92
159
|
name: cached.name,
|
|
@@ -95,17 +162,15 @@ export class CacheManager {
|
|
|
95
162
|
metadata: cached.metadata ? JSON.parse(cached.metadata) : {},
|
|
96
163
|
},
|
|
97
164
|
cachedAt: cached.cachedAt,
|
|
98
|
-
expiresAt: cached.expiresAt,
|
|
99
165
|
age,
|
|
100
|
-
isExpired,
|
|
101
166
|
};
|
|
102
167
|
}
|
|
103
168
|
async setMemory(name, content, project, metadata) {
|
|
104
169
|
const now = new Date();
|
|
105
|
-
const ttl = this.getTTL('get_memory');
|
|
106
|
-
const expiresAt = new Date(now.getTime() + ttl * 1000);
|
|
107
|
-
// Use empty string instead of null for project to make unique constraint work
|
|
108
170
|
const projectValue = project || '';
|
|
171
|
+
const sizeBytes = Buffer.byteLength(content, 'utf8');
|
|
172
|
+
// Memories are always dynamic tier (not critical)
|
|
173
|
+
await this.ensureCacheSize(sizeBytes, false);
|
|
109
174
|
await this.db
|
|
110
175
|
.insert(memories)
|
|
111
176
|
.values({
|
|
@@ -114,7 +179,8 @@ export class CacheManager {
|
|
|
114
179
|
content,
|
|
115
180
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
116
181
|
cachedAt: now,
|
|
117
|
-
|
|
182
|
+
lastAccessedAt: now,
|
|
183
|
+
sizeBytes,
|
|
118
184
|
synced: true,
|
|
119
185
|
})
|
|
120
186
|
.onConflictDoUpdate({
|
|
@@ -122,27 +188,74 @@ export class CacheManager {
|
|
|
122
188
|
set: {
|
|
123
189
|
content,
|
|
124
190
|
metadata: metadata ? JSON.stringify(metadata) : null,
|
|
125
|
-
|
|
126
|
-
|
|
191
|
+
lastAccessedAt: now,
|
|
192
|
+
sizeBytes,
|
|
127
193
|
synced: true,
|
|
128
194
|
},
|
|
129
195
|
});
|
|
130
196
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Invalidate a document from cache (for SSE-based cache invalidation)
|
|
199
|
+
*/
|
|
200
|
+
async invalidateDocument(docType, name, project) {
|
|
201
|
+
const projectValue = project || '';
|
|
202
|
+
await this.db
|
|
135
203
|
.delete(documents)
|
|
136
|
-
.where(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
204
|
+
.where(and(eq(documents.docType, docType), eq(documents.name, name), eq(documents.project, projectValue)));
|
|
205
|
+
console.error(`Cache invalidated: ${docType}:${name}`);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Invalidate a memory from cache (for SSE-based cache invalidation)
|
|
209
|
+
*/
|
|
210
|
+
async invalidateMemory(name, project) {
|
|
211
|
+
const projectValue = project || '';
|
|
212
|
+
await this.db
|
|
140
213
|
.delete(memories)
|
|
141
|
-
.where(
|
|
142
|
-
|
|
214
|
+
.where(and(eq(memories.name, name), eq(memories.project, projectValue)));
|
|
215
|
+
console.error(`Cache invalidated: memory:${name}`);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get cache statistics
|
|
219
|
+
*/
|
|
220
|
+
async getCacheStats() {
|
|
221
|
+
// Critical documents
|
|
222
|
+
const criticalResult = await this.db
|
|
223
|
+
.select({
|
|
224
|
+
size: sql `COALESCE(sum(${documents.sizeBytes}), 0)`,
|
|
225
|
+
count: sql `count(*)`
|
|
226
|
+
})
|
|
227
|
+
.from(documents)
|
|
228
|
+
.where(eq(documents.isCritical, true));
|
|
229
|
+
// Dynamic documents
|
|
230
|
+
const dynamicResult = await this.db
|
|
231
|
+
.select({
|
|
232
|
+
size: sql `COALESCE(sum(${documents.sizeBytes}), 0)`,
|
|
233
|
+
count: sql `count(*)`
|
|
234
|
+
})
|
|
235
|
+
.from(documents)
|
|
236
|
+
.where(eq(documents.isCritical, false));
|
|
237
|
+
// Memories
|
|
238
|
+
const memoryResult = await this.db
|
|
239
|
+
.select({
|
|
240
|
+
size: sql `COALESCE(sum(${memories.sizeBytes}), 0)`,
|
|
241
|
+
count: sql `count(*)`
|
|
242
|
+
})
|
|
243
|
+
.from(memories);
|
|
244
|
+
const criticalSize = criticalResult[0]?.size || 0;
|
|
245
|
+
const criticalCount = criticalResult[0]?.count || 0;
|
|
246
|
+
const dynamicSize = dynamicResult[0]?.size || 0;
|
|
247
|
+
const dynamicCount = dynamicResult[0]?.count || 0;
|
|
248
|
+
const memorySize = memoryResult[0]?.size || 0;
|
|
249
|
+
const memoryCount = memoryResult[0]?.count || 0;
|
|
143
250
|
return {
|
|
144
|
-
|
|
145
|
-
|
|
251
|
+
criticalSize,
|
|
252
|
+
criticalCount,
|
|
253
|
+
dynamicSize: dynamicSize + memorySize,
|
|
254
|
+
dynamicCount: dynamicCount + memoryCount,
|
|
255
|
+
totalSize: criticalSize + dynamicSize + memorySize,
|
|
256
|
+
totalCount: criticalCount + dynamicCount + memoryCount,
|
|
257
|
+
memorySize,
|
|
258
|
+
memoryCount,
|
|
146
259
|
};
|
|
147
260
|
}
|
|
148
261
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/lib/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/lib/cache-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,15 +5,20 @@ export declare class ProxyServer {
|
|
|
5
5
|
private connectionManager;
|
|
6
6
|
private cacheManager;
|
|
7
7
|
private qwickbrainClient;
|
|
8
|
+
private writeQueueManager;
|
|
9
|
+
private sseInvalidationListener;
|
|
8
10
|
private config;
|
|
9
11
|
constructor(db: DB, config: Config);
|
|
10
12
|
private setupConnectionListeners;
|
|
11
13
|
private onConnectionRestored;
|
|
14
|
+
private syncWriteQueue;
|
|
12
15
|
private setupHandlers;
|
|
13
16
|
private createMetadata;
|
|
14
17
|
private handleGetWorkflow;
|
|
15
18
|
private handleGetDocument;
|
|
16
19
|
private handleGetMemory;
|
|
20
|
+
private handleCreateDocument;
|
|
21
|
+
private handleSetMemory;
|
|
17
22
|
private handleGenericTool;
|
|
18
23
|
start(): Promise<void>;
|
|
19
24
|
stop(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../src/lib/proxy-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../src/lib/proxy-server.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAI1C,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,uBAAuB,CAAwC;IACvE,OAAO,CAAC,MAAM,CAAS;gBAEX,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM;IAqClC,OAAO,CAAC,wBAAwB;YA0BlB,oBAAoB;YAsBpB,cAAc;IAW5B,OAAO,CAAC,aAAa;IAkHrB,OAAO,CAAC,cAAc;YAQR,iBAAiB;YAIjB,iBAAiB;YAwDjB,eAAe;YAyCf,oBAAoB;YA6CpB,eAAe;YA2Cf,iBAAiB;IAmDzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
|