@stackmemoryai/stackmemory 0.2.8 → 0.2.9

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 (57) hide show
  1. package/dist/src/core/context/compaction-handler.d.ts.map +1 -1
  2. package/dist/src/core/context/compaction-handler.js +1 -1
  3. package/dist/src/core/context/compaction-handler.js.map +1 -1
  4. package/dist/src/core/digest/hybrid-digest-generator.d.ts +76 -0
  5. package/dist/src/core/digest/hybrid-digest-generator.d.ts.map +1 -0
  6. package/dist/src/core/digest/hybrid-digest-generator.js +629 -0
  7. package/dist/src/core/digest/hybrid-digest-generator.js.map +1 -0
  8. package/dist/src/core/digest/index.d.ts +7 -0
  9. package/dist/src/core/digest/index.d.ts.map +1 -0
  10. package/dist/src/core/digest/index.js +7 -0
  11. package/dist/src/core/digest/index.js.map +1 -0
  12. package/dist/src/core/digest/types.d.ts +154 -0
  13. package/dist/src/core/digest/types.d.ts.map +1 -0
  14. package/dist/src/core/digest/types.js +18 -0
  15. package/dist/src/core/digest/types.js.map +1 -0
  16. package/dist/src/core/monitoring/logger.d.ts +2 -2
  17. package/dist/src/core/monitoring/logger.d.ts.map +1 -1
  18. package/dist/src/core/monitoring/logger.js +10 -5
  19. package/dist/src/core/monitoring/logger.js.map +1 -1
  20. package/dist/src/core/monitoring/metrics.d.ts +3 -0
  21. package/dist/src/core/monitoring/metrics.d.ts.map +1 -1
  22. package/dist/src/core/monitoring/metrics.js +142 -3
  23. package/dist/src/core/monitoring/metrics.js.map +1 -1
  24. package/dist/src/core/persistence/postgres-adapter.d.ts +31 -0
  25. package/dist/src/core/persistence/postgres-adapter.d.ts.map +1 -0
  26. package/dist/src/core/persistence/postgres-adapter.js +316 -0
  27. package/dist/src/core/persistence/postgres-adapter.js.map +1 -0
  28. package/dist/src/core/trace/trace-detector.demo.js +5 -5
  29. package/dist/src/core/trace/trace-detector.demo.js.map +1 -1
  30. package/dist/src/core/types.d.ts +35 -0
  31. package/dist/src/core/types.d.ts.map +1 -0
  32. package/dist/src/core/types.js +2 -0
  33. package/dist/src/core/types.js.map +1 -0
  34. package/dist/src/integrations/mcp/server.js +2 -2
  35. package/dist/src/integrations/mcp/server.js.map +1 -1
  36. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts +48 -0
  37. package/dist/src/integrations/pg-aiguide/embedding-provider.d.ts.map +1 -0
  38. package/dist/src/integrations/pg-aiguide/embedding-provider.js +190 -0
  39. package/dist/src/integrations/pg-aiguide/embedding-provider.js.map +1 -0
  40. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts +34 -0
  41. package/dist/src/integrations/pg-aiguide/semantic-search.d.ts.map +1 -0
  42. package/dist/src/integrations/pg-aiguide/semantic-search.js +154 -0
  43. package/dist/src/integrations/pg-aiguide/semantic-search.js.map +1 -0
  44. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts +44 -0
  45. package/dist/src/integrations/pg-aiguide/timescale-analytics.d.ts.map +1 -0
  46. package/dist/src/integrations/pg-aiguide/timescale-analytics.js +215 -0
  47. package/dist/src/integrations/pg-aiguide/timescale-analytics.js.map +1 -0
  48. package/dist/src/models/user.model.d.ts +55 -0
  49. package/dist/src/models/user.model.d.ts.map +1 -0
  50. package/dist/src/models/user.model.js +263 -0
  51. package/dist/src/models/user.model.js.map +1 -0
  52. package/dist/src/servers/production/auth-middleware.d.ts +7 -0
  53. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  54. package/dist/src/servers/production/auth-middleware.js +201 -26
  55. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  56. package/dist/src/servers/railway/index.js.map +1 -1
  57. package/package.json +6 -1
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hybrid Digest Generation Module
3
+ * 80% deterministic extraction, 20% AI review/insights
4
+ */
5
+ export * from './types.js';
6
+ export * from './hybrid-digest-generator.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/digest/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Types for Hybrid Digest Generation System
3
+ * 80% deterministic extraction, 20% AI-generated review/insights
4
+ */
5
+ import { Frame, Anchor, Event } from '../context/frame-manager.js';
6
+ /**
7
+ * Deterministic fields extracted directly from frame data (60%)
8
+ */
9
+ export interface DeterministicDigest {
10
+ /** Files that were modified during this frame */
11
+ filesModified: FileModification[];
12
+ /** Tests that were run */
13
+ testsRun: TestResult[];
14
+ /** Errors encountered */
15
+ errorsEncountered: ErrorInfo[];
16
+ /** Number of tool calls made */
17
+ toolCallCount: number;
18
+ /** Tool calls by type */
19
+ toolCallsByType: Record<string, number>;
20
+ /** Frame duration in seconds */
21
+ durationSeconds: number;
22
+ /** Exit status */
23
+ exitStatus: 'success' | 'failure' | 'partial' | 'cancelled';
24
+ /** Anchors by type */
25
+ anchorCounts: Record<string, number>;
26
+ /** Key decisions made (extracted from DECISION anchors) */
27
+ decisions: string[];
28
+ /** Constraints established (extracted from CONSTRAINT anchors) */
29
+ constraints: string[];
30
+ /** Risks identified (extracted from RISK anchors) */
31
+ risks: string[];
32
+ }
33
+ export interface FileModification {
34
+ path: string;
35
+ operation: 'create' | 'modify' | 'delete' | 'read';
36
+ linesChanged?: number;
37
+ }
38
+ export interface TestResult {
39
+ name: string;
40
+ status: 'passed' | 'failed' | 'skipped';
41
+ duration?: number;
42
+ }
43
+ export interface ErrorInfo {
44
+ type: string;
45
+ message: string;
46
+ resolved: boolean;
47
+ count: number;
48
+ }
49
+ /**
50
+ * AI-generated review fields (20%)
51
+ * Focused on high-value insights only
52
+ */
53
+ export interface AIGeneratedDigest {
54
+ /** One-line summary of what was accomplished */
55
+ summary: string;
56
+ /** Key insight or learning (if any) */
57
+ insight?: string;
58
+ /** Potential issue or risk spotted */
59
+ flaggedIssue?: string;
60
+ /** Generated at timestamp */
61
+ generatedAt: number;
62
+ /** Model used for generation */
63
+ modelUsed?: string;
64
+ /** Tokens used */
65
+ tokensUsed?: number;
66
+ }
67
+ /**
68
+ * Complete hybrid digest combining both approaches
69
+ */
70
+ export interface HybridDigest {
71
+ /** Frame identifier */
72
+ frameId: string;
73
+ /** Frame name/goal */
74
+ frameName: string;
75
+ /** Frame type */
76
+ frameType: string;
77
+ /** Deterministic fields (always available) */
78
+ deterministic: DeterministicDigest;
79
+ /** AI-generated fields (may be pending) */
80
+ aiGenerated?: AIGeneratedDigest;
81
+ /** Processing status */
82
+ status: DigestStatus;
83
+ /** Human-readable text representation */
84
+ text: string;
85
+ /** Version for schema evolution */
86
+ version: number;
87
+ /** Created timestamp */
88
+ createdAt: number;
89
+ /** Last updated timestamp */
90
+ updatedAt: number;
91
+ }
92
+ export type DigestStatus = 'deterministic_only' | 'ai_pending' | 'ai_processing' | 'complete' | 'ai_failed';
93
+ /**
94
+ * Digest generation request for the queue
95
+ */
96
+ export interface DigestGenerationRequest {
97
+ frameId: string;
98
+ frameName: string;
99
+ frameType: string;
100
+ priority: 'low' | 'normal' | 'high';
101
+ createdAt: number;
102
+ retryCount: number;
103
+ maxRetries: number;
104
+ }
105
+ /**
106
+ * Configuration for the digest generator
107
+ */
108
+ export interface DigestConfig {
109
+ /** Enable AI generation (can be disabled for deterministic-only mode) */
110
+ enableAIGeneration: boolean;
111
+ /** Maximum tokens for AI summary */
112
+ maxTokens: number;
113
+ /** Batch size for idle processing */
114
+ batchSize: number;
115
+ /** Idle threshold in ms before processing queue */
116
+ idleThresholdMs: number;
117
+ /** Maximum retries for failed AI generation */
118
+ maxRetries: number;
119
+ /** Retry delay in ms */
120
+ retryDelayMs: number;
121
+ /** LLM provider configuration */
122
+ llmConfig: {
123
+ provider: 'anthropic' | 'openai' | 'local' | 'none';
124
+ model: string;
125
+ temperature: number;
126
+ };
127
+ }
128
+ export declare const DEFAULT_DIGEST_CONFIG: DigestConfig;
129
+ /**
130
+ * Input for digest generation
131
+ */
132
+ export interface DigestInput {
133
+ frame: Frame;
134
+ anchors: Anchor[];
135
+ events: Event[];
136
+ parentDigest?: HybridDigest;
137
+ }
138
+ /**
139
+ * LLM provider interface for AI digest generation
140
+ */
141
+ export interface DigestLLMProvider {
142
+ generateSummary(input: DigestInput, deterministic: DeterministicDigest, maxTokens: number): Promise<AIGeneratedDigest>;
143
+ }
144
+ /**
145
+ * Digest queue statistics
146
+ */
147
+ export interface DigestQueueStats {
148
+ pending: number;
149
+ processing: number;
150
+ completed: number;
151
+ failed: number;
152
+ avgProcessingTimeMs: number;
153
+ }
154
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/digest/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Types for Hybrid Digest Generation System
3
+ * 80% deterministic extraction, 20% AI-generated review/insights
4
+ */
5
+ export const DEFAULT_DIGEST_CONFIG = {
6
+ enableAIGeneration: true,
7
+ maxTokens: 100, // Reduced for 20% AI contribution
8
+ batchSize: 10, // Process more at once since smaller
9
+ idleThresholdMs: 3000, // 3 seconds of idle time
10
+ maxRetries: 2,
11
+ retryDelayMs: 1000,
12
+ llmConfig: {
13
+ provider: 'anthropic',
14
+ model: 'claude-3-haiku-20240307',
15
+ temperature: 0.2, // Lower for more consistent output
16
+ },
17
+ };
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/digest/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4IH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,kBAAkB,EAAE,IAAI;IACxB,SAAS,EAAE,GAAG,EAAE,kCAAkC;IAClD,SAAS,EAAE,EAAE,EAAE,qCAAqC;IACpD,eAAe,EAAE,IAAI,EAAE,yBAAyB;IAChD,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE;QACT,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,GAAG,EAAE,mCAAmC;KACtD;CACF,CAAC"}
@@ -15,8 +15,8 @@ export declare class Logger {
15
15
  static getInstance(): Logger;
16
16
  private ensureLogDirectory;
17
17
  private writeLog;
18
- error(message: string, error?: Error, context?: Record<string, unknown>): void;
19
- warn(message: string, context?: Record<string, unknown>): void;
18
+ error(message: string, errorOrContext?: Error | Record<string, unknown>, context?: Record<string, unknown>): void;
19
+ warn(message: string, errorOrContext?: Error | Record<string, unknown>): void;
20
20
  info(message: string, context?: Record<string, unknown>): void;
21
21
  debug(message: string, context?: Record<string, unknown>): void;
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../src/core/monitoring/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAUD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAS;IAEzB,OAAO;IA0BP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,QAAQ;IAgChB,KAAK,CACH,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,KAAK,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;IAUP,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAQhE;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../src/core/monitoring/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAUD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAS;IAEzB,OAAO;IA0BP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,QAAQ;IAgChB,KAAK,CACH,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;IAWP,IAAI,CACF,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C,IAAI;IAaP,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAQhE;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
@@ -82,21 +82,26 @@ export class Logger {
82
82
  }
83
83
  }
84
84
  }
85
- error(message, error, context) {
85
+ error(message, errorOrContext, context) {
86
+ const isError = errorOrContext instanceof Error;
86
87
  this.writeLog({
87
88
  timestamp: new Date().toISOString(),
88
89
  level: LogLevel.ERROR,
89
90
  message,
90
- context,
91
- error,
91
+ context: isError ? context : errorOrContext,
92
+ error: isError ? errorOrContext : undefined,
92
93
  });
93
94
  }
94
- warn(message, context) {
95
+ warn(message, errorOrContext) {
96
+ const isError = errorOrContext instanceof Error;
95
97
  this.writeLog({
96
98
  timestamp: new Date().toISOString(),
97
99
  level: LogLevel.WARN,
98
100
  message,
99
- context,
101
+ context: isError
102
+ ? undefined
103
+ : errorOrContext,
104
+ error: isError ? errorOrContext : undefined,
100
105
  });
101
106
  }
102
107
  info(message, context) {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/core/monitoring/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../src/core/monitoring/logger.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,9 @@ export declare class Metrics {
2
2
  static record(metric: string, value: number, tags?: Record<string, string>): Promise<void>;
3
3
  static increment(metric: string, tags?: Record<string, string>): Promise<void>;
4
4
  static timing(metric: string, duration: number, tags?: Record<string, string>): Promise<void>;
5
+ static getStats(metric?: string): Record<string, any>;
6
+ static reset(): void;
7
+ static on(event: string, listener: (...args: any[]) => void): void;
5
8
  }
6
9
  export declare const metrics: typeof Metrics;
7
10
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../../src/core/monitoring/metrics.ts"],"names":[],"mappings":"AAAA,qBAAa,OAAO;WACL,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;WAIH,SAAS,CACpB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;WAIH,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;CAGjB;AAED,eAAO,MAAM,OAAO,gBAAU,CAAC"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../../src/core/monitoring/metrics.ts"],"names":[],"mappings":"AAyLA,qBAAa,OAAO;WACL,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;WAIH,SAAS,CACpB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;WAIH,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAIhB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIrD,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;CAGnE;AAED,eAAO,MAAM,OAAO,gBAAU,CAAC"}
@@ -1,12 +1,151 @@
1
+ import { EventEmitter } from 'events';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { logger } from './logger.js';
5
+ class MetricsCollector extends EventEmitter {
6
+ metrics = [];
7
+ metricsFile;
8
+ flushInterval = null;
9
+ aggregates = new Map();
10
+ constructor() {
11
+ super();
12
+ // Set up metrics file if enabled
13
+ if (process.env.STACKMEMORY_METRICS_ENABLED === 'true') {
14
+ const metricsDir = path.join(process.env.HOME || '.', '.stackmemory', 'metrics');
15
+ if (!fs.existsSync(metricsDir)) {
16
+ fs.mkdirSync(metricsDir, { recursive: true });
17
+ }
18
+ this.metricsFile = path.join(metricsDir, `metrics-${new Date().toISOString().split('T')[0]}.jsonl`);
19
+ // Flush metrics every 30 seconds
20
+ this.flushInterval = setInterval(() => this.flush(), 30000);
21
+ }
22
+ }
23
+ async record(metric, value, tags) {
24
+ const entry = {
25
+ timestamp: new Date(),
26
+ metric,
27
+ value,
28
+ type: 'gauge',
29
+ tags,
30
+ };
31
+ this.metrics.push(entry);
32
+ this.updateAggregates(metric, value);
33
+ this.emit('metric', entry);
34
+ // Auto-flush if buffer is large
35
+ if (this.metrics.length > 1000) {
36
+ await this.flush();
37
+ }
38
+ }
39
+ async increment(metric, tags, value = 1) {
40
+ const entry = {
41
+ timestamp: new Date(),
42
+ metric,
43
+ value,
44
+ type: 'counter',
45
+ tags,
46
+ };
47
+ this.metrics.push(entry);
48
+ this.updateAggregates(metric, value);
49
+ this.emit('metric', entry);
50
+ }
51
+ async timing(metric, duration, tags) {
52
+ const entry = {
53
+ timestamp: new Date(),
54
+ metric,
55
+ value: duration,
56
+ type: 'timing',
57
+ tags,
58
+ };
59
+ this.metrics.push(entry);
60
+ this.updateAggregates(metric, duration);
61
+ this.emit('metric', entry);
62
+ }
63
+ updateAggregates(metric, value) {
64
+ const existing = this.aggregates.get(metric) || {
65
+ sum: 0,
66
+ count: 0,
67
+ min: Infinity,
68
+ max: -Infinity,
69
+ };
70
+ this.aggregates.set(metric, {
71
+ sum: existing.sum + value,
72
+ count: existing.count + 1,
73
+ min: Math.min(existing.min, value),
74
+ max: Math.max(existing.max, value),
75
+ });
76
+ }
77
+ async flush() {
78
+ if (this.metrics.length === 0)
79
+ return;
80
+ const toFlush = [...this.metrics];
81
+ this.metrics = [];
82
+ if (this.metricsFile) {
83
+ try {
84
+ const lines = toFlush.map((m) => JSON.stringify(m)).join('\n') + '\n';
85
+ await fs.promises.appendFile(this.metricsFile, lines);
86
+ }
87
+ catch (error) {
88
+ logger.error('Failed to write metrics', error instanceof Error ? error : new Error(String(error)));
89
+ }
90
+ }
91
+ // Emit batch event for external processors
92
+ this.emit('flush', toFlush);
93
+ }
94
+ getStats(metric) {
95
+ if (metric) {
96
+ const stats = this.aggregates.get(metric);
97
+ if (!stats)
98
+ return {};
99
+ return {
100
+ [metric]: {
101
+ ...stats,
102
+ avg: stats.count > 0 ? stats.sum / stats.count : 0,
103
+ },
104
+ };
105
+ }
106
+ const result = {};
107
+ for (const [key, stats] of this.aggregates.entries()) {
108
+ result[key] = {
109
+ ...stats,
110
+ avg: stats.count > 0 ? stats.sum / stats.count : 0,
111
+ };
112
+ }
113
+ return result;
114
+ }
115
+ reset() {
116
+ this.metrics = [];
117
+ this.aggregates.clear();
118
+ }
119
+ destroy() {
120
+ if (this.flushInterval) {
121
+ clearInterval(this.flushInterval);
122
+ this.flushInterval = null;
123
+ }
124
+ this.flush();
125
+ }
126
+ }
127
+ // Singleton instance
128
+ const collector = new MetricsCollector();
129
+ // Cleanup on exit
130
+ process.on('beforeExit', () => collector.destroy());
1
131
  export class Metrics {
2
132
  static async record(metric, value, tags) {
3
- // TODO: Implement metrics recording
133
+ await collector.record(metric, value, tags);
4
134
  }
5
135
  static async increment(metric, tags) {
6
- // TODO: Implement metric increment
136
+ await collector.increment(metric, tags);
7
137
  }
8
138
  static async timing(metric, duration, tags) {
9
- // TODO: Implement timing metrics
139
+ await collector.timing(metric, duration, tags);
140
+ }
141
+ static getStats(metric) {
142
+ return collector.getStats(metric);
143
+ }
144
+ static reset() {
145
+ collector.reset();
146
+ }
147
+ static on(event, listener) {
148
+ collector.on(event, listener);
10
149
  }
11
150
  }
12
151
  export const metrics = Metrics;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../../src/core/monitoring/metrics.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,OAAO;IAClB,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,MAAc,EACd,KAAa,EACb,IAA6B;QAE7B,oCAAoC;IACtC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CACpB,MAAc,EACd,IAA6B;QAE7B,mCAAmC;IACrC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,MAAc,EACd,QAAgB,EAChB,IAA6B;QAE7B,iCAAiC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../../src/core/monitoring/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { PoolConfig } from 'pg';
2
+ import { Database } from 'better-sqlite3';
3
+ import { PersistenceAdapter, QueryResult, TraceData, ContextData } from '../types.js';
4
+ export interface PostgresConfig extends PoolConfig {
5
+ enableTimescale?: boolean;
6
+ enablePgvector?: boolean;
7
+ vectorDimensions?: number;
8
+ }
9
+ export declare class PostgresAdapter implements PersistenceAdapter {
10
+ private pool;
11
+ private config;
12
+ private isInitialized;
13
+ constructor(config: PostgresConfig);
14
+ connect(): Promise<void>;
15
+ disconnect(): Promise<void>;
16
+ execute(query: string, params?: any[]): Promise<QueryResult>;
17
+ beginTransaction(): Promise<void>;
18
+ commit(): Promise<void>;
19
+ rollback(): Promise<void>;
20
+ isConnected(): boolean;
21
+ private initialize;
22
+ private createBaseSchema;
23
+ private enableTimescale;
24
+ private enablePgvector;
25
+ saveTrace(trace: TraceData): Promise<void>;
26
+ saveContext(context: ContextData): Promise<void>;
27
+ getRecentTraces(sessionId: string, limit?: number): Promise<TraceData[]>;
28
+ getRecentContext(projectId: string, branch?: string, limit?: number): Promise<ContextData[]>;
29
+ migrateFromSQLite(sqliteDb: Database): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=postgres-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../../../src/core/persistence/postgres-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAgC,MAAM,IAAI,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,eAAgB,YAAW,kBAAkB;IACxD,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,cAAc;IAQ5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAexB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAqB5D,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,WAAW,IAAI,OAAO;YAIR,UAAU;YAaV,gBAAgB;YA+DhB,eAAe;YA6Bf,cAAc;IAiCtB,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1C,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBrE,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,GACT,OAAO,CAAC,WAAW,EAAE,CAAC;IA0BnB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuG3D"}