@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.
Files changed (63) hide show
  1. package/.claude/engineering/bugs/BUG-qwickbrain-proxy-cache-and-design.md +840 -0
  2. package/.github/workflows/publish.yml +13 -0
  3. package/CHANGELOG.md +17 -0
  4. package/dist/db/schema.d.ts +63 -6
  5. package/dist/db/schema.d.ts.map +1 -1
  6. package/dist/db/schema.js +17 -2
  7. package/dist/db/schema.js.map +1 -1
  8. package/dist/lib/__tests__/cache-manager.test.js +146 -83
  9. package/dist/lib/__tests__/cache-manager.test.js.map +1 -1
  10. package/dist/lib/__tests__/proxy-server.test.js +16 -44
  11. package/dist/lib/__tests__/proxy-server.test.js.map +1 -1
  12. package/dist/lib/__tests__/sse-invalidation-listener.test.d.ts +2 -0
  13. package/dist/lib/__tests__/sse-invalidation-listener.test.d.ts.map +1 -0
  14. package/dist/lib/__tests__/sse-invalidation-listener.test.js +245 -0
  15. package/dist/lib/__tests__/sse-invalidation-listener.test.js.map +1 -0
  16. package/dist/lib/__tests__/write-queue-manager.test.d.ts +2 -0
  17. package/dist/lib/__tests__/write-queue-manager.test.d.ts.map +1 -0
  18. package/dist/lib/__tests__/write-queue-manager.test.js +291 -0
  19. package/dist/lib/__tests__/write-queue-manager.test.js.map +1 -0
  20. package/dist/lib/cache-manager.d.ts +35 -6
  21. package/dist/lib/cache-manager.d.ts.map +1 -1
  22. package/dist/lib/cache-manager.js +154 -41
  23. package/dist/lib/cache-manager.js.map +1 -1
  24. package/dist/lib/proxy-server.d.ts +5 -0
  25. package/dist/lib/proxy-server.d.ts.map +1 -1
  26. package/dist/lib/proxy-server.js +150 -84
  27. package/dist/lib/proxy-server.js.map +1 -1
  28. package/dist/lib/qwickbrain-client.d.ts +4 -0
  29. package/dist/lib/qwickbrain-client.d.ts.map +1 -1
  30. package/dist/lib/qwickbrain-client.js +131 -2
  31. package/dist/lib/qwickbrain-client.js.map +1 -1
  32. package/dist/lib/sse-invalidation-listener.d.ts +27 -0
  33. package/dist/lib/sse-invalidation-listener.d.ts.map +1 -0
  34. package/dist/lib/sse-invalidation-listener.js +145 -0
  35. package/dist/lib/sse-invalidation-listener.js.map +1 -0
  36. package/dist/lib/tools.d.ts +21 -0
  37. package/dist/lib/tools.d.ts.map +1 -0
  38. package/dist/lib/tools.js +488 -0
  39. package/dist/lib/tools.js.map +1 -0
  40. package/dist/lib/write-queue-manager.d.ts +88 -0
  41. package/dist/lib/write-queue-manager.d.ts.map +1 -0
  42. package/dist/lib/write-queue-manager.js +191 -0
  43. package/dist/lib/write-queue-manager.js.map +1 -0
  44. package/dist/types/config.d.ts +7 -42
  45. package/dist/types/config.d.ts.map +1 -1
  46. package/dist/types/config.js +1 -6
  47. package/dist/types/config.js.map +1 -1
  48. package/drizzle/0002_lru_cache_migration.sql +94 -0
  49. package/drizzle/meta/_journal.json +7 -0
  50. package/package.json +6 -2
  51. package/scripts/rebuild-sqlite.sh +26 -0
  52. package/src/db/schema.ts +17 -2
  53. package/src/lib/__tests__/cache-manager.test.ts +180 -90
  54. package/src/lib/__tests__/proxy-server.test.ts +16 -51
  55. package/src/lib/__tests__/sse-invalidation-listener.test.ts +326 -0
  56. package/src/lib/__tests__/write-queue-manager.test.ts +383 -0
  57. package/src/lib/cache-manager.ts +198 -46
  58. package/src/lib/proxy-server.ts +190 -86
  59. package/src/lib/qwickbrain-client.ts +142 -2
  60. package/src/lib/sse-invalidation-listener.ts +171 -0
  61. package/src/lib/tools.ts +500 -0
  62. package/src/lib/write-queue-manager.ts +271 -0
  63. package/src/types/config.ts +1 -6
@@ -34,7 +34,20 @@ jobs:
34
34
  - name: Install dependencies
35
35
  run: npm install --legacy-peer-deps
36
36
 
37
+ - name: Check if build needed
38
+ id: check-build
39
+ run: |
40
+ # Check if pre-built dist artifacts exist
41
+ if [ -d "dist" ] || [ -d "dist-ui" ] || [ -d "dist-ui-lib" ]; then
42
+ echo "needs_build=false" >> $GITHUB_OUTPUT
43
+ echo "✓ Pre-built artifacts found, skipping build"
44
+ else
45
+ echo "needs_build=true" >> $GITHUB_OUTPUT
46
+ echo "→ No dist artifacts found, will build from source"
47
+ fi
48
+
37
49
  - name: Build
50
+ if: steps.check-build.outputs.needs_build == 'true'
38
51
  run: npm run build
39
52
 
40
53
  - name: Run validation
package/CHANGELOG.md CHANGED
@@ -5,6 +5,23 @@ All notable changes to the QwickBrain MCP Proxy will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.3] - 2026-01-09
9
+
10
+ ### Fixed
11
+
12
+ - **SSE Connection Initialization**: Health check now initializes SSE connection on first attempt
13
+ - Fixed issue where client remained null preventing connection establishment
14
+ - Connection now established during first health check if not already connected
15
+ - Enables dynamic tool forwarding from QwickBrain Python server
16
+
17
+ ### Added
18
+
19
+ - **Automated Native Module Rebuild**: Created rebuild script for better-sqlite3
20
+ - Added scripts/rebuild-sqlite.sh to automate native module compilation
21
+ - Added postinstall hook to rebuild better-sqlite3 after installation
22
+ - Handles Python 3.13+ distutils removal by installing setuptools
23
+ - Prevents deployment issues with missing native bindings
24
+
8
25
  ## [1.0.2] - 2026-01-08
9
26
 
10
27
  ### Fixed
@@ -1,5 +1,9 @@
1
1
  /**
2
2
  * Cached documents (workflows, rules, FRDs, designs, etc.)
3
+ *
4
+ * Two-tier storage:
5
+ * - Critical tier (isCritical=true): workflows, rules, agents, templates - never evicted, not counted toward limit
6
+ * - Dynamic tier (isCritical=false): other documents - LRU eviction when storage limit reached
3
7
  */
4
8
  export declare const documents: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
5
9
  name: "documents";
@@ -124,15 +128,49 @@ export declare const documents: import("drizzle-orm/sqlite-core").SQLiteTableWit
124
128
  identity: undefined;
125
129
  generated: undefined;
126
130
  }, object>;
127
- expiresAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
128
- name: "expires_at";
131
+ lastAccessedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
132
+ name: "last_accessed_at";
129
133
  tableName: "documents";
130
134
  dataType: "date";
131
135
  columnType: "SQLiteTimestamp";
132
136
  data: Date;
133
137
  driverParam: number;
134
138
  notNull: true;
135
- hasDefault: false;
139
+ hasDefault: true;
140
+ isPrimaryKey: false;
141
+ isAutoincrement: false;
142
+ hasRuntimeDefault: false;
143
+ enumValues: undefined;
144
+ baseColumn: never;
145
+ identity: undefined;
146
+ generated: undefined;
147
+ }, object>;
148
+ isCritical: import("drizzle-orm/sqlite-core").SQLiteColumn<{
149
+ name: "is_critical";
150
+ tableName: "documents";
151
+ dataType: "boolean";
152
+ columnType: "SQLiteBoolean";
153
+ data: boolean;
154
+ driverParam: number;
155
+ notNull: true;
156
+ hasDefault: true;
157
+ isPrimaryKey: false;
158
+ isAutoincrement: false;
159
+ hasRuntimeDefault: false;
160
+ enumValues: undefined;
161
+ baseColumn: never;
162
+ identity: undefined;
163
+ generated: undefined;
164
+ }, object>;
165
+ sizeBytes: import("drizzle-orm/sqlite-core").SQLiteColumn<{
166
+ name: "size_bytes";
167
+ tableName: "documents";
168
+ dataType: "number";
169
+ columnType: "SQLiteInteger";
170
+ data: number;
171
+ driverParam: number;
172
+ notNull: true;
173
+ hasDefault: true;
136
174
  isPrimaryKey: false;
137
175
  isAutoincrement: false;
138
176
  hasRuntimeDefault: false;
@@ -163,6 +201,8 @@ export declare const documents: import("drizzle-orm/sqlite-core").SQLiteTableWit
163
201
  }>;
164
202
  /**
165
203
  * Cached memories (project context, patterns, decisions)
204
+ *
205
+ * Memories are always dynamic tier - LRU eviction applies
166
206
  */
167
207
  export declare const memories: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
168
208
  name: "memories";
@@ -270,15 +310,32 @@ export declare const memories: import("drizzle-orm/sqlite-core").SQLiteTableWith
270
310
  identity: undefined;
271
311
  generated: undefined;
272
312
  }, object>;
273
- expiresAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
274
- name: "expires_at";
313
+ lastAccessedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
314
+ name: "last_accessed_at";
275
315
  tableName: "memories";
276
316
  dataType: "date";
277
317
  columnType: "SQLiteTimestamp";
278
318
  data: Date;
279
319
  driverParam: number;
280
320
  notNull: true;
281
- hasDefault: false;
321
+ hasDefault: true;
322
+ isPrimaryKey: false;
323
+ isAutoincrement: false;
324
+ hasRuntimeDefault: false;
325
+ enumValues: undefined;
326
+ baseColumn: never;
327
+ identity: undefined;
328
+ generated: undefined;
329
+ }, object>;
330
+ sizeBytes: import("drizzle-orm/sqlite-core").SQLiteColumn<{
331
+ name: "size_bytes";
332
+ tableName: "memories";
333
+ dataType: "number";
334
+ columnType: "SQLiteInteger";
335
+ data: number;
336
+ driverParam: number;
337
+ notNull: true;
338
+ hasDefault: true;
282
339
  isPrimaryKey: false;
283
340
  isAutoincrement: false;
284
341
  hasRuntimeDefault: false;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcnB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAalB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQxB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBnB,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBlB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQxB,CAAC"}
package/dist/db/schema.js CHANGED
@@ -2,6 +2,10 @@ import { sql } from 'drizzle-orm';
2
2
  import { integer, sqliteTable, text, unique } from 'drizzle-orm/sqlite-core';
3
3
  /**
4
4
  * Cached documents (workflows, rules, FRDs, designs, etc.)
5
+ *
6
+ * Two-tier storage:
7
+ * - Critical tier (isCritical=true): workflows, rules, agents, templates - never evicted, not counted toward limit
8
+ * - Dynamic tier (isCritical=false): other documents - LRU eviction when storage limit reached
5
9
  */
6
10
  export const documents = sqliteTable('documents', {
7
11
  id: integer('id').primaryKey({ autoIncrement: true }),
@@ -13,13 +17,21 @@ export const documents = sqliteTable('documents', {
13
17
  cachedAt: integer('cached_at', { mode: 'timestamp' })
14
18
  .notNull()
15
19
  .default(sql `(unixepoch())`),
16
- expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(),
20
+ lastAccessedAt: integer('last_accessed_at', { mode: 'timestamp' })
21
+ .notNull()
22
+ .default(sql `(unixepoch())`),
23
+ isCritical: integer('is_critical', { mode: 'boolean' })
24
+ .notNull()
25
+ .default(false),
26
+ sizeBytes: integer('size_bytes').notNull().default(0),
17
27
  synced: integer('synced', { mode: 'boolean' }).notNull().default(true),
18
28
  }, (table) => ({
19
29
  uniqueDocument: unique().on(table.docType, table.name, table.project),
20
30
  }));
21
31
  /**
22
32
  * Cached memories (project context, patterns, decisions)
33
+ *
34
+ * Memories are always dynamic tier - LRU eviction applies
23
35
  */
24
36
  export const memories = sqliteTable('memories', {
25
37
  id: integer('id').primaryKey({ autoIncrement: true }),
@@ -30,7 +42,10 @@ export const memories = sqliteTable('memories', {
30
42
  cachedAt: integer('cached_at', { mode: 'timestamp' })
31
43
  .notNull()
32
44
  .default(sql `(unixepoch())`),
33
- expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(),
45
+ lastAccessedAt: integer('last_accessed_at', { mode: 'timestamp' })
46
+ .notNull()
47
+ .default(sql `(unixepoch())`),
48
+ sizeBytes: integer('size_bytes').notNull().default(0),
34
49
  synced: integer('synced', { mode: 'boolean' }).notNull().default(true),
35
50
  }, (table) => ({
36
51
  uniqueMemory: unique().on(table.name, table.project),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { join } from 'path';
4
4
  import { tmpdir } from 'os';
5
5
  import { createDatabase, runMigrations } from '../../db/client.js';
6
6
  import { CacheManager } from '../cache-manager.js';
7
- describe('CacheManager', () => {
7
+ describe('CacheManager - LRU Two-Tier Storage', () => {
8
8
  let tmpDir;
9
9
  let cacheManager;
10
10
  let db;
@@ -17,12 +17,7 @@ describe('CacheManager', () => {
17
17
  runMigrations(db);
18
18
  const config = {
19
19
  dir: tmpDir,
20
- ttl: {
21
- workflows: 3600,
22
- rules: 3600,
23
- documents: 1800,
24
- memories: 900,
25
- },
20
+ maxCacheSizeBytes: 10 * 1024, // 10KB limit for testing
26
21
  preload: [],
27
22
  };
28
23
  cacheManager = new CacheManager(db, config);
@@ -39,7 +34,7 @@ describe('CacheManager', () => {
39
34
  expect(cached?.data.content).toBe('content here');
40
35
  expect(cached?.data.doc_type).toBe('workflow');
41
36
  expect(cached?.data.name).toBe('test-workflow');
42
- expect(cached?.isExpired).toBe(false);
37
+ expect(cached?.age).toBeGreaterThanOrEqual(0);
43
38
  });
44
39
  it('should store document with metadata', async () => {
45
40
  const metadata = { author: 'test', version: 1 };
@@ -73,25 +68,30 @@ describe('CacheManager', () => {
73
68
  const cached = await cacheManager.getDocument('workflow', 'test');
74
69
  expect(cached?.data.content).toBe('version 2');
75
70
  });
76
- it('should mark document as expired after TTL', async () => {
77
- // Override config to have very short TTL for testing
78
- const shortTTLConfig = {
79
- dir: tmpDir,
80
- ttl: {
81
- workflows: 0, // Expire immediately
82
- rules: 0,
83
- documents: 0,
84
- memories: 0,
85
- },
86
- preload: [],
87
- };
88
- const shortCacheManager = new CacheManager(db, shortTTLConfig);
89
- await shortCacheManager.setDocument('workflow', 'test', 'content');
90
- // Wait to ensure timestamp difference
91
- await new Promise(resolve => setTimeout(resolve, 100));
92
- const cached = await shortCacheManager.getDocument('workflow', 'test');
93
- expect(cached).not.toBeNull();
94
- expect(cached?.isExpired).toBe(true);
71
+ it('should mark critical document types as critical', async () => {
72
+ // Critical types: workflow, rule, agent, template
73
+ await cacheManager.setDocument('workflow', 'test-workflow', 'content');
74
+ await cacheManager.setDocument('rule', 'test-rule', 'content');
75
+ await cacheManager.setDocument('agent', 'test-agent', 'content');
76
+ await cacheManager.setDocument('template', 'test-template', 'content');
77
+ // Non-critical type
78
+ await cacheManager.setDocument('frd', 'test-frd', 'content');
79
+ const stats = await cacheManager.getCacheStats();
80
+ expect(stats.criticalCount).toBe(4);
81
+ expect(stats.dynamicCount).toBeGreaterThan(0); // FRD is dynamic
82
+ });
83
+ it('should update lastAccessedAt on read', async () => {
84
+ await cacheManager.setDocument('workflow', 'test', 'content');
85
+ const cached1 = await cacheManager.getDocument('workflow', 'test');
86
+ const cachedAt1 = cached1?.cachedAt.getTime();
87
+ // Wait 200ms
88
+ await new Promise(resolve => setTimeout(resolve, 200));
89
+ const cached2 = await cacheManager.getDocument('workflow', 'test');
90
+ const cachedAt2 = cached2?.cachedAt.getTime();
91
+ // cachedAt should remain the same (shows when first cached)
92
+ expect(cachedAt2).toBe(cachedAt1);
93
+ // But age should increase over time
94
+ expect(cached2?.age).toBeGreaterThanOrEqual(0);
95
95
  });
96
96
  });
97
97
  describe('setMemory and getMemory', () => {
@@ -101,7 +101,6 @@ describe('CacheManager', () => {
101
101
  expect(cached).not.toBeNull();
102
102
  expect(cached?.data.content).toBe('memory content');
103
103
  expect(cached?.data.name).toBe('test-memory');
104
- expect(cached?.isExpired).toBe(false);
105
104
  });
106
105
  it('should store memory with metadata', async () => {
107
106
  const metadata = { lastUpdated: Date.now() };
@@ -127,65 +126,129 @@ describe('CacheManager', () => {
127
126
  const cached = await cacheManager.getMemory('non-existent');
128
127
  expect(cached).toBeNull();
129
128
  });
130
- it('should mark memory as expired after TTL', async () => {
131
- const shortTTLConfig = {
132
- dir: tmpDir,
133
- ttl: {
134
- workflows: 0,
135
- rules: 0,
136
- documents: 0,
137
- memories: 0,
138
- },
139
- preload: [],
140
- };
141
- const shortCacheManager = new CacheManager(db, shortTTLConfig);
142
- await shortCacheManager.setMemory('test', 'content');
143
- await new Promise(resolve => setTimeout(resolve, 100));
144
- const cached = await shortCacheManager.getMemory('test');
145
- expect(cached).not.toBeNull();
146
- expect(cached?.isExpired).toBe(true);
147
- });
148
129
  });
149
- describe('cleanupExpiredEntries', () => {
150
- it('should delete expired documents and memories', async () => {
151
- const shortTTLConfig = {
152
- dir: tmpDir,
153
- ttl: {
154
- workflows: 0,
155
- rules: 0,
156
- documents: 0,
157
- memories: 0,
158
- },
159
- preload: [],
160
- };
161
- const shortCacheManager = new CacheManager(db, shortTTLConfig);
162
- // Add some items that will immediately expire
163
- await shortCacheManager.setDocument('workflow', 'test1', 'content1');
164
- await shortCacheManager.setDocument('rule', 'test2', 'content2');
165
- await shortCacheManager.setMemory('memory1', 'content3');
166
- // Wait to ensure they're expired (need sufficient time for clock to advance)
167
- await new Promise(resolve => setTimeout(resolve, 100));
168
- // Clean up
169
- const result = await shortCacheManager.cleanupExpiredEntries();
170
- expect(result.documentsDeleted).toBe(2);
171
- expect(result.memoriesDeleted).toBe(1);
172
- // Verify they're gone
173
- const doc1 = await shortCacheManager.getDocument('workflow', 'test1');
174
- const mem1 = await shortCacheManager.getMemory('memory1');
130
+ describe('LRU Eviction - Two-Tier Storage', () => {
131
+ it('should NOT evict critical documents when storage limit reached', async () => {
132
+ // Create large critical documents (workflows)
133
+ const largeContent = 'x'.repeat(3000); // 3KB each
134
+ // Add 4 critical documents = 12KB (exceeds 10KB limit)
135
+ await cacheManager.setDocument('workflow', 'critical1', largeContent);
136
+ await cacheManager.setDocument('workflow', 'critical2', largeContent);
137
+ await cacheManager.setDocument('workflow', 'critical3', largeContent);
138
+ await cacheManager.setDocument('workflow', 'critical4', largeContent);
139
+ // All should still be present (critical tier bypasses limit)
140
+ const doc1 = await cacheManager.getDocument('workflow', 'critical1');
141
+ const doc2 = await cacheManager.getDocument('workflow', 'critical2');
142
+ const doc3 = await cacheManager.getDocument('workflow', 'critical3');
143
+ const doc4 = await cacheManager.getDocument('workflow', 'critical4');
144
+ expect(doc1).not.toBeNull();
145
+ expect(doc2).not.toBeNull();
146
+ expect(doc3).not.toBeNull();
147
+ expect(doc4).not.toBeNull();
148
+ });
149
+ it('should evict oldest dynamic documents when storage limit reached', async () => {
150
+ const largeContent = 'x'.repeat(3000); // 3KB each
151
+ // Add dynamic documents
152
+ await cacheManager.setDocument('frd', 'dynamic1', largeContent);
153
+ await new Promise(resolve => setTimeout(resolve, 10));
154
+ await cacheManager.setDocument('frd', 'dynamic2', largeContent);
155
+ await new Promise(resolve => setTimeout(resolve, 10));
156
+ await cacheManager.setDocument('frd', 'dynamic3', largeContent);
157
+ await new Promise(resolve => setTimeout(resolve, 10));
158
+ // Now add another that pushes us over limit (9KB current, 3KB new = 12KB > 10KB)
159
+ // Should evict dynamic1 (oldest)
160
+ await cacheManager.setDocument('frd', 'dynamic4', largeContent);
161
+ // dynamic1 should be evicted
162
+ const doc1 = await cacheManager.getDocument('frd', 'dynamic1');
175
163
  expect(doc1).toBeNull();
176
- expect(mem1).toBeNull();
164
+ // dynamic2, dynamic3, dynamic4 should remain
165
+ const doc2 = await cacheManager.getDocument('frd', 'dynamic2');
166
+ const doc3 = await cacheManager.getDocument('frd', 'dynamic3');
167
+ const doc4 = await cacheManager.getDocument('frd', 'dynamic4');
168
+ expect(doc2).not.toBeNull();
169
+ expect(doc3).not.toBeNull();
170
+ expect(doc4).not.toBeNull();
171
+ });
172
+ it('should use LRU ordering based on lastAccessedAt', async () => {
173
+ const largeContent = 'x'.repeat(3000); // 3KB each
174
+ // Add 3 dynamic documents with delays to ensure distinct timestamps
175
+ await cacheManager.setDocument('frd', 'doc1', largeContent);
176
+ await new Promise(resolve => setTimeout(resolve, 50));
177
+ await cacheManager.setDocument('frd', 'doc2', largeContent);
178
+ await new Promise(resolve => setTimeout(resolve, 50));
179
+ await cacheManager.setDocument('frd', 'doc3', largeContent);
180
+ await new Promise(resolve => setTimeout(resolve, 50));
181
+ // Access doc2 and doc3 (updates their lastAccessedAt to be newest)
182
+ await cacheManager.getDocument('frd', 'doc2');
183
+ await new Promise(resolve => setTimeout(resolve, 50));
184
+ await cacheManager.getDocument('frd', 'doc3');
185
+ await new Promise(resolve => setTimeout(resolve, 50));
186
+ // Now doc1 has oldest lastAccessedAt, should be evicted first
187
+ // Add doc4, should evict doc1 (oldest access)
188
+ await cacheManager.setDocument('frd', 'doc4', largeContent);
189
+ const doc1 = await cacheManager.getDocument('frd', 'doc1');
190
+ const doc2 = await cacheManager.getDocument('frd', 'doc2');
191
+ const doc3 = await cacheManager.getDocument('frd', 'doc3');
192
+ const doc4 = await cacheManager.getDocument('frd', 'doc4');
193
+ expect(doc1).toBeNull(); // Oldest access, evicted
194
+ expect(doc2).not.toBeNull(); // Accessed recently, kept
195
+ expect(doc3).not.toBeNull(); // Accessed recently, kept
196
+ expect(doc4).not.toBeNull(); // Just added
197
+ });
198
+ it('should evict memories when document eviction insufficient', async () => {
199
+ const largeContent = 'x'.repeat(3000); // 3KB each
200
+ // Add one dynamic document
201
+ await cacheManager.setDocument('frd', 'doc1', largeContent);
202
+ // Add memories
203
+ await cacheManager.setMemory('mem1', largeContent);
204
+ await cacheManager.setMemory('mem2', largeContent);
205
+ // Current: 9KB (over limit when we add another 3KB)
206
+ // Should evict doc1 and mem1 to make room
207
+ await cacheManager.setDocument('frd', 'doc2', largeContent);
208
+ const doc1 = await cacheManager.getDocument('frd', 'doc1');
209
+ const mem1 = await cacheManager.getMemory('mem1');
210
+ const mem2 = await cacheManager.getMemory('mem2');
211
+ // At least one should be evicted (LRU order)
212
+ const evictedCount = [doc1, mem1, mem2].filter(item => item === null).length;
213
+ expect(evictedCount).toBeGreaterThan(0);
177
214
  });
178
- it('should not delete non-expired items', async () => {
215
+ });
216
+ describe('Cache invalidation', () => {
217
+ it('should invalidate specific document', async () => {
179
218
  await cacheManager.setDocument('workflow', 'test', 'content');
180
- await cacheManager.setMemory('memory', 'content');
181
- const result = await cacheManager.cleanupExpiredEntries();
182
- expect(result.documentsDeleted).toBe(0);
183
- expect(result.memoriesDeleted).toBe(0);
184
- // Verify they're still there
185
- const doc = await cacheManager.getDocument('workflow', 'test');
186
- const mem = await cacheManager.getMemory('memory');
187
- expect(doc).not.toBeNull();
188
- expect(mem).not.toBeNull();
219
+ const cached1 = await cacheManager.getDocument('workflow', 'test');
220
+ expect(cached1).not.toBeNull();
221
+ await cacheManager.invalidateDocument('workflow', 'test');
222
+ const cached2 = await cacheManager.getDocument('workflow', 'test');
223
+ expect(cached2).toBeNull();
224
+ });
225
+ it('should invalidate specific memory', async () => {
226
+ await cacheManager.setMemory('test', 'content');
227
+ const cached1 = await cacheManager.getMemory('test');
228
+ expect(cached1).not.toBeNull();
229
+ await cacheManager.invalidateMemory('test');
230
+ const cached2 = await cacheManager.getMemory('test');
231
+ expect(cached2).toBeNull();
232
+ });
233
+ });
234
+ describe('Cache statistics', () => {
235
+ it('should return accurate cache statistics', async () => {
236
+ const content = 'x'.repeat(1000); // 1KB each
237
+ // Add critical documents
238
+ await cacheManager.setDocument('workflow', 'wf1', content);
239
+ await cacheManager.setDocument('rule', 'rule1', content);
240
+ // Add dynamic documents
241
+ await cacheManager.setDocument('frd', 'frd1', content);
242
+ // Add memories
243
+ await cacheManager.setMemory('mem1', content);
244
+ const stats = await cacheManager.getCacheStats();
245
+ expect(stats.criticalCount).toBe(2);
246
+ expect(stats.dynamicCount).toBeGreaterThan(0);
247
+ expect(stats.memoryCount).toBe(1);
248
+ expect(stats.criticalSize).toBeGreaterThan(0);
249
+ expect(stats.dynamicSize).toBeGreaterThan(0);
250
+ expect(stats.totalSize).toBe(stats.criticalSize + stats.dynamicSize);
251
+ expect(stats.totalCount).toBe(stats.criticalCount + stats.dynamicCount);
189
252
  });
190
253
  });
191
254
  describe('cache age calculation', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"cache-manager.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/cache-manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache-manager.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/cache-manager.test.ts"],"names":[],"mappings":"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"}
@@ -44,12 +44,7 @@ describe('ProxyServer', () => {
44
44
  },
45
45
  cache: {
46
46
  dir: tmpDir,
47
- ttl: {
48
- workflows: 3600,
49
- rules: 3600,
50
- documents: 1800,
51
- memories: 900,
52
- },
47
+ maxCacheSizeBytes: 100 * 1024 * 1024, // 100MB
53
48
  preload: [],
54
49
  },
55
50
  connection: {
@@ -87,50 +82,27 @@ describe('ProxyServer', () => {
87
82
  expect(setRequestHandlerMock.mock.calls.length).toBeGreaterThanOrEqual(2);
88
83
  });
89
84
  });
90
- describe('cache cleanup on startup', () => {
91
- it('should clean up expired cache entries on start', async () => {
92
- // Add some expired entries
93
- const shortTTLConfig = { ...config };
94
- shortTTLConfig.cache.ttl = {
95
- workflows: 0,
96
- rules: 0,
97
- documents: 0,
98
- memories: 0,
99
- };
100
- const tempServer = new ProxyServer(db, shortTTLConfig);
101
- await tempServer['cacheManager'].setDocument('workflow', 'test', 'content');
85
+ describe('cache behavior', () => {
86
+ it('should use LRU cache with no expiration', async () => {
87
+ // With LRU cache, items never expire by time
88
+ await server['cacheManager'].setDocument('workflow', 'test', 'content');
89
+ // Wait some time
102
90
  await new Promise(resolve => setTimeout(resolve, 100));
103
- // Verify entry exists before cleanup
104
- const beforeCleanup = await tempServer['cacheManager'].getDocument('workflow', 'test');
105
- expect(beforeCleanup).not.toBeNull();
106
- await tempServer.start();
107
- // Entry should be removed after cleanup
108
- const afterCleanup = await tempServer['cacheManager'].getDocument('workflow', 'test');
109
- expect(afterCleanup).toBeNull();
110
- await tempServer.stop();
91
+ // Entry should still be present (no TTL expiration)
92
+ const cached = await server['cacheManager'].getDocument('workflow', 'test');
93
+ expect(cached).not.toBeNull();
94
+ expect(cached?.data.content).toBe('content');
111
95
  });
112
96
  });
113
97
  describe('graceful degradation', () => {
114
- it('should serve stale cache when disconnected', async () => {
115
- // Create server with short TTL to make cache expire
116
- const shortTTLConfig = { ...config };
117
- shortTTLConfig.cache.ttl = {
118
- workflows: 0,
119
- rules: 0,
120
- documents: 0,
121
- memories: 0,
122
- };
123
- const tempServer = new ProxyServer(db, shortTTLConfig);
124
- // Add item to cache
125
- await tempServer['cacheManager'].setDocument('workflow', 'test', 'cached content');
126
- // Wait for cache to expire
127
- await new Promise(resolve => setTimeout(resolve, 100));
98
+ it('should serve cached data when disconnected', async () => {
99
+ // LRU cache always serves cached data (no staleness - always fresh)
100
+ await server['cacheManager'].setDocument('workflow', 'test', 'cached content');
128
101
  // Simulate disconnected state
129
- tempServer['connectionManager']['state'] = 'disconnected';
130
- const result = await tempServer['handleGetDocument']('workflow', 'test');
102
+ server['connectionManager']['state'] = 'disconnected';
103
+ const result = await server['handleGetDocument']('workflow', 'test');
131
104
  expect(result.data.content).toBe('cached content');
132
- expect(result._metadata.source).toBe('stale_cache');
133
- await tempServer.stop();
105
+ expect(result._metadata.source).toBe('cache'); // Fresh cache, not stale
134
106
  });
135
107
  it('should return error when no cache available and disconnected', async () => {
136
108
  // Simulate disconnected state with no cache