@recallbricks/runtime 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +502 -0
  3. package/dist/adapters/api/index.d.ts +2 -0
  4. package/dist/adapters/api/index.d.ts.map +1 -0
  5. package/dist/adapters/api/index.js +6 -0
  6. package/dist/adapters/api/index.js.map +1 -0
  7. package/dist/adapters/api/server.d.ts +13 -0
  8. package/dist/adapters/api/server.d.ts.map +1 -0
  9. package/dist/adapters/api/server.js +241 -0
  10. package/dist/adapters/api/server.js.map +1 -0
  11. package/dist/adapters/mcp/index.d.ts +2 -0
  12. package/dist/adapters/mcp/index.d.ts.map +1 -0
  13. package/dist/adapters/mcp/index.js +6 -0
  14. package/dist/adapters/mcp/index.js.map +1 -0
  15. package/dist/adapters/mcp/server.d.ts +27 -0
  16. package/dist/adapters/mcp/server.d.ts.map +1 -0
  17. package/dist/adapters/mcp/server.js +227 -0
  18. package/dist/adapters/mcp/server.js.map +1 -0
  19. package/dist/adapters/typescript/index.d.ts +4 -0
  20. package/dist/adapters/typescript/index.d.ts.map +1 -0
  21. package/dist/adapters/typescript/index.js +24 -0
  22. package/dist/adapters/typescript/index.js.map +1 -0
  23. package/dist/api/RecallBricksClient.d.ts +53 -0
  24. package/dist/api/RecallBricksClient.d.ts.map +1 -0
  25. package/dist/api/RecallBricksClient.js +129 -0
  26. package/dist/api/RecallBricksClient.js.map +1 -0
  27. package/dist/api/TelemetryClient.d.ts +54 -0
  28. package/dist/api/TelemetryClient.d.ts.map +1 -0
  29. package/dist/api/TelemetryClient.js +190 -0
  30. package/dist/api/TelemetryClient.js.map +1 -0
  31. package/dist/api/index.d.ts +3 -0
  32. package/dist/api/index.d.ts.map +1 -0
  33. package/dist/api/index.js +6 -0
  34. package/dist/api/index.js.map +1 -0
  35. package/dist/config/index.d.ts +13 -0
  36. package/dist/config/index.d.ts.map +1 -0
  37. package/dist/config/index.js +206 -0
  38. package/dist/config/index.js.map +1 -0
  39. package/dist/core/AgentRuntime.d.ts +45 -0
  40. package/dist/core/AgentRuntime.d.ts.map +1 -0
  41. package/dist/core/AgentRuntime.js +328 -0
  42. package/dist/core/AgentRuntime.js.map +1 -0
  43. package/dist/core/AutoSaver.d.ts +26 -0
  44. package/dist/core/AutoSaver.d.ts.map +1 -0
  45. package/dist/core/AutoSaver.js +162 -0
  46. package/dist/core/AutoSaver.js.map +1 -0
  47. package/dist/core/CircuitBreaker.d.ts +64 -0
  48. package/dist/core/CircuitBreaker.d.ts.map +1 -0
  49. package/dist/core/CircuitBreaker.js +201 -0
  50. package/dist/core/CircuitBreaker.js.map +1 -0
  51. package/dist/core/ContextLoader.d.ts +31 -0
  52. package/dist/core/ContextLoader.d.ts.map +1 -0
  53. package/dist/core/ContextLoader.js +236 -0
  54. package/dist/core/ContextLoader.js.map +1 -0
  55. package/dist/core/ContextWeaver.d.ts +49 -0
  56. package/dist/core/ContextWeaver.d.ts.map +1 -0
  57. package/dist/core/ContextWeaver.js +216 -0
  58. package/dist/core/ContextWeaver.js.map +1 -0
  59. package/dist/core/IdentityValidator.d.ts +24 -0
  60. package/dist/core/IdentityValidator.d.ts.map +1 -0
  61. package/dist/core/IdentityValidator.js +161 -0
  62. package/dist/core/IdentityValidator.js.map +1 -0
  63. package/dist/core/LLMAdapter.d.ts +19 -0
  64. package/dist/core/LLMAdapter.d.ts.map +1 -0
  65. package/dist/core/LLMAdapter.js +223 -0
  66. package/dist/core/LLMAdapter.js.map +1 -0
  67. package/dist/core/Metrics.d.ts +96 -0
  68. package/dist/core/Metrics.d.ts.map +1 -0
  69. package/dist/core/Metrics.js +271 -0
  70. package/dist/core/Metrics.js.map +1 -0
  71. package/dist/core/RateLimiter.d.ts +39 -0
  72. package/dist/core/RateLimiter.d.ts.map +1 -0
  73. package/dist/core/RateLimiter.js +251 -0
  74. package/dist/core/RateLimiter.js.map +1 -0
  75. package/dist/core/ReflectionEngine.d.ts +70 -0
  76. package/dist/core/ReflectionEngine.d.ts.map +1 -0
  77. package/dist/core/ReflectionEngine.js +319 -0
  78. package/dist/core/ReflectionEngine.js.map +1 -0
  79. package/dist/index.d.ts +14 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +40 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/types/index.d.ts +259 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +38 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/package.json +91 -0
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LLMAdapter = void 0;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ const openai_1 = __importDefault(require("openai"));
9
+ const generative_ai_1 = require("@google/generative-ai");
10
+ const types_1 = require("../types");
11
+ class LLMAdapter {
12
+ constructor(config, logger) {
13
+ this.config = config;
14
+ this.logger = logger;
15
+ this.initializeClient();
16
+ }
17
+ initializeClient() {
18
+ switch (this.config.provider) {
19
+ case 'anthropic':
20
+ this.anthropicClient = new sdk_1.default({
21
+ apiKey: this.config.apiKey,
22
+ ...(this.config.baseUrl && { baseURL: this.config.baseUrl }),
23
+ });
24
+ this.logger.debug('Initialized Anthropic client');
25
+ break;
26
+ case 'openai':
27
+ this.openaiClient = new openai_1.default({
28
+ apiKey: this.config.apiKey,
29
+ ...(this.config.baseUrl && { baseURL: this.config.baseUrl }),
30
+ });
31
+ this.logger.debug('Initialized OpenAI client');
32
+ break;
33
+ case 'gemini':
34
+ this.geminiClient = new generative_ai_1.GoogleGenerativeAI(this.config.apiKey);
35
+ this.geminiModel = this.geminiClient.getGenerativeModel({
36
+ model: this.config.model || 'gemini-1.5-pro',
37
+ });
38
+ this.logger.debug('Initialized Gemini client');
39
+ break;
40
+ case 'ollama':
41
+ this.logger.debug('Ollama provider - using OpenAI-compatible interface');
42
+ this.openaiClient = new openai_1.default({
43
+ apiKey: this.config.apiKey || 'ollama',
44
+ baseURL: this.config.baseUrl || 'http://localhost:11434/v1',
45
+ });
46
+ break;
47
+ case 'cohere':
48
+ this.logger.warn('Cohere provider not yet implemented, using OpenAI-compatible interface');
49
+ this.openaiClient = new openai_1.default({
50
+ apiKey: this.config.apiKey,
51
+ baseURL: this.config.baseUrl || 'https://api.cohere.ai/v1',
52
+ });
53
+ break;
54
+ case 'local':
55
+ this.logger.debug('Local model provider - using OpenAI-compatible interface');
56
+ this.openaiClient = new openai_1.default({
57
+ apiKey: this.config.apiKey || 'local',
58
+ baseURL: this.config.baseUrl || 'http://localhost:8000/v1',
59
+ });
60
+ break;
61
+ default:
62
+ throw new types_1.LLMError(`Unsupported LLM provider: ${this.config.provider}`, this.config.provider);
63
+ }
64
+ }
65
+ async chat(messages) {
66
+ this.logger.debug(`Sending chat request to ${this.config.provider}`, {
67
+ messageCount: messages.length,
68
+ model: this.config.model,
69
+ });
70
+ try {
71
+ switch (this.config.provider) {
72
+ case 'anthropic':
73
+ return await this.chatAnthropic(messages);
74
+ case 'gemini':
75
+ return await this.chatGemini(messages);
76
+ case 'openai':
77
+ case 'ollama':
78
+ case 'cohere':
79
+ case 'local':
80
+ return await this.chatOpenAI(messages);
81
+ default:
82
+ throw new types_1.LLMError(`Unsupported provider: ${this.config.provider}`, this.config.provider);
83
+ }
84
+ }
85
+ catch (error) {
86
+ this.logger.error('LLM chat request failed', { error });
87
+ throw this.handleError(error);
88
+ }
89
+ }
90
+ async chatAnthropic(messages) {
91
+ if (!this.anthropicClient) {
92
+ throw new types_1.LLMError('Anthropic client not initialized', 'anthropic');
93
+ }
94
+ const systemMessages = messages
95
+ .filter((m) => m.role === 'system')
96
+ .map((m) => m.content)
97
+ .join('\n\n');
98
+ const conversationMessages = messages
99
+ .filter((m) => m.role !== 'system')
100
+ .map((m) => ({
101
+ role: m.role,
102
+ content: m.content,
103
+ }));
104
+ const response = await this.anthropicClient.messages.create({
105
+ model: this.config.model || 'claude-sonnet-4-5-20250929',
106
+ max_tokens: this.config.maxTokens || 2048,
107
+ temperature: this.config.temperature || 0.7,
108
+ system: systemMessages || undefined,
109
+ messages: conversationMessages,
110
+ });
111
+ const content = response.content[0].type === 'text' ? response.content[0].text : '';
112
+ this.logger.debug('Anthropic response received', {
113
+ model: response.model,
114
+ usage: response.usage,
115
+ });
116
+ return {
117
+ content,
118
+ provider: 'anthropic',
119
+ model: response.model,
120
+ usage: {
121
+ promptTokens: response.usage.input_tokens,
122
+ completionTokens: response.usage.output_tokens,
123
+ totalTokens: response.usage.input_tokens + response.usage.output_tokens,
124
+ },
125
+ };
126
+ }
127
+ async chatGemini(messages) {
128
+ if (!this.geminiModel) {
129
+ throw new types_1.LLMError('Gemini client not initialized', 'gemini');
130
+ }
131
+ const systemMessages = messages
132
+ .filter((m) => m.role === 'system')
133
+ .map((m) => m.content)
134
+ .join('\n\n');
135
+ const conversationMessages = messages
136
+ .filter((m) => m.role !== 'system')
137
+ .map((m) => ({
138
+ role: m.role === 'assistant' ? 'model' : 'user',
139
+ parts: [{ text: m.content }],
140
+ }));
141
+ const chat = this.geminiModel.startChat({
142
+ history: conversationMessages.slice(0, -1),
143
+ generationConfig: {
144
+ temperature: this.config.temperature || 0.7,
145
+ maxOutputTokens: this.config.maxTokens || 2048,
146
+ },
147
+ systemInstruction: systemMessages || undefined,
148
+ });
149
+ const lastMessage = conversationMessages[conversationMessages.length - 1];
150
+ const userMessage = lastMessage?.parts[0]?.text || '';
151
+ const result = await chat.sendMessage(userMessage);
152
+ const response = await result.response;
153
+ const content = response.text();
154
+ this.logger.debug('Gemini response received', {
155
+ model: this.config.model || 'gemini-1.5-pro',
156
+ });
157
+ return {
158
+ content,
159
+ provider: 'gemini',
160
+ model: this.config.model || 'gemini-1.5-pro',
161
+ usage: response.usageMetadata
162
+ ? {
163
+ promptTokens: response.usageMetadata.promptTokenCount || 0,
164
+ completionTokens: response.usageMetadata.candidatesTokenCount || 0,
165
+ totalTokens: response.usageMetadata.totalTokenCount || 0,
166
+ }
167
+ : undefined,
168
+ };
169
+ }
170
+ async chatOpenAI(messages) {
171
+ if (!this.openaiClient) {
172
+ throw new types_1.LLMError('OpenAI client not initialized', this.config.provider);
173
+ }
174
+ const response = await this.openaiClient.chat.completions.create({
175
+ model: this.config.model || 'gpt-4-turbo-preview',
176
+ messages: messages.map((m) => ({
177
+ role: m.role,
178
+ content: m.content,
179
+ })),
180
+ temperature: this.config.temperature || 0.7,
181
+ max_tokens: this.config.maxTokens || 2048,
182
+ });
183
+ const content = response.choices[0]?.message?.content || '';
184
+ this.logger.debug('OpenAI-compatible response received', {
185
+ model: response.model,
186
+ usage: response.usage,
187
+ });
188
+ return {
189
+ content,
190
+ provider: this.config.provider,
191
+ model: response.model,
192
+ usage: response.usage
193
+ ? {
194
+ promptTokens: response.usage.prompt_tokens,
195
+ completionTokens: response.usage.completion_tokens,
196
+ totalTokens: response.usage.total_tokens,
197
+ }
198
+ : undefined,
199
+ };
200
+ }
201
+ handleError(error) {
202
+ if (error instanceof types_1.LLMError) {
203
+ return error;
204
+ }
205
+ if (error instanceof Error) {
206
+ return new types_1.LLMError(`LLM request failed: ${error.message}`, this.config.provider, { originalError: error.message });
207
+ }
208
+ return new types_1.LLMError('Unknown LLM error occurred', this.config.provider, { error });
209
+ }
210
+ updateConfig(newConfig) {
211
+ this.config = { ...this.config, ...newConfig };
212
+ this.initializeClient();
213
+ this.logger.info('LLM configuration updated', {
214
+ provider: this.config.provider,
215
+ model: this.config.model,
216
+ });
217
+ }
218
+ getConfig() {
219
+ return { ...this.config };
220
+ }
221
+ }
222
+ exports.LLMAdapter = LLMAdapter;
223
+ //# sourceMappingURL=LLMAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLMAdapter.js","sourceRoot":"","sources":["../../src/core/LLMAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { Logger } from '../types';
2
+ export interface MetricValue {
3
+ value: number;
4
+ timestamp: number;
5
+ labels?: Record<string, string>;
6
+ }
7
+ export interface Histogram {
8
+ count: number;
9
+ sum: number;
10
+ buckets: Map<number, number>;
11
+ }
12
+ export interface Summary {
13
+ count: number;
14
+ sum: number;
15
+ quantiles: Map<number, number>;
16
+ }
17
+ export type MetricType = 'counter' | 'gauge' | 'histogram' | 'summary';
18
+ export declare class Counter {
19
+ private name;
20
+ private help;
21
+ private value;
22
+ private labels;
23
+ constructor(name: string, help: string);
24
+ inc(value?: number, labels?: Record<string, string>): void;
25
+ getValue(labels?: Record<string, string>): number;
26
+ reset(): void;
27
+ export(): string;
28
+ }
29
+ export declare class Gauge {
30
+ private name;
31
+ private help;
32
+ private value;
33
+ private labels;
34
+ constructor(name: string, help: string);
35
+ set(value: number, labels?: Record<string, string>): void;
36
+ inc(value?: number, labels?: Record<string, string>): void;
37
+ dec(value?: number, labels?: Record<string, string>): void;
38
+ getValue(labels?: Record<string, string>): number;
39
+ reset(): void;
40
+ export(): string;
41
+ }
42
+ export declare class HistogramMetric {
43
+ private name;
44
+ private help;
45
+ private observations;
46
+ private buckets;
47
+ constructor(name: string, help: string, buckets?: number[]);
48
+ observe(value: number, labels?: Record<string, string>): void;
49
+ reset(): void;
50
+ export(): string;
51
+ }
52
+ export declare class MetricsRegistry {
53
+ private logger;
54
+ private counters;
55
+ private gauges;
56
+ private histograms;
57
+ constructor(logger: Logger);
58
+ counter(name: string, help: string): Counter;
59
+ gauge(name: string, help: string): Gauge;
60
+ histogram(name: string, help: string, buckets?: number[]): HistogramMetric;
61
+ export(): string;
62
+ resetAll(): void;
63
+ getSummary(): Record<string, unknown>;
64
+ }
65
+ export declare class RuntimeMetrics {
66
+ private registry;
67
+ requestsTotal: Counter;
68
+ requestDuration: HistogramMetric;
69
+ requestErrors: Counter;
70
+ requestsInFlight: Gauge;
71
+ llmRequestsTotal: Counter;
72
+ llmRequestDuration: HistogramMetric;
73
+ llmTokensUsed: Counter;
74
+ llmErrors: Counter;
75
+ contextLoadsTotal: Counter;
76
+ contextLoadDuration: HistogramMetric;
77
+ contextCacheHits: Counter;
78
+ contextCacheMisses: Counter;
79
+ savesTotal: Counter;
80
+ saveDuration: HistogramMetric;
81
+ saveQueueSize: Gauge;
82
+ saveErrors: Counter;
83
+ identityViolationsTotal: Counter;
84
+ identityCorrectionsTotal: Counter;
85
+ circuitBreakerState: Gauge;
86
+ circuitBreakerTrips: Counter;
87
+ uptimeSeconds: Gauge;
88
+ memoryUsageBytes: Gauge;
89
+ cpuUsagePercent: Gauge;
90
+ constructor(logger: Logger);
91
+ private startSystemMetricsCollection;
92
+ exportPrometheus(): string;
93
+ getSummary(): Record<string, unknown>;
94
+ resetAll(): void;
95
+ }
96
+ //# sourceMappingURL=Metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Metrics.d.ts","sourceRoot":"","sources":["../../src/core/Metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuntimeMetrics = exports.MetricsRegistry = exports.HistogramMetric = exports.Gauge = exports.Counter = void 0;
4
+ class Counter {
5
+ constructor(name, help) {
6
+ this.name = name;
7
+ this.help = help;
8
+ this.value = 0;
9
+ this.labels = new Map();
10
+ }
11
+ inc(value = 1, labels) {
12
+ if (labels) {
13
+ const key = JSON.stringify(labels);
14
+ this.labels.set(key, (this.labels.get(key) || 0) + value);
15
+ }
16
+ else {
17
+ this.value += value;
18
+ }
19
+ }
20
+ getValue(labels) {
21
+ if (labels) {
22
+ const key = JSON.stringify(labels);
23
+ return this.labels.get(key) || 0;
24
+ }
25
+ return this.value;
26
+ }
27
+ reset() {
28
+ this.value = 0;
29
+ this.labels.clear();
30
+ }
31
+ export() {
32
+ let output = `# HELP ${this.name} ${this.help}\n`;
33
+ output += `# TYPE ${this.name} counter\n`;
34
+ if (this.labels.size === 0) {
35
+ output += `${this.name} ${this.value}\n`;
36
+ }
37
+ else {
38
+ for (const [labelsJson, value] of this.labels) {
39
+ const labels = JSON.parse(labelsJson);
40
+ const labelStr = Object.entries(labels)
41
+ .map(([k, v]) => `${k}="${v}"`)
42
+ .join(',');
43
+ output += `${this.name}{${labelStr}} ${value}\n`;
44
+ }
45
+ }
46
+ return output;
47
+ }
48
+ }
49
+ exports.Counter = Counter;
50
+ class Gauge {
51
+ constructor(name, help) {
52
+ this.name = name;
53
+ this.help = help;
54
+ this.value = 0;
55
+ this.labels = new Map();
56
+ }
57
+ set(value, labels) {
58
+ if (labels) {
59
+ const key = JSON.stringify(labels);
60
+ this.labels.set(key, value);
61
+ }
62
+ else {
63
+ this.value = value;
64
+ }
65
+ }
66
+ inc(value = 1, labels) {
67
+ if (labels) {
68
+ const key = JSON.stringify(labels);
69
+ this.labels.set(key, (this.labels.get(key) || 0) + value);
70
+ }
71
+ else {
72
+ this.value += value;
73
+ }
74
+ }
75
+ dec(value = 1, labels) {
76
+ this.inc(-value, labels);
77
+ }
78
+ getValue(labels) {
79
+ if (labels) {
80
+ const key = JSON.stringify(labels);
81
+ return this.labels.get(key) || 0;
82
+ }
83
+ return this.value;
84
+ }
85
+ reset() {
86
+ this.value = 0;
87
+ this.labels.clear();
88
+ }
89
+ export() {
90
+ let output = `# HELP ${this.name} ${this.help}\n`;
91
+ output += `# TYPE ${this.name} gauge\n`;
92
+ if (this.labels.size === 0) {
93
+ output += `${this.name} ${this.value}\n`;
94
+ }
95
+ else {
96
+ for (const [labelsJson, value] of this.labels) {
97
+ const labels = JSON.parse(labelsJson);
98
+ const labelStr = Object.entries(labels)
99
+ .map(([k, v]) => `${k}="${v}"`)
100
+ .join(',');
101
+ output += `${this.name}{${labelStr}} ${value}\n`;
102
+ }
103
+ }
104
+ return output;
105
+ }
106
+ }
107
+ exports.Gauge = Gauge;
108
+ class HistogramMetric {
109
+ constructor(name, help, buckets = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]) {
110
+ this.name = name;
111
+ this.help = help;
112
+ this.observations = new Map();
113
+ this.buckets = [...buckets, Infinity].sort((a, b) => a - b);
114
+ }
115
+ observe(value, labels) {
116
+ const key = labels ? JSON.stringify(labels) : 'default';
117
+ let histogram = this.observations.get(key);
118
+ if (!histogram) {
119
+ histogram = {
120
+ count: 0,
121
+ sum: 0,
122
+ buckets: new Map(this.buckets.map((b) => [b, 0])),
123
+ };
124
+ this.observations.set(key, histogram);
125
+ }
126
+ histogram.count++;
127
+ histogram.sum += value;
128
+ for (const bucket of this.buckets) {
129
+ if (value <= bucket) {
130
+ histogram.buckets.set(bucket, (histogram.buckets.get(bucket) || 0) + 1);
131
+ }
132
+ }
133
+ }
134
+ reset() {
135
+ this.observations.clear();
136
+ }
137
+ export() {
138
+ let output = `# HELP ${this.name} ${this.help}\n`;
139
+ output += `# TYPE ${this.name} histogram\n`;
140
+ for (const [labelsJson, histogram] of this.observations) {
141
+ const labels = labelsJson !== 'default' ? JSON.parse(labelsJson) : {};
142
+ const labelStr = Object.entries(labels).length > 0
143
+ ? `{${Object.entries(labels).map(([k, v]) => `${k}="${v}"`).join(',')}}`
144
+ : '';
145
+ for (const [bucket, count] of histogram.buckets) {
146
+ const le = bucket === Infinity ? '+Inf' : bucket.toString();
147
+ output += `${this.name}_bucket${labelStr}{le="${le}"} ${count}\n`;
148
+ }
149
+ output += `${this.name}_sum${labelStr} ${histogram.sum}\n`;
150
+ output += `${this.name}_count${labelStr} ${histogram.count}\n`;
151
+ }
152
+ return output;
153
+ }
154
+ }
155
+ exports.HistogramMetric = HistogramMetric;
156
+ class MetricsRegistry {
157
+ constructor(logger) {
158
+ this.logger = logger;
159
+ this.counters = new Map();
160
+ this.gauges = new Map();
161
+ this.histograms = new Map();
162
+ }
163
+ counter(name, help) {
164
+ if (!this.counters.has(name)) {
165
+ this.counters.set(name, new Counter(name, help));
166
+ this.logger.debug(`Counter registered: ${name}`);
167
+ }
168
+ return this.counters.get(name);
169
+ }
170
+ gauge(name, help) {
171
+ if (!this.gauges.has(name)) {
172
+ this.gauges.set(name, new Gauge(name, help));
173
+ this.logger.debug(`Gauge registered: ${name}`);
174
+ }
175
+ return this.gauges.get(name);
176
+ }
177
+ histogram(name, help, buckets) {
178
+ if (!this.histograms.has(name)) {
179
+ this.histograms.set(name, new HistogramMetric(name, help, buckets));
180
+ this.logger.debug(`Histogram registered: ${name}`);
181
+ }
182
+ return this.histograms.get(name);
183
+ }
184
+ export() {
185
+ let output = '';
186
+ for (const counter of this.counters.values()) {
187
+ output += counter.export() + '\n';
188
+ }
189
+ for (const gauge of this.gauges.values()) {
190
+ output += gauge.export() + '\n';
191
+ }
192
+ for (const histogram of this.histograms.values()) {
193
+ output += histogram.export() + '\n';
194
+ }
195
+ return output;
196
+ }
197
+ resetAll() {
198
+ for (const counter of this.counters.values()) {
199
+ counter.reset();
200
+ }
201
+ for (const gauge of this.gauges.values()) {
202
+ gauge.reset();
203
+ }
204
+ for (const histogram of this.histograms.values()) {
205
+ histogram.reset();
206
+ }
207
+ this.logger.info('All metrics reset');
208
+ }
209
+ getSummary() {
210
+ const summary = {};
211
+ for (const [name, counter] of this.counters) {
212
+ summary[name] = counter.getValue();
213
+ }
214
+ for (const [name, gauge] of this.gauges) {
215
+ summary[name] = gauge.getValue();
216
+ }
217
+ return summary;
218
+ }
219
+ }
220
+ exports.MetricsRegistry = MetricsRegistry;
221
+ class RuntimeMetrics {
222
+ constructor(logger) {
223
+ this.registry = new MetricsRegistry(logger);
224
+ this.requestsTotal = this.registry.counter('recallbricks_requests_total', 'Total number of requests');
225
+ this.requestDuration = this.registry.histogram('recallbricks_request_duration_seconds', 'Request duration in seconds', [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30]);
226
+ this.requestErrors = this.registry.counter('recallbricks_request_errors_total', 'Total number of request errors');
227
+ this.requestsInFlight = this.registry.gauge('recallbricks_requests_in_flight', 'Number of requests currently being processed');
228
+ this.llmRequestsTotal = this.registry.counter('recallbricks_llm_requests_total', 'Total number of LLM requests');
229
+ this.llmRequestDuration = this.registry.histogram('recallbricks_llm_request_duration_seconds', 'LLM request duration in seconds');
230
+ this.llmTokensUsed = this.registry.counter('recallbricks_llm_tokens_used_total', 'Total number of LLM tokens used');
231
+ this.llmErrors = this.registry.counter('recallbricks_llm_errors_total', 'Total number of LLM errors');
232
+ this.contextLoadsTotal = this.registry.counter('recallbricks_context_loads_total', 'Total number of context loads');
233
+ this.contextLoadDuration = this.registry.histogram('recallbricks_context_load_duration_seconds', 'Context load duration in seconds');
234
+ this.contextCacheHits = this.registry.counter('recallbricks_context_cache_hits_total', 'Total number of context cache hits');
235
+ this.contextCacheMisses = this.registry.counter('recallbricks_context_cache_misses_total', 'Total number of context cache misses');
236
+ this.savesTotal = this.registry.counter('recallbricks_saves_total', 'Total number of conversation saves');
237
+ this.saveDuration = this.registry.histogram('recallbricks_save_duration_seconds', 'Save duration in seconds');
238
+ this.saveQueueSize = this.registry.gauge('recallbricks_save_queue_size', 'Current save queue size');
239
+ this.saveErrors = this.registry.counter('recallbricks_save_errors_total', 'Total number of save errors');
240
+ this.identityViolationsTotal = this.registry.counter('recallbricks_identity_violations_total', 'Total number of identity violations detected');
241
+ this.identityCorrectionsTotal = this.registry.counter('recallbricks_identity_corrections_total', 'Total number of identity corrections applied');
242
+ this.circuitBreakerState = this.registry.gauge('recallbricks_circuit_breaker_state', 'Circuit breaker state (0=closed, 1=half-open, 2=open)');
243
+ this.circuitBreakerTrips = this.registry.counter('recallbricks_circuit_breaker_trips_total', 'Total number of circuit breaker trips');
244
+ this.uptimeSeconds = this.registry.gauge('recallbricks_uptime_seconds', 'Uptime in seconds');
245
+ this.memoryUsageBytes = this.registry.gauge('recallbricks_memory_usage_bytes', 'Memory usage in bytes');
246
+ this.cpuUsagePercent = this.registry.gauge('recallbricks_cpu_usage_percent', 'CPU usage percentage');
247
+ this.startSystemMetricsCollection();
248
+ }
249
+ startSystemMetricsCollection() {
250
+ const startTime = Date.now();
251
+ setInterval(() => {
252
+ this.uptimeSeconds.set((Date.now() - startTime) / 1000);
253
+ const memUsage = process.memoryUsage();
254
+ this.memoryUsageBytes.set(memUsage.heapUsed);
255
+ const cpuUsage = process.cpuUsage();
256
+ const totalUsage = cpuUsage.user + cpuUsage.system;
257
+ this.cpuUsagePercent.set(totalUsage / 10000);
258
+ }, 5000);
259
+ }
260
+ exportPrometheus() {
261
+ return this.registry.export();
262
+ }
263
+ getSummary() {
264
+ return this.registry.getSummary();
265
+ }
266
+ resetAll() {
267
+ this.registry.resetAll();
268
+ }
269
+ }
270
+ exports.RuntimeMetrics = RuntimeMetrics;
271
+ //# sourceMappingURL=Metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Metrics.js","sourceRoot":"","sources":["../../src/core/Metrics.ts"],"names":[],"mappings":"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"}