@revenium/perplexity 2.0.4 → 2.0.5

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 (205) hide show
  1. package/CHANGELOG.md +32 -33
  2. package/README.md +120 -101
  3. package/SECURITY.md +34 -0
  4. package/dist/cjs/constants/models.js +38 -0
  5. package/dist/cjs/constants/models.js.map +1 -0
  6. package/dist/cjs/core/client/index.js +13 -0
  7. package/dist/cjs/core/client/index.js.map +1 -0
  8. package/dist/cjs/core/client/manager.js +85 -0
  9. package/dist/cjs/core/client/manager.js.map +1 -0
  10. package/dist/cjs/core/config/index.js +21 -0
  11. package/dist/cjs/core/config/index.js.map +1 -0
  12. package/dist/cjs/core/config/loader.js +48 -0
  13. package/dist/cjs/core/config/loader.js.map +1 -0
  14. package/dist/cjs/core/config/manager.js +77 -0
  15. package/dist/cjs/core/config/manager.js.map +1 -0
  16. package/dist/cjs/core/config/validator.js +45 -0
  17. package/dist/cjs/core/config/validator.js.map +1 -0
  18. package/dist/cjs/core/middleware/index.js +14 -0
  19. package/dist/cjs/core/middleware/index.js.map +1 -0
  20. package/dist/cjs/core/middleware/interfaces.js +94 -0
  21. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  22. package/dist/cjs/core/middleware/revenium-client.js +44 -0
  23. package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
  24. package/dist/cjs/core/middleware/streaming-wrapper.js +80 -0
  25. package/dist/cjs/core/middleware/streaming-wrapper.js.map +1 -0
  26. package/dist/cjs/core/providers/detector.js +38 -0
  27. package/dist/cjs/core/providers/detector.js.map +1 -0
  28. package/dist/cjs/core/providers/index.js +14 -0
  29. package/dist/cjs/core/providers/index.js.map +1 -0
  30. package/dist/cjs/core/tracking/api-client.js +67 -0
  31. package/dist/cjs/core/tracking/api-client.js.map +1 -0
  32. package/dist/cjs/core/tracking/index.js +21 -0
  33. package/dist/cjs/core/tracking/index.js.map +1 -0
  34. package/dist/cjs/core/tracking/payload-builder.js +95 -0
  35. package/dist/cjs/core/tracking/payload-builder.js.map +1 -0
  36. package/dist/cjs/core/tracking/usage-tracker.js +83 -0
  37. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -0
  38. package/dist/cjs/index.js +60 -59
  39. package/dist/cjs/index.js.map +1 -1
  40. package/dist/cjs/types/function-parameters.js +14 -0
  41. package/dist/cjs/types/function-parameters.js.map +1 -0
  42. package/dist/cjs/types/index.js +20 -1
  43. package/dist/cjs/types/index.js.map +1 -1
  44. package/dist/cjs/utils/constants.js +20 -0
  45. package/dist/cjs/utils/constants.js.map +1 -0
  46. package/dist/cjs/utils/error-handler.js +194 -0
  47. package/dist/cjs/utils/error-handler.js.map +1 -0
  48. package/dist/cjs/utils/metadata-builder.js +191 -0
  49. package/dist/cjs/utils/metadata-builder.js.map +1 -0
  50. package/dist/cjs/utils/stop-reason-mapper.js +74 -0
  51. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -0
  52. package/dist/cjs/utils/transaction-id.js +19 -0
  53. package/dist/cjs/utils/transaction-id.js.map +1 -0
  54. package/dist/cjs/utils/url-builder.js +57 -0
  55. package/dist/cjs/utils/url-builder.js.map +1 -0
  56. package/dist/esm/constants/models.js +35 -0
  57. package/dist/esm/constants/models.js.map +1 -0
  58. package/dist/esm/core/client/index.js +5 -0
  59. package/dist/esm/core/client/index.js.map +1 -0
  60. package/dist/esm/core/client/manager.js +78 -0
  61. package/dist/esm/core/client/manager.js.map +1 -0
  62. package/dist/esm/core/config/index.js +11 -0
  63. package/dist/esm/core/config/index.js.map +1 -0
  64. package/dist/esm/core/config/loader.js +45 -0
  65. package/dist/esm/core/config/loader.js.map +1 -0
  66. package/dist/esm/core/config/manager.js +70 -0
  67. package/dist/esm/core/config/manager.js.map +1 -0
  68. package/dist/esm/core/config/validator.js +42 -0
  69. package/dist/esm/core/config/validator.js.map +1 -0
  70. package/dist/esm/core/middleware/index.js +7 -0
  71. package/dist/esm/core/middleware/index.js.map +1 -0
  72. package/dist/esm/core/middleware/interfaces.js +89 -0
  73. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  74. package/dist/esm/core/middleware/revenium-client.js +37 -0
  75. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  76. package/dist/esm/core/middleware/streaming-wrapper.js +76 -0
  77. package/dist/esm/core/middleware/streaming-wrapper.js.map +1 -0
  78. package/dist/esm/core/providers/detector.js +34 -0
  79. package/dist/esm/core/providers/detector.js.map +1 -0
  80. package/dist/esm/core/providers/index.js +9 -0
  81. package/dist/esm/core/providers/index.js.map +1 -0
  82. package/dist/esm/core/tracking/api-client.js +64 -0
  83. package/dist/esm/core/tracking/api-client.js.map +1 -0
  84. package/dist/esm/core/tracking/index.js +13 -0
  85. package/dist/esm/core/tracking/index.js.map +1 -0
  86. package/dist/esm/core/tracking/payload-builder.js +92 -0
  87. package/dist/esm/core/tracking/payload-builder.js.map +1 -0
  88. package/dist/esm/core/tracking/usage-tracker.js +79 -0
  89. package/dist/esm/core/tracking/usage-tracker.js.map +1 -0
  90. package/dist/esm/index.js +46 -39
  91. package/dist/esm/index.js.map +1 -1
  92. package/dist/esm/types/function-parameters.js +13 -0
  93. package/dist/esm/types/function-parameters.js.map +1 -0
  94. package/dist/esm/types/index.js +6 -2
  95. package/dist/esm/types/index.js.map +1 -1
  96. package/dist/esm/utils/constants.js +17 -0
  97. package/dist/esm/utils/constants.js.map +1 -0
  98. package/dist/esm/utils/error-handler.js +182 -0
  99. package/dist/esm/utils/error-handler.js.map +1 -0
  100. package/dist/esm/utils/metadata-builder.js +183 -0
  101. package/dist/esm/utils/metadata-builder.js.map +1 -0
  102. package/dist/esm/utils/stop-reason-mapper.js +69 -0
  103. package/dist/esm/utils/stop-reason-mapper.js.map +1 -0
  104. package/dist/esm/utils/transaction-id.js +16 -0
  105. package/dist/esm/utils/transaction-id.js.map +1 -0
  106. package/dist/esm/utils/url-builder.js +53 -0
  107. package/dist/esm/utils/url-builder.js.map +1 -0
  108. package/dist/types/constants/models.d.ts +39 -0
  109. package/dist/types/constants/models.d.ts.map +1 -0
  110. package/dist/types/core/client/index.d.ts +5 -0
  111. package/dist/types/core/client/index.d.ts.map +1 -0
  112. package/dist/types/core/client/manager.d.ts +44 -0
  113. package/dist/types/core/client/manager.d.ts.map +1 -0
  114. package/dist/types/core/config/index.d.ts +10 -0
  115. package/dist/types/core/config/index.d.ts.map +1 -0
  116. package/dist/types/core/config/loader.d.ts +13 -0
  117. package/dist/types/core/config/loader.d.ts.map +1 -0
  118. package/dist/types/core/config/manager.d.ts +28 -0
  119. package/dist/types/core/config/manager.d.ts.map +1 -0
  120. package/dist/types/core/config/validator.d.ts +12 -0
  121. package/dist/types/core/config/validator.d.ts.map +1 -0
  122. package/dist/types/core/middleware/index.d.ts +7 -0
  123. package/dist/types/core/middleware/index.d.ts.map +1 -0
  124. package/dist/types/core/middleware/interfaces.d.ts +35 -0
  125. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  126. package/dist/types/core/middleware/revenium-client.d.ts +25 -0
  127. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  128. package/dist/types/core/middleware/streaming-wrapper.d.ts +21 -0
  129. package/dist/types/core/middleware/streaming-wrapper.d.ts.map +1 -0
  130. package/dist/types/core/providers/detector.d.ts +24 -0
  131. package/dist/types/core/providers/detector.d.ts.map +1 -0
  132. package/dist/types/core/providers/index.d.ts +8 -0
  133. package/dist/types/core/providers/index.d.ts.map +1 -0
  134. package/dist/types/core/tracking/api-client.d.ts +17 -0
  135. package/dist/types/core/tracking/api-client.d.ts.map +1 -0
  136. package/dist/types/core/tracking/index.d.ts +11 -0
  137. package/dist/types/core/tracking/index.d.ts.map +1 -0
  138. package/dist/types/core/tracking/payload-builder.d.ts +24 -0
  139. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -0
  140. package/dist/types/core/tracking/usage-tracker.d.ts +30 -0
  141. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -0
  142. package/dist/types/index.d.ts +56 -27
  143. package/dist/types/index.d.ts.map +1 -1
  144. package/dist/types/types/function-parameters.d.ts +185 -0
  145. package/dist/types/types/function-parameters.d.ts.map +1 -0
  146. package/dist/types/types/index.d.ts +108 -129
  147. package/dist/types/types/index.d.ts.map +1 -1
  148. package/dist/types/utils/constants.d.ts +9 -0
  149. package/dist/types/utils/constants.d.ts.map +1 -0
  150. package/dist/types/utils/error-handler.d.ts +95 -0
  151. package/dist/types/utils/error-handler.d.ts.map +1 -0
  152. package/dist/types/utils/metadata-builder.d.ts +65 -0
  153. package/dist/types/utils/metadata-builder.d.ts.map +1 -0
  154. package/dist/types/utils/stop-reason-mapper.d.ts +29 -0
  155. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -0
  156. package/dist/types/utils/transaction-id.d.ts +14 -0
  157. package/dist/types/utils/transaction-id.d.ts.map +1 -0
  158. package/dist/types/utils/url-builder.d.ts +22 -0
  159. package/dist/types/utils/url-builder.d.ts.map +1 -0
  160. package/examples/README.md +124 -220
  161. package/examples/advanced.ts +123 -0
  162. package/examples/basic.ts +32 -37
  163. package/examples/getting_started.ts +26 -49
  164. package/examples/metadata.ts +51 -48
  165. package/examples/stream.ts +53 -0
  166. package/package.json +9 -10
  167. package/dist/cjs/constants.js +0 -70
  168. package/dist/cjs/constants.js.map +0 -1
  169. package/dist/cjs/core/config/perplexity-config.js +0 -45
  170. package/dist/cjs/core/config/perplexity-config.js.map +0 -1
  171. package/dist/cjs/core/config/revenium-config.js +0 -80
  172. package/dist/cjs/core/config/revenium-config.js.map +0 -1
  173. package/dist/cjs/core/tracking/metering.js +0 -211
  174. package/dist/cjs/core/tracking/metering.js.map +0 -1
  175. package/dist/cjs/core/wrapper/perplexity-client.js +0 -187
  176. package/dist/cjs/core/wrapper/perplexity-client.js.map +0 -1
  177. package/dist/cjs/utils/logger.js +0 -23
  178. package/dist/cjs/utils/logger.js.map +0 -1
  179. package/dist/esm/constants.js +0 -67
  180. package/dist/esm/constants.js.map +0 -1
  181. package/dist/esm/core/config/perplexity-config.js +0 -40
  182. package/dist/esm/core/config/perplexity-config.js.map +0 -1
  183. package/dist/esm/core/config/revenium-config.js +0 -72
  184. package/dist/esm/core/config/revenium-config.js.map +0 -1
  185. package/dist/esm/core/tracking/metering.js +0 -206
  186. package/dist/esm/core/tracking/metering.js.map +0 -1
  187. package/dist/esm/core/wrapper/perplexity-client.js +0 -180
  188. package/dist/esm/core/wrapper/perplexity-client.js.map +0 -1
  189. package/dist/esm/utils/logger.js +0 -20
  190. package/dist/esm/utils/logger.js.map +0 -1
  191. package/dist/types/constants.d.ts +0 -67
  192. package/dist/types/constants.d.ts.map +0 -1
  193. package/dist/types/core/config/perplexity-config.d.ts +0 -24
  194. package/dist/types/core/config/perplexity-config.d.ts.map +0 -1
  195. package/dist/types/core/config/revenium-config.d.ts +0 -37
  196. package/dist/types/core/config/revenium-config.d.ts.map +0 -1
  197. package/dist/types/core/tracking/metering.d.ts +0 -31
  198. package/dist/types/core/tracking/metering.d.ts.map +0 -1
  199. package/dist/types/core/wrapper/perplexity-client.d.ts +0 -32
  200. package/dist/types/core/wrapper/perplexity-client.d.ts.map +0 -1
  201. package/dist/types/utils/logger.d.ts +0 -10
  202. package/dist/types/utils/logger.d.ts.map +0 -1
  203. package/examples/advanced-features.ts +0 -148
  204. package/examples/chat.ts +0 -73
  205. package/examples/streaming.ts +0 -50
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Metadata Builder Utilities
4
+ *
5
+ * Centralized metadata handling to eliminate repetitive spreading
6
+ * and provide consistent metadata processing across the codebase.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildMetadataFields = buildMetadataFields;
10
+ exports.validateMetadata = validateMetadata;
11
+ exports.mergeMetadata = mergeMetadata;
12
+ exports.extractMetadata = extractMetadata;
13
+ exports.createLoggingContext = createLoggingContext;
14
+ exports.sanitizeMetadataForLogging = sanitizeMetadataForLogging;
15
+ /**
16
+ * Metadata mapping configuration
17
+ * Maps UsageMetadata fields to payload fields with optional transformations
18
+ * Subscriber object is passed through directly without transformation
19
+ */
20
+ const METADATA_FIELD_MAP = [
21
+ { source: 'traceId' },
22
+ { source: 'taskType' },
23
+ { source: 'agent' },
24
+ { source: 'organizationId' },
25
+ { source: 'productId' },
26
+ { source: 'subscriber' }, // Pass through nested subscriber object directly
27
+ { source: 'subscriptionId' },
28
+ {
29
+ source: 'responseQualityScore',
30
+ transform: (value) => {
31
+ // Ensure quality score is between 0.0 and 1.0 (API spec requirement)
32
+ if (typeof value === 'number')
33
+ return Math.max(0, Math.min(1, value));
34
+ return value;
35
+ },
36
+ },
37
+ ];
38
+ /**
39
+ * Build metadata object for payload inclusion
40
+ *
41
+ * This function eliminates the repetitive spreading pattern and provides
42
+ * a clean, testable way to handle metadata transformation.
43
+ * Subscriber object is passed through directly without transformation.
44
+ *
45
+ * @param usageMetadata - Source metadata from request
46
+ * @returns Clean metadata object for payload
47
+ */
48
+ function buildMetadataFields(usageMetadata) {
49
+ if (!usageMetadata)
50
+ return {};
51
+ const result = {};
52
+ // Process all metadata fields including nested subscriber object
53
+ for (const config of METADATA_FIELD_MAP) {
54
+ const value = usageMetadata[config.source];
55
+ // Skip undefined values (but allow null, empty strings, objects, etc.)
56
+ if (value === undefined)
57
+ continue;
58
+ // Apply transformation if configured
59
+ const transformedValue = config.transform ? config.transform(value) : value;
60
+ // Use target field name or default to source
61
+ const targetField = config.target || config.source;
62
+ result[targetField] = transformedValue;
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Validate metadata completeness for specific use cases
68
+ *
69
+ * @param usageMetadata - Metadata to validate
70
+ * @param requiredFields - List of required field names
71
+ * @returns Validation result
72
+ */
73
+ function validateMetadata(usageMetadata, requiredFields = []) {
74
+ const missingFields = [];
75
+ const warnings = [];
76
+ if (!usageMetadata && requiredFields.length > 0) {
77
+ return {
78
+ isValid: false,
79
+ missingFields: requiredFields,
80
+ warnings: ['No metadata provided'],
81
+ };
82
+ }
83
+ if (usageMetadata) {
84
+ // Check required fields
85
+ for (const field of requiredFields) {
86
+ if (!usageMetadata[field])
87
+ missingFields.push(String(field));
88
+ }
89
+ // Check for common issues
90
+ if (usageMetadata.responseQualityScore) {
91
+ const score = usageMetadata.responseQualityScore;
92
+ // API Spec: https://revenium.readme.io/reference/meter_ai_completion (responseQualityScore)
93
+ // "typically on a 0.0-1.0 scale"
94
+ if (typeof score !== 'number' || score < 0 || score > 1) {
95
+ warnings.push('responseQualityScore should be a number between 0.0 and 1.0');
96
+ }
97
+ }
98
+ if (usageMetadata.subscriber?.email && !usageMetadata.subscriber.email.includes('@')) {
99
+ warnings.push('subscriber.email does not appear to be a valid email address');
100
+ }
101
+ }
102
+ return {
103
+ isValid: missingFields.length === 0,
104
+ missingFields,
105
+ warnings,
106
+ };
107
+ }
108
+ /**
109
+ * Merge multiple metadata sources with priority
110
+ *
111
+ * @param sources - Metadata sources in priority order (first wins)
112
+ * @returns Merged metadata object
113
+ */
114
+ function mergeMetadata(...sources) {
115
+ const result = {};
116
+ // Process sources in reverse order so first source wins
117
+ for (const source of sources.reverse()) {
118
+ if (source)
119
+ Object.assign(result, source);
120
+ }
121
+ return result;
122
+ }
123
+ /**
124
+ * Extract metadata from request parameters safely
125
+ *
126
+ * @param params - Request parameters that might contain usageMetadata
127
+ * @returns Extracted metadata and cleaned parameters
128
+ */
129
+ function extractMetadata(params) {
130
+ const { usageMetadata, ...cleanParams } = params;
131
+ return {
132
+ metadata: usageMetadata,
133
+ cleanParams: cleanParams,
134
+ };
135
+ }
136
+ /**
137
+ * Create a metadata context for consistent logging
138
+ * Uses sanitization to protect PII (emails are masked)
139
+ *
140
+ * @param usageMetadata - Source metadata
141
+ * @returns Logging context object with sanitized PII
142
+ */
143
+ function createLoggingContext(usageMetadata) {
144
+ if (!usageMetadata)
145
+ return {};
146
+ // Use sanitizer to protect PII in logs
147
+ const sanitized = sanitizeMetadataForLogging(usageMetadata);
148
+ const sanitizedSubscriber = sanitized.subscriber;
149
+ return {
150
+ traceId: usageMetadata.traceId,
151
+ taskType: usageMetadata.taskType,
152
+ subscriberId: usageMetadata.subscriber?.id,
153
+ subscriberEmail: sanitizedSubscriber?.email, // ← Now masked: us***@example.com
154
+ organizationId: usageMetadata.organizationId,
155
+ productId: usageMetadata.productId,
156
+ agent: usageMetadata.agent,
157
+ };
158
+ }
159
+ /**
160
+ * Sanitize metadata for logging (remove sensitive fields)
161
+ *
162
+ * @param usageMetadata - Source metadata
163
+ * @returns Sanitized metadata safe for logging
164
+ */
165
+ function sanitizeMetadataForLogging(usageMetadata) {
166
+ if (!usageMetadata)
167
+ return {};
168
+ // Create a copy and handle nested subscriber object
169
+ const { subscriber, ...safeMetadata } = usageMetadata;
170
+ const result = { ...safeMetadata };
171
+ // Sanitize subscriber object if present
172
+ if (subscriber) {
173
+ const sanitizedSubscriber = {};
174
+ if (subscriber.id) {
175
+ sanitizedSubscriber.id = subscriber.id;
176
+ }
177
+ if (subscriber.email) {
178
+ // Mask email: handles single-char emails (a@x.com → a***@x.com)
179
+ sanitizedSubscriber.email = subscriber.email.replace(/(.{1,2}).*(@.*)/, '$1***$2');
180
+ }
181
+ if (subscriber.credential) {
182
+ sanitizedSubscriber.credential = {
183
+ name: subscriber.credential.name,
184
+ value: '[REDACTED]',
185
+ };
186
+ }
187
+ result.subscriber = sanitizedSubscriber;
188
+ }
189
+ return result;
190
+ }
191
+ //# sourceMappingURL=metadata-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-builder.js","sourceRoot":"","sources":["../../../src/utils/metadata-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Stop Reason Mapper Utilities
4
+ *
5
+ * Centralized stop reason mapping logic using lookup tables
6
+ * instead of nested conditionals. Based on the good example
7
+ * from the anthropic-node middleware.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.mapStopReason = mapStopReason;
11
+ exports.getSupportedStopReasons = getSupportedStopReasons;
12
+ exports.isStopReasonSupported = isStopReasonSupported;
13
+ /**
14
+ * Stop reason mapping configuration
15
+ * Maps provider-specific stop reasons to Revenium's standardized set
16
+ */
17
+ const STOP_REASON_MAP = {
18
+ // OpenAI/Azure OpenAI stop reasons
19
+ stop: 'END',
20
+ function_call: 'END_SEQUENCE',
21
+ tool_calls: 'END_SEQUENCE',
22
+ timeout: 'TIMEOUT',
23
+ length: 'TOKEN_LIMIT',
24
+ max_tokens: 'TOKEN_LIMIT',
25
+ cost_limit: 'COST_LIMIT',
26
+ completion_limit: 'COMPLETION_LIMIT',
27
+ content_filter: 'ERROR',
28
+ error: 'ERROR',
29
+ cancelled: 'CANCELLED',
30
+ canceled: 'CANCELLED', // Handle both spellings
31
+ // Anthropic stop reasons (for consistency across middleware)
32
+ end_turn: 'END',
33
+ stop_sequence: 'END_SEQUENCE',
34
+ tool_use: 'END_SEQUENCE',
35
+ };
36
+ /**
37
+ * Default stop reason when mapping fails
38
+ */
39
+ const DEFAULT_STOP_REASON = 'END';
40
+ /**
41
+ * Map provider stop reasons to Revenium stop reasons
42
+ *
43
+ * This replaces the nested if/switch logic with a clean lookup table approach.
44
+ * Based on the good example from the anthropic-node middleware.
45
+ *
46
+ * @param providerStopReason - Stop reason from the AI provider
47
+ * @param logger - Optional logger for warnings about unknown reasons
48
+ * @returns Standardized Revenium stop reason
49
+ */
50
+ function mapStopReason(providerStopReason, logger) {
51
+ if (!providerStopReason)
52
+ return DEFAULT_STOP_REASON;
53
+ const normalizedReason = providerStopReason.toLowerCase();
54
+ const mappedReason = STOP_REASON_MAP[normalizedReason];
55
+ if (!mappedReason) {
56
+ // Log warning for unknown stop reasons to help with future mapping
57
+ logger?.warn(`Unknown stop reason: ${providerStopReason}, mapping to ${DEFAULT_STOP_REASON}`);
58
+ return DEFAULT_STOP_REASON;
59
+ }
60
+ return mappedReason;
61
+ }
62
+ /**
63
+ * Get all supported stop reasons for documentation/testing
64
+ */
65
+ function getSupportedStopReasons() {
66
+ return Object.keys(STOP_REASON_MAP);
67
+ }
68
+ /**
69
+ * Check if a stop reason is supported
70
+ */
71
+ function isStopReasonSupported(reason) {
72
+ return reason.toLowerCase() in STOP_REASON_MAP;
73
+ }
74
+ //# sourceMappingURL=stop-reason-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-reason-mapper.js","sourceRoot":"","sources":["../../../src/utils/stop-reason-mapper.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA0CH,sCAeC;AAKD,0DAEC;AAKD,sDAEC;AArED;;;GAGG;AACH,MAAM,eAAe,GAA2B;IAC9C,mCAAmC;IACnC,IAAI,EAAE,KAAK;IACX,aAAa,EAAE,cAAc;IAC7B,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,aAAa;IACrB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,YAAY;IACxB,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,WAAW,EAAG,wBAAwB;IAEhD,6DAA6D;IAC7D,QAAQ,EAAE,KAAK;IACf,aAAa,EAAE,cAAc;IAC7B,QAAQ,EAAE,cAAc;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAC3B,kBAA6C,EAC7C,MAA4D;IAE5D,IAAI,CAAC,kBAAkB;QAAE,OAAO,mBAAmB,CAAC;IACpD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAEvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,mEAAmE;QACnE,MAAM,EAAE,IAAI,CAAC,wBAAwB,kBAAkB,gBAAgB,mBAAmB,EAAE,CAAC,CAAC;QAC9F,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,MAAc;IAClD,OAAO,MAAM,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC;AACjD,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ /**
3
+ * Transaction ID Generator
4
+ *
5
+ * Generates unique transaction IDs for tracking requests.
6
+ * Format: txn_{timestamp}_{random}
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.generateTransactionId = generateTransactionId;
10
+ /**
11
+ * Generate a unique transaction ID
12
+ *
13
+ * @returns A unique transaction ID in format: txn_{timestamp}_{random}
14
+ *
15
+ */
16
+ function generateTransactionId() {
17
+ return `txn_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
18
+ }
19
+ //# sourceMappingURL=transaction-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-id.js","sourceRoot":"","sources":["../../../src/utils/transaction-id.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAQH,sDAEC;AARD;;;;;GAKG;AACH,SAAgB,qBAAqB;IACnC,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * URL Builder Utilities
4
+ *
5
+ * Centralized URL construction logic to eliminate nested conditionals.
6
+ * Replaces the complex URL building logic from tracking.ts.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildReveniumUrl = buildReveniumUrl;
10
+ exports.isValidUrl = isValidUrl;
11
+ /**
12
+ * Build Revenium API URL with proper path handling
13
+ *
14
+ * @param baseUrl - The base URL from configuration (may include /meter or /meter/v2)
15
+ * @param endpoint - The API endpoint to append (e.g., '/ai/completions')
16
+ * @returns Complete URL for the API call
17
+ */
18
+ function buildReveniumUrl(baseUrl, endpoint) {
19
+ // Normalize the base URL by removing trailing slashes
20
+ let normalizedBase = baseUrl.replace(/\/+$/, '');
21
+ // Check if /meter/v2 is already at the end
22
+ const hasMeterV2AtEnd = /\/meter\/v2$/i.test(normalizedBase);
23
+ if (hasMeterV2AtEnd) {
24
+ // Already has /meter/v2, just append endpoint
25
+ return `${normalizedBase}${endpoint}`;
26
+ }
27
+ // Check if /meter is at the end (but not /meter/v2)
28
+ const hasMeterAtEnd = /\/meter$/i.test(normalizedBase);
29
+ if (hasMeterAtEnd) {
30
+ // Has /meter but not /v2, append /v2 and endpoint
31
+ return `${normalizedBase}/v2${endpoint}`;
32
+ }
33
+ // Check if /v2 is at the end (without /meter)
34
+ const hasV2AtEnd = /\/v2$/i.test(normalizedBase);
35
+ if (hasV2AtEnd) {
36
+ // Has /v2 but not /meter, append endpoint as-is
37
+ return `${normalizedBase}${endpoint}`;
38
+ }
39
+ // Has neither /meter nor /v2, append /meter/v2 and endpoint
40
+ return `${normalizedBase}/meter/v2${endpoint}`;
41
+ }
42
+ /**
43
+ * Validate URL format
44
+ *
45
+ * @param url - URL to validate
46
+ * @returns true if valid, false otherwise
47
+ */
48
+ function isValidUrl(url) {
49
+ try {
50
+ new URL(url);
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ //# sourceMappingURL=url-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../../src/utils/url-builder.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AASH,4CA2BC;AAQD,gCAOC;AAjDD;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,OAAe,EAAE,QAAgB;IAChE,sDAAsD;IACtD,IAAI,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjD,2CAA2C;IAC3C,MAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7D,IAAI,eAAe,EAAE,CAAC;QACpB,8CAA8C;QAC9C,OAAO,GAAG,cAAc,GAAG,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,oDAAoD;IACpD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACvD,IAAI,aAAa,EAAE,CAAC;QAClB,kDAAkD;QAClD,OAAO,GAAG,cAAc,MAAM,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAED,8CAA8C;IAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,UAAU,EAAE,CAAC;QACf,gDAAgD;QAChD,OAAO,GAAG,cAAc,GAAG,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,4DAA4D;IAC5D,OAAO,GAAG,cAAc,YAAY,QAAQ,EAAE,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Perplexity Model Constants
3
+ *
4
+ * Official model names for Perplexity AI.
5
+ * Use these constants instead of hardcoding model strings.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { PERPLEXITY_MODELS } from "@revenium/perplexity";
10
+ *
11
+ * const response = await client.chat().completions().create({
12
+ * model: PERPLEXITY_MODELS.SONAR_PRO,
13
+ * messages: [{ role: "user", content: "Hello!" }]
14
+ * });
15
+ * ```
16
+ */
17
+ /**
18
+ * Available Perplexity AI models
19
+ * @see https://docs.perplexity.ai/docs/model-cards
20
+ */
21
+ export const PERPLEXITY_MODELS = {
22
+ /**
23
+ * Sonar Pro - Most capable model for complex queries
24
+ */
25
+ SONAR_PRO: "sonar-pro",
26
+ /**
27
+ * Sonar - Standard model for most use cases
28
+ */
29
+ SONAR: "sonar",
30
+ /**
31
+ * Sonar Reasoning - Specialized for reasoning tasks
32
+ */
33
+ SONAR_REASONING: "sonar-reasoning",
34
+ };
35
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/constants/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;;OAEG;IACH,SAAS,EAAE,WAAoB;IAE/B;;OAEG;IACH,KAAK,EAAE,OAAgB;IAEvB;;OAEG;IACH,eAAe,EAAE,iBAA0B;CACnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Client module exports
3
+ */
4
+ export { Initialize, GetClient, IsInitialized, Reset, Configure } from "./manager.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Client Manager - singleton pattern
3
+ *
4
+ * Provides Initialize/GetClient pattern.
5
+ * Manages singleton instance of ReveniumPerplexity client.
6
+ *
7
+ */
8
+ import { ReveniumPerplexity } from "../middleware/revenium-client.js";
9
+ import { initializeConfig, getLogger } from "../config/manager.js";
10
+ import { validateConfig } from "../config/validator.js";
11
+ /**
12
+ * Singleton instance of ReveniumPerplexity client
13
+ */
14
+ let clientInstance = null;
15
+ const logger = getLogger();
16
+ /**
17
+ * Initialize Revenium Perplexity client from environment variables
18
+ *
19
+ * Loads configuration from environment:
20
+ * - REVENIUM_METERING_API_KEY (required)
21
+ * - PERPLEXITY_API_KEY (required)
22
+ * @throws {Error} If required environment variables are missing
23
+ */
24
+ export function Initialize() {
25
+ logger.debug("Initializing Revenium Perplexity client");
26
+ const config = initializeConfig();
27
+ Configure(config);
28
+ logger.debug("Revenium Perplexity client initialized successfully");
29
+ }
30
+ /**
31
+ * Configure Revenium Perplexity client with custom configuration
32
+ *
33
+ * @param config - Configuration object
34
+ * @throws {Error} If required configuration fields are missing
35
+ *
36
+ */
37
+ export function Configure(config) {
38
+ logger.debug("Configuring Revenium Perplexity client");
39
+ // Validate configuration (including API key formats)
40
+ validateConfig(config);
41
+ const fullConfig = {
42
+ ...config,
43
+ reveniumBaseUrl: config.reveniumBaseUrl || "https://api.revenium.ai",
44
+ perplexityBaseUrl: config.perplexityBaseUrl || "https://api.perplexity.ai",
45
+ debug: config.debug ?? false,
46
+ };
47
+ clientInstance = new ReveniumPerplexity(fullConfig);
48
+ if (fullConfig.debug) {
49
+ logger.debug("Revenium Perplexity client initialized successfully");
50
+ }
51
+ }
52
+ /**
53
+ * Get the singleton ReveniumPerplexity client instance
54
+ *
55
+ * @returns {ReveniumPerplexity} The client instance
56
+ * @throws {Error} If client has not been initialized
57
+ *
58
+ */
59
+ export function GetClient() {
60
+ if (!clientInstance) {
61
+ throw new Error("Revenium Perplexity client not initialized. Call Initialize() or Configure() first.");
62
+ }
63
+ return clientInstance;
64
+ }
65
+ /**
66
+ * Check if client has been initialized
67
+ * @returns {boolean} True if client is initialized
68
+ */
69
+ export function IsInitialized() {
70
+ return clientInstance !== null;
71
+ }
72
+ /**
73
+ * Reset the client instance (useful for testing)
74
+ */
75
+ export function Reset() {
76
+ clientInstance = null;
77
+ }
78
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/core/client/manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;GAEG;AACH,IAAI,cAAc,GAA8B,IAAI,CAAC;AACrD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAG3B;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,SAAS,CAAC,MAAM,CAAC,CAAC;IAElB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAEvD,qDAAqD;IACrD,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAmB;QACjC,GAAG,MAAM;QACT,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,yBAAyB;QACpE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,2BAA2B;QAC1E,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;KAC7B,CAAC;IAEF,cAAc,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,cAAc,KAAK,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Configuration module - Main exports
3
+ *
4
+ * This module provides a clean interface for configuration management.
5
+ * Aligned with OpenAI modular implementation.
6
+ */
7
+ // Re-export all configuration functionality
8
+ export { loadConfigFromEnv } from './loader.js';
9
+ export { validateConfig } from './validator.js';
10
+ export { getConfig, setConfig, getLogger, initializeConfig, defaultLogger, } from './manager.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/config/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4CAA4C;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,cAAc,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Configuration Loader Module
3
+ *
4
+ * Handles loading configuration from environment variables.
5
+ * Separated from validation and management for single responsibility.
6
+ */
7
+ import { config as loadDotenv } from "dotenv";
8
+ /**
9
+ * Default URLs for consistency with other middleware
10
+ */
11
+ const DEFAULT_REVENIUM_BASE_URL = "https://api.revenium.ai";
12
+ const DEFAULT_PERPLEXITY_BASE_URL = "https://api.perplexity.ai";
13
+ /**
14
+ * Flag to track if .env file has been loaded
15
+ */
16
+ let envFileLoaded = false;
17
+ /**
18
+ * Load configuration from environment variables
19
+ * Automatically loads .env file from current directory if present
20
+ */
21
+ export function loadConfigFromEnv() {
22
+ if (!envFileLoaded) {
23
+ loadDotenv();
24
+ envFileLoaded = true;
25
+ }
26
+ const reveniumApiKey = process.env.REVENIUM_METERING_API_KEY || process.env.REVENIUM_API_KEY;
27
+ const reveniumBaseUrl = process.env.REVENIUM_METERING_BASE_URL ||
28
+ process.env.REVENIUM_BASE_URL ||
29
+ DEFAULT_REVENIUM_BASE_URL;
30
+ const perplexityApiKey = process.env.PERPLEXITY_API_KEY;
31
+ const perplexityBaseUrl = process.env.PERPLEXITY_API_BASE_URL || DEFAULT_PERPLEXITY_BASE_URL;
32
+ const debug = process.env.REVENIUM_DEBUG === "true";
33
+ if (!reveniumApiKey)
34
+ return null;
35
+ if (!perplexityApiKey)
36
+ return null;
37
+ return {
38
+ reveniumApiKey,
39
+ reveniumBaseUrl,
40
+ perplexityApiKey,
41
+ perplexityBaseUrl,
42
+ debug,
43
+ };
44
+ }
45
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/core/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9C;;GAEG;AACH,MAAM,yBAAyB,GAAG,yBAAyB,CAAC;AAC5D,MAAM,2BAA2B,GAAG,2BAA2B,CAAC;AAEhE;;GAEG;AACH,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,UAAU,EAAE,CAAC;QACb,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACxE,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,yBAAyB,CAAC;IAC5B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxD,MAAM,iBAAiB,GACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,2BAA2B,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC;IAEpD,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,cAAc;QACd,eAAe;QACf,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Configuration Manager Module
3
+ *
4
+ * Handles global configuration state management and logging.
5
+ * Aligned with OpenAI modular implementation.
6
+ */
7
+ import { loadConfigFromEnv } from "./loader.js";
8
+ import { validateConfig } from "./validator.js";
9
+ /**
10
+ * Global configuration instance
11
+ */
12
+ let globalConfig = null;
13
+ /**
14
+ * Default console logger implementation
15
+ */
16
+ export const defaultLogger = {
17
+ debug: (message, ...args) => {
18
+ if (globalConfig?.debug || process.env.REVENIUM_DEBUG === "true") {
19
+ console.debug(`[Revenium Debug] ${message}`, ...args);
20
+ }
21
+ },
22
+ info: (message, ...args) => {
23
+ console.info(`[Revenium] ${message}`, ...args);
24
+ },
25
+ warn: (message, ...args) => {
26
+ console.warn(`[Revenium Warning] ${message}`, ...args);
27
+ },
28
+ error: (message, ...args) => {
29
+ console.error(`[Revenium Error] ${message}`, ...args);
30
+ },
31
+ };
32
+ let globalLogger = defaultLogger;
33
+ /**
34
+ * Get the current global configuration
35
+ */
36
+ export function getConfig() {
37
+ return globalConfig;
38
+ }
39
+ /**
40
+ * Set the global configuration
41
+ */
42
+ export function setConfig(config) {
43
+ validateConfig(config);
44
+ globalConfig = config;
45
+ globalLogger.debug("Revenium configuration updated", {
46
+ baseUrl: config.reveniumBaseUrl,
47
+ hasReveniumKey: !!config.reveniumApiKey,
48
+ hasPerplexityKey: !!config.perplexityApiKey,
49
+ });
50
+ }
51
+ /**
52
+ * Get the current logger
53
+ */
54
+ export function getLogger() {
55
+ return globalLogger;
56
+ }
57
+ /**
58
+ * Initialize configuration from environment variables
59
+ */
60
+ export function initializeConfig() {
61
+ const envConfig = loadConfigFromEnv();
62
+ if (!envConfig) {
63
+ globalLogger.error("Failed to load configuration from environment. Ensure REVENIUM_METERING_API_KEY and PERPLEXITY_API_KEY are set.");
64
+ throw new Error("Failed to load configuration from environment. Ensure REVENIUM_METERING_API_KEY and PERPLEXITY_API_KEY are set.");
65
+ }
66
+ setConfig(envConfig);
67
+ globalLogger.debug("Revenium middleware initialized from environment variables");
68
+ return envConfig;
69
+ }
70
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/core/config/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD;;GAEG;AACH,IAAI,YAAY,GAA0B,IAAI,CAAC;AAG/C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,IAAI,YAAY,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,OAAO,CAAC,IAAI,CAAC,cAAc,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC5C,OAAO,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;QAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;CACF,CAAC;AAEF,IAAI,YAAY,GAAW,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,YAAY,GAAG,MAAM,CAAC;IACtB,YAAY,CAAC,KAAK,CAAC,gCAAgC,EAAE;QACnD,OAAO,EAAE,MAAM,CAAC,eAAe;QAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACvC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB;KAC5C,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,CAChB,iHAAiH,CAClH,CAAC;QACF,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,SAAS,CAAC,CAAC;IACrB,YAAY,CAAC,KAAK,CAChB,4DAA4D,CAC7D,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}