@qwickapps/qwickbrain-proxy 1.0.1 → 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 (67) 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 +54 -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/connection-manager.d.ts.map +1 -1
  25. package/dist/lib/connection-manager.js +4 -1
  26. package/dist/lib/connection-manager.js.map +1 -1
  27. package/dist/lib/proxy-server.d.ts +6 -0
  28. package/dist/lib/proxy-server.d.ts.map +1 -1
  29. package/dist/lib/proxy-server.js +182 -87
  30. package/dist/lib/proxy-server.js.map +1 -1
  31. package/dist/lib/qwickbrain-client.d.ts +4 -0
  32. package/dist/lib/qwickbrain-client.d.ts.map +1 -1
  33. package/dist/lib/qwickbrain-client.js +133 -0
  34. package/dist/lib/qwickbrain-client.js.map +1 -1
  35. package/dist/lib/sse-invalidation-listener.d.ts +27 -0
  36. package/dist/lib/sse-invalidation-listener.d.ts.map +1 -0
  37. package/dist/lib/sse-invalidation-listener.js +145 -0
  38. package/dist/lib/sse-invalidation-listener.js.map +1 -0
  39. package/dist/lib/tools.d.ts +21 -0
  40. package/dist/lib/tools.d.ts.map +1 -0
  41. package/dist/lib/tools.js +488 -0
  42. package/dist/lib/tools.js.map +1 -0
  43. package/dist/lib/write-queue-manager.d.ts +88 -0
  44. package/dist/lib/write-queue-manager.d.ts.map +1 -0
  45. package/dist/lib/write-queue-manager.js +191 -0
  46. package/dist/lib/write-queue-manager.js.map +1 -0
  47. package/dist/types/config.d.ts +7 -42
  48. package/dist/types/config.d.ts.map +1 -1
  49. package/dist/types/config.js +1 -6
  50. package/dist/types/config.js.map +1 -1
  51. package/drizzle/0002_lru_cache_migration.sql +94 -0
  52. package/drizzle/meta/_journal.json +7 -0
  53. package/package.json +6 -2
  54. package/scripts/rebuild-sqlite.sh +26 -0
  55. package/src/db/schema.ts +17 -2
  56. package/src/lib/__tests__/cache-manager.test.ts +180 -90
  57. package/src/lib/__tests__/proxy-server.test.ts +16 -51
  58. package/src/lib/__tests__/sse-invalidation-listener.test.ts +326 -0
  59. package/src/lib/__tests__/write-queue-manager.test.ts +383 -0
  60. package/src/lib/cache-manager.ts +198 -46
  61. package/src/lib/connection-manager.ts +4 -1
  62. package/src/lib/proxy-server.ts +222 -90
  63. package/src/lib/qwickbrain-client.ts +145 -1
  64. package/src/lib/sse-invalidation-listener.ts +171 -0
  65. package/src/lib/tools.ts +500 -0
  66. package/src/lib/write-queue-manager.ts +271 -0
  67. 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,60 @@ 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
+
25
+ ## [1.0.2] - 2026-01-08
26
+
27
+ ### Fixed
28
+
29
+ - **Blocking Startup Issue**: Removed blocking connection attempts that prevented server from starting in offline mode
30
+ - Removed `await this.qwickbrainClient.connect()` from startup sequence
31
+ - Server now starts immediately (< 0.5s) regardless of network connectivity
32
+ - Connection manager handles network state transitions gracefully without throwing errors
33
+ - **Health Check Blocking**: Changed initial health check to fire-and-forget background task
34
+ - Eliminates 5-second timeout delay during startup
35
+ - MCP server becomes available immediately while connection attempts continue in background
36
+
37
+ ### Changed
38
+
39
+ - **Event-Driven Architecture**: Startup and network state management now fully event-driven
40
+ - Server startup no longer blocks on network operations
41
+ - Health checks run in background with exponential backoff (1s → 2s → 4s → 8s → 16s → 32s → 60s max)
42
+ - Connection state changes trigger appropriate background actions via events
43
+ - Added `onConnectionRestored()` handler for automatic cache sync when connection is restored
44
+ - **Improved Resilience**: Enhanced degraded mode operation
45
+ - Server exposes fallback tools immediately even when offline
46
+ - Background reconnection continues while serving cached data
47
+ - Disconnect errors during shutdown are now gracefully ignored
48
+
49
+ ### Added
50
+
51
+ - **Background Cache Sync**: Automatic cache population when connection is restored
52
+ - Event-driven preloading of workflows and rules on `'connected'` event
53
+ - Configurable preload items via `cache.preload` array
54
+ - Foundation for sync queue processing (TODO: implementation)
55
+
56
+ ### Technical Details
57
+
58
+ - **Non-Blocking Startup**: MCP server ready in < 0.5s vs previous 5+ second timeout/crash
59
+ - **Event Listeners**: Connection manager emits `stateChange`, `connected`, `disconnected`, `reconnecting` events
60
+ - **Graceful Degradation**: Tools available immediately with metadata indicating data source (live/cache/stale)
61
+
8
62
  ## [1.0.1] - 2025-01-08
9
63
 
10
64
  ### 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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"}