repoburg 1.3.96 → 1.3.97

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.
@@ -46,6 +46,7 @@ const llm_call_logs_module_1 = require("./llm-call-logs/llm-call-logs.module");
46
46
  const global_config_module_1 = require("./global-config/global-config.module");
47
47
  const common_module_1 = require("./common/common.module");
48
48
  const etag_cache_interceptor_1 = require("./common/interceptors/etag-cache.interceptor");
49
+ const cache_invalidation_subscriber_1 = require("./common/cache/cache-invalidation.subscriber");
49
50
  const core_2 = require("@nestjs/core");
50
51
  let dbPath = ':memory:';
51
52
  if (process.env.NODE_ENV === 'production') {
@@ -88,7 +89,7 @@ exports.AppModule = AppModule = __decorate([
88
89
  sub_agent_entity_1.SubAgent,
89
90
  sub_agent_run_entity_1.SubAgentRun,
90
91
  ],
91
- subscribers: [session_input_subscriber_1.SessionInputSubscriber],
92
+ subscribers: [session_input_subscriber_1.SessionInputSubscriber, cache_invalidation_subscriber_1.CacheInvalidationSubscriber],
92
93
  synchronize: true,
93
94
  autoLoadEntities: true,
94
95
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { ETagCacheService } from './etag-cache.service';
2
+ import { ApplicationStateService } from '../../application-state/application-state.service';
3
+ export type CacheableEntityType = 'session' | 'session_input' | 'ai_action' | 'execution_log' | 'context_template' | 'system_prompt' | 'custom_snippet' | 'context_snippet' | 'custom_variable' | 'project' | 'tool_hook' | 'mcp_config' | 'sub_agent' | 'sub_agent_run' | 'application_state' | 'llm_call_log';
4
+ export interface InvalidationContext {
5
+ sessionId?: string;
6
+ parentSessionId?: string;
7
+ childSessionId?: string;
8
+ isActive?: boolean;
9
+ isDefaultChanged?: boolean;
10
+ stateKey?: string;
11
+ }
12
+ export declare class CacheInvalidationService {
13
+ private readonly etagCacheService;
14
+ private readonly applicationStateService;
15
+ private readonly logger;
16
+ private static instance;
17
+ constructor(etagCacheService: ETagCacheService, applicationStateService: ApplicationStateService);
18
+ static getInstance(): CacheInvalidationService | null;
19
+ invalidateEntity(entityType: CacheableEntityType, context?: InvalidationContext): Promise<void>;
20
+ private getPatternsForEntity;
21
+ private getSessionPatterns;
22
+ private getSessionInputPatterns;
23
+ private getAIActionPatterns;
24
+ private getExecutionLogPatterns;
25
+ private getContextTemplatePatterns;
26
+ private getSystemPromptPatterns;
27
+ private getProjectPatterns;
28
+ private getSubAgentRunPatterns;
29
+ private getApplicationStatePatterns;
30
+ private checkIfActiveSession;
31
+ invalidateEntities(entities: Array<{
32
+ type: CacheableEntityType;
33
+ context: InvalidationContext;
34
+ }>): Promise<void>;
35
+ }
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var CacheInvalidationService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CacheInvalidationService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const etag_cache_service_1 = require("./etag-cache.service");
19
+ const application_state_service_1 = require("../../application-state/application-state.service");
20
+ let CacheInvalidationService = CacheInvalidationService_1 = class CacheInvalidationService {
21
+ constructor(etagCacheService, applicationStateService) {
22
+ this.etagCacheService = etagCacheService;
23
+ this.applicationStateService = applicationStateService;
24
+ this.logger = new common_1.Logger(CacheInvalidationService_1.name);
25
+ CacheInvalidationService_1.instance = this;
26
+ }
27
+ static getInstance() {
28
+ return CacheInvalidationService_1.instance;
29
+ }
30
+ async invalidateEntity(entityType, context = {}) {
31
+ this.logger.debug(`Invalidating cache for entity: ${entityType}, context: ${JSON.stringify(context)}`);
32
+ const patterns = await this.getPatternsForEntity(entityType, context);
33
+ for (const pattern of patterns) {
34
+ this.logger.debug(`Invalidating pattern: ${pattern}`);
35
+ this.etagCacheService.invalidatePattern(pattern);
36
+ }
37
+ this.logger.log(`Cache invalidation complete for ${entityType}: ${patterns.length} patterns`);
38
+ }
39
+ async getPatternsForEntity(entityType, context) {
40
+ if (context.sessionId && context.isActive === undefined) {
41
+ context.isActive = await this.checkIfActiveSession(context.sessionId);
42
+ }
43
+ switch (entityType) {
44
+ case 'session':
45
+ return this.getSessionPatterns(context);
46
+ case 'session_input':
47
+ return this.getSessionInputPatterns(context);
48
+ case 'ai_action':
49
+ return this.getAIActionPatterns(context);
50
+ case 'execution_log':
51
+ return this.getExecutionLogPatterns(context);
52
+ case 'context_template':
53
+ return this.getContextTemplatePatterns(context);
54
+ case 'system_prompt':
55
+ return this.getSystemPromptPatterns(context);
56
+ case 'custom_snippet':
57
+ return ['/custom-snippets*'];
58
+ case 'context_snippet':
59
+ return ['/context-snippets*'];
60
+ case 'custom_variable':
61
+ return ['/custom-variables*'];
62
+ case 'project':
63
+ return this.getProjectPatterns(context);
64
+ case 'tool_hook':
65
+ return ['/tool-hooks*', '/system-prompts*'];
66
+ case 'mcp_config':
67
+ return ['/mcp-configs*', '/mcp-tools*', '/system-prompts*'];
68
+ case 'sub_agent':
69
+ return ['/sub-agents*', '/sessions*'];
70
+ case 'sub_agent_run':
71
+ return this.getSubAgentRunPatterns(context);
72
+ case 'application_state':
73
+ return this.getApplicationStatePatterns(context);
74
+ case 'llm_call_log':
75
+ return ['/llm-call-logs*'];
76
+ default:
77
+ return [];
78
+ }
79
+ }
80
+ getSessionPatterns(context) {
81
+ const patterns = ['/sessions*'];
82
+ if (context.sessionId) {
83
+ patterns.push(`/sessions/${context.sessionId}*`);
84
+ }
85
+ if (context.isActive) {
86
+ patterns.push('/sessions/active*');
87
+ }
88
+ patterns.push('/application-state*');
89
+ return patterns;
90
+ }
91
+ getSessionInputPatterns(context) {
92
+ const patterns = [];
93
+ if (context.sessionId) {
94
+ patterns.push(`/sessions/${context.sessionId}*`);
95
+ }
96
+ patterns.push('/sessions*');
97
+ if (context.isActive) {
98
+ patterns.push('/sessions/active*');
99
+ }
100
+ return patterns;
101
+ }
102
+ getAIActionPatterns(context) {
103
+ const patterns = [];
104
+ if (context.sessionId) {
105
+ patterns.push(`/sessions/${context.sessionId}*`);
106
+ }
107
+ patterns.push('/sessions*');
108
+ if (context.isActive) {
109
+ patterns.push('/sessions/active*');
110
+ }
111
+ patterns.push('/ai-actions*');
112
+ return patterns;
113
+ }
114
+ getExecutionLogPatterns(context) {
115
+ const patterns = [];
116
+ if (context.sessionId) {
117
+ patterns.push(`/sessions/${context.sessionId}*`);
118
+ }
119
+ if (context.isActive) {
120
+ patterns.push('/sessions/active*');
121
+ }
122
+ return patterns;
123
+ }
124
+ getContextTemplatePatterns(_context) {
125
+ const patterns = ['/context-templates*'];
126
+ patterns.push('/sessions*');
127
+ return patterns;
128
+ }
129
+ getSystemPromptPatterns(_context) {
130
+ return ['/system-prompts*', '/sessions*', '/sub-agents*'];
131
+ }
132
+ getProjectPatterns(_context) {
133
+ return ['/projects*', '/sessions*'];
134
+ }
135
+ getSubAgentRunPatterns(context) {
136
+ const patterns = ['/sub-agent-runs*', '/sessions*'];
137
+ if (context.parentSessionId) {
138
+ patterns.push(`/sessions/${context.parentSessionId}*`);
139
+ }
140
+ if (context.childSessionId) {
141
+ patterns.push(`/sessions/${context.childSessionId}*`);
142
+ }
143
+ return patterns;
144
+ }
145
+ getApplicationStatePatterns(context) {
146
+ const patterns = ['/application-state*'];
147
+ if (context.stateKey === 'activeSessionId') {
148
+ patterns.push('/sessions*', '/sessions/active*');
149
+ }
150
+ return patterns;
151
+ }
152
+ async checkIfActiveSession(sessionId) {
153
+ try {
154
+ const activeSessionId = await this.applicationStateService.getActiveSessionId();
155
+ return sessionId === activeSessionId;
156
+ }
157
+ catch (error) {
158
+ this.logger.warn(`Could not check active session: ${error.message}. Assuming not active.`);
159
+ return false;
160
+ }
161
+ }
162
+ async invalidateEntities(entities) {
163
+ const allPatterns = new Set();
164
+ for (const { type, context } of entities) {
165
+ const patterns = await this.getPatternsForEntity(type, context);
166
+ patterns.forEach((p) => allPatterns.add(p));
167
+ }
168
+ for (const pattern of allPatterns) {
169
+ this.logger.debug(`Invalidating pattern: ${pattern}`);
170
+ this.etagCacheService.invalidatePattern(pattern);
171
+ }
172
+ this.logger.log(`Batch invalidation complete: ${allPatterns.size} unique patterns`);
173
+ }
174
+ };
175
+ exports.CacheInvalidationService = CacheInvalidationService;
176
+ exports.CacheInvalidationService = CacheInvalidationService = CacheInvalidationService_1 = __decorate([
177
+ (0, common_1.Injectable)(),
178
+ __param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => application_state_service_1.ApplicationStateService))),
179
+ __metadata("design:paramtypes", [etag_cache_service_1.ETagCacheService,
180
+ application_state_service_1.ApplicationStateService])
181
+ ], CacheInvalidationService);
182
+ //# sourceMappingURL=cache-invalidation.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-invalidation.service.js","sourceRoot":"","sources":["../../../../src/common/cache/cache-invalidation.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { EntitySubscriberInterface, InsertEvent, UpdateEvent, RemoveEvent } from 'typeorm';
2
+ export declare class CacheInvalidationSubscriber implements EntitySubscriberInterface {
3
+ private readonly logger;
4
+ afterInsert(event: InsertEvent<any>): void;
5
+ afterUpdate(event: UpdateEvent<any>): void;
6
+ afterRemove(event: RemoveEvent<any>): void;
7
+ private handleEntityChange;
8
+ private getEntityType;
9
+ private extractContext;
10
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var CacheInvalidationSubscriber_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CacheInvalidationSubscriber = void 0;
11
+ const typeorm_1 = require("typeorm");
12
+ const common_1 = require("@nestjs/common");
13
+ const cache_invalidation_service_1 = require("./cache-invalidation.service");
14
+ let CacheInvalidationSubscriber = CacheInvalidationSubscriber_1 = class CacheInvalidationSubscriber {
15
+ constructor() {
16
+ this.logger = new common_1.Logger(CacheInvalidationSubscriber_1.name);
17
+ }
18
+ afterInsert(event) {
19
+ this.handleEntityChange('insert', event.entity);
20
+ }
21
+ afterUpdate(event) {
22
+ this.handleEntityChange('update', event.entity);
23
+ }
24
+ afterRemove(event) {
25
+ this.handleEntityChange('remove', event.entity);
26
+ }
27
+ handleEntityChange(operation, entity) {
28
+ if (!entity) {
29
+ return;
30
+ }
31
+ const entityType = this.getEntityType(entity);
32
+ if (!entityType) {
33
+ return;
34
+ }
35
+ const context = this.extractContext(entity, entityType);
36
+ this.logger.debug(`Entity ${operation}: ${entityType}, context: ${JSON.stringify(context)}`);
37
+ const service = cache_invalidation_service_1.CacheInvalidationService.getInstance();
38
+ if (!service) {
39
+ this.logger.warn('CacheInvalidationService not initialized, skipping invalidation');
40
+ return;
41
+ }
42
+ service.invalidateEntity(entityType, context).catch((err) => {
43
+ this.logger.error(`Cache invalidation failed for ${entityType}: ${err.message}`);
44
+ });
45
+ }
46
+ getEntityType(entity) {
47
+ const entityName = entity.constructor?.name;
48
+ switch (entityName) {
49
+ case 'Session':
50
+ return 'session';
51
+ case 'SessionInput':
52
+ return 'session_input';
53
+ case 'AIAction':
54
+ return 'ai_action';
55
+ case 'ExecutionLog':
56
+ return 'execution_log';
57
+ case 'ContextTemplate':
58
+ return 'context_template';
59
+ case 'SystemPrompt':
60
+ return 'system_prompt';
61
+ case 'CustomSnippet':
62
+ return 'custom_snippet';
63
+ case 'ContextSnippet':
64
+ return 'context_snippet';
65
+ case 'CustomVariable':
66
+ return 'custom_variable';
67
+ case 'Project':
68
+ return 'project';
69
+ case 'ToolHook':
70
+ return 'tool_hook';
71
+ case 'McpConfig':
72
+ return 'mcp_config';
73
+ case 'SubAgent':
74
+ return 'sub_agent';
75
+ case 'SubAgentRun':
76
+ return 'sub_agent_run';
77
+ case 'ApplicationState':
78
+ return 'application_state';
79
+ case 'LlmCallLog':
80
+ return 'llm_call_log';
81
+ default:
82
+ return null;
83
+ }
84
+ }
85
+ extractContext(entity, entityType) {
86
+ const context = {};
87
+ switch (entityType) {
88
+ case 'session':
89
+ context.sessionId = entity.id;
90
+ break;
91
+ case 'session_input':
92
+ context.sessionId = entity.session_id;
93
+ break;
94
+ case 'ai_action':
95
+ context.sessionId =
96
+ entity.sessionInput?.session_id || entity.session_id;
97
+ break;
98
+ case 'execution_log':
99
+ context.sessionId =
100
+ entity.aiAction?.sessionInput?.session_id ||
101
+ entity.sessionInput?.session_id ||
102
+ entity.session_id;
103
+ break;
104
+ case 'context_template':
105
+ context.isDefaultChanged =
106
+ entity.is_default_initial || entity.is_default_followup;
107
+ break;
108
+ case 'system_prompt':
109
+ context.isDefaultChanged = entity.is_default;
110
+ break;
111
+ case 'sub_agent_run':
112
+ context.parentSessionId = entity.parent_session_id;
113
+ context.childSessionId = entity.child_session_id;
114
+ break;
115
+ case 'application_state':
116
+ context.stateKey = entity.key;
117
+ break;
118
+ }
119
+ return context;
120
+ }
121
+ };
122
+ exports.CacheInvalidationSubscriber = CacheInvalidationSubscriber;
123
+ exports.CacheInvalidationSubscriber = CacheInvalidationSubscriber = CacheInvalidationSubscriber_1 = __decorate([
124
+ (0, typeorm_1.EventSubscriber)()
125
+ ], CacheInvalidationSubscriber);
126
+ //# sourceMappingURL=cache-invalidation.subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-invalidation.subscriber.js","sourceRoot":"","sources":["../../../../src/common/cache/cache-invalidation.subscriber.ts"],"names":[],"mappings":"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"}
@@ -9,14 +9,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.CommonModule = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const etag_cache_service_1 = require("./cache/etag-cache.service");
12
+ const cache_invalidation_service_1 = require("./cache/cache-invalidation.service");
13
+ const application_state_module_1 = require("../application-state/application-state.module");
12
14
  let CommonModule = class CommonModule {
13
15
  };
14
16
  exports.CommonModule = CommonModule;
15
17
  exports.CommonModule = CommonModule = __decorate([
16
18
  (0, common_1.Global)(),
17
19
  (0, common_1.Module)({
18
- providers: [etag_cache_service_1.ETagCacheService],
19
- exports: [etag_cache_service_1.ETagCacheService],
20
+ imports: [application_state_module_1.ApplicationStateModule],
21
+ providers: [etag_cache_service_1.ETagCacheService, cache_invalidation_service_1.CacheInvalidationService],
22
+ exports: [etag_cache_service_1.ETagCacheService, cache_invalidation_service_1.CacheInvalidationService],
20
23
  })
21
24
  ], CommonModule);
22
25
  //# sourceMappingURL=common.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.module.js","sourceRoot":"","sources":["../../../src/common/common.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,mEAA8D;AAOvD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,qCAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,qCAAgB,CAAC;KAC5B,CAAC;GACW,YAAY,CAAG"}
1
+ {"version":3,"file":"common.module.js","sourceRoot":"","sources":["../../../src/common/common.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,mEAA8D;AAC9D,mFAA8E;AAC9E,4FAAuF;AAQhF,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IANxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,iDAAsB,CAAC;QACjC,SAAS,EAAE,CAAC,qCAAgB,EAAE,qDAAwB,CAAC;QACvD,OAAO,EAAE,CAAC,qCAAgB,EAAE,qDAAwB,CAAC;KACtD,CAAC;GACW,YAAY,CAAG"}