@umituz/react-native-ai-groq-provider 1.0.28 → 1.0.29

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 (83) hide show
  1. package/dist/application/use-cases/chat-generation.usecase.d.ts +11 -0
  2. package/dist/application/use-cases/chat-generation.usecase.d.ts.map +1 -0
  3. package/dist/application/use-cases/chat-generation.usecase.js +40 -0
  4. package/dist/application/use-cases/chat-generation.usecase.js.map +1 -0
  5. package/dist/application/use-cases/chat-session.usecase.d.ts +41 -0
  6. package/dist/application/use-cases/chat-session.usecase.d.ts.map +1 -0
  7. package/dist/application/use-cases/chat-session.usecase.js +138 -0
  8. package/dist/application/use-cases/chat-session.usecase.js.map +1 -0
  9. package/dist/application/use-cases/streaming.usecase.d.ts +17 -0
  10. package/dist/application/use-cases/streaming.usecase.d.ts.map +1 -0
  11. package/dist/application/use-cases/streaming.usecase.js +46 -0
  12. package/dist/application/use-cases/streaming.usecase.js.map +1 -0
  13. package/dist/application/use-cases/structured-generation.usecase.d.ts +14 -0
  14. package/dist/application/use-cases/structured-generation.usecase.d.ts.map +1 -0
  15. package/dist/application/use-cases/structured-generation.usecase.js +77 -0
  16. package/dist/application/use-cases/structured-generation.usecase.js.map +1 -0
  17. package/dist/application/use-cases/text-generation.usecase.d.ts +11 -0
  18. package/dist/application/use-cases/text-generation.usecase.d.ts.map +1 -0
  19. package/dist/application/use-cases/text-generation.usecase.js +36 -0
  20. package/dist/application/use-cases/text-generation.usecase.js.map +1 -0
  21. package/dist/domain/entities/error.types.d.ts +3 -1
  22. package/dist/domain/entities/error.types.d.ts.map +1 -1
  23. package/dist/domain/entities/error.types.js +12 -2
  24. package/dist/domain/entities/error.types.js.map +1 -1
  25. package/dist/index.d.ts +20 -16
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +61 -39
  28. package/dist/index.js.map +1 -1
  29. package/dist/infrastructure/http/groq-http-client.d.ts +22 -0
  30. package/dist/infrastructure/http/groq-http-client.d.ts.map +1 -0
  31. package/dist/infrastructure/http/groq-http-client.js +166 -0
  32. package/dist/infrastructure/http/groq-http-client.js.map +1 -0
  33. package/dist/infrastructure/http/streaming-client.d.ts +12 -0
  34. package/dist/infrastructure/http/streaming-client.d.ts.map +1 -0
  35. package/dist/infrastructure/http/streaming-client.js +148 -0
  36. package/dist/infrastructure/http/streaming-client.js.map +1 -0
  37. package/dist/infrastructure/telemetry/TelemetryHooks.d.ts +16 -4
  38. package/dist/infrastructure/telemetry/TelemetryHooks.d.ts.map +1 -1
  39. package/dist/infrastructure/telemetry/TelemetryHooks.js +44 -11
  40. package/dist/infrastructure/telemetry/TelemetryHooks.js.map +1 -1
  41. package/dist/infrastructure/utils/async/execute-state.util.d.ts +6 -2
  42. package/dist/infrastructure/utils/async/execute-state.util.d.ts.map +1 -1
  43. package/dist/infrastructure/utils/async/execute-state.util.js +29 -4
  44. package/dist/infrastructure/utils/async/execute-state.util.js.map +1 -1
  45. package/dist/infrastructure/utils/calculation.util.d.ts +61 -0
  46. package/dist/infrastructure/utils/calculation.util.d.ts.map +1 -0
  47. package/dist/infrastructure/utils/calculation.util.js +165 -0
  48. package/dist/infrastructure/utils/calculation.util.js.map +1 -0
  49. package/dist/infrastructure/utils/content-mapper.util.d.ts +5 -1
  50. package/dist/infrastructure/utils/content-mapper.util.d.ts.map +1 -1
  51. package/dist/infrastructure/utils/content-mapper.util.js +17 -0
  52. package/dist/infrastructure/utils/content-mapper.util.js.map +1 -1
  53. package/dist/presentation/hooks/use-groq.hook.d.ts +26 -0
  54. package/dist/presentation/hooks/use-groq.hook.d.ts.map +1 -0
  55. package/dist/presentation/hooks/use-groq.hook.js +151 -0
  56. package/dist/presentation/hooks/use-groq.hook.js.map +1 -0
  57. package/dist/providers/ConfigBuilder.d.ts +1 -57
  58. package/dist/providers/ConfigBuilder.d.ts.map +1 -1
  59. package/dist/providers/ConfigBuilder.js +2 -68
  60. package/dist/providers/ConfigBuilder.js.map +1 -1
  61. package/dist/providers/ProviderFactory.d.ts +4 -34
  62. package/dist/providers/ProviderFactory.d.ts.map +1 -1
  63. package/dist/providers/ProviderFactory.js +9 -50
  64. package/dist/providers/ProviderFactory.js.map +1 -1
  65. package/dist/shared/logger.d.ts +26 -0
  66. package/dist/shared/logger.d.ts.map +1 -0
  67. package/dist/shared/logger.js +52 -0
  68. package/dist/shared/logger.js.map +1 -0
  69. package/dist/shared/request-builder.d.ts +17 -0
  70. package/dist/shared/request-builder.d.ts.map +1 -0
  71. package/dist/shared/request-builder.js +54 -0
  72. package/dist/shared/request-builder.js.map +1 -0
  73. package/dist/shared/response-handler.d.ts +38 -0
  74. package/dist/shared/response-handler.d.ts.map +1 -0
  75. package/dist/shared/response-handler.js +69 -0
  76. package/dist/shared/response-handler.js.map +1 -0
  77. package/dist/shared/timer.d.ts +20 -0
  78. package/dist/shared/timer.d.ts.map +1 -0
  79. package/dist/shared/timer.js +32 -0
  80. package/dist/shared/timer.js.map +1 -0
  81. package/package.json +1 -1
  82. package/src/application/use-cases/chat-generation.usecase.ts +55 -0
  83. package/src/index.ts +1 -0
@@ -2,17 +2,22 @@
2
2
  /**
3
3
  * Telemetry Hooks
4
4
  * Simple telemetry tracking for Groq operations
5
+ * Optimized with O(1) circular buffer
5
6
  */
6
7
  Object.defineProperty(exports, "__esModule", { value: true });
7
8
  exports.telemetry = void 0;
8
9
  exports.useTelemetry = useTelemetry;
10
+ const react_1 = require("react");
9
11
  class Telemetry {
10
12
  constructor() {
11
13
  this.events = [];
12
- this.enabled = __DEV__;
14
+ this.MAX_EVENTS = 1000;
15
+ this.head = 0; // Write position
16
+ this.count = 0; // Actual number of events
17
+ this.enabled = typeof __DEV__ !== "undefined" && __DEV__;
13
18
  }
14
19
  /**
15
- * Log a telemetry event
20
+ * Log a telemetry event - O(1) operation
16
21
  */
17
22
  log(name, data) {
18
23
  if (!this.enabled)
@@ -22,28 +27,48 @@ class Telemetry {
22
27
  timestamp: Date.now(),
23
28
  data,
24
29
  };
25
- this.events.push(event);
26
- if (__DEV__) {
27
- console.log(`[Groq Telemetry] ${name}`, data);
30
+ // Circular buffer: O(1) write
31
+ this.events[this.head] = event;
32
+ this.head = (this.head + 1) % this.MAX_EVENTS;
33
+ if (this.count < this.MAX_EVENTS) {
34
+ this.count++;
28
35
  }
29
36
  }
30
37
  /**
31
- * Get all events
38
+ * Get all events in chronological order
39
+ * Returns frozen array to prevent external mutations
32
40
  */
33
41
  getEvents() {
34
- return [...this.events];
42
+ if (this.count === 0) {
43
+ return Object.freeze([]);
44
+ }
45
+ // O(n) but only when called, not on every log
46
+ if (this.count < this.MAX_EVENTS) {
47
+ // Not wrapped yet, just return slice
48
+ return Object.freeze(this.events.slice(0, this.count));
49
+ }
50
+ // Wrapped around - need to reorder
51
+ const result = new Array(this.count);
52
+ for (let i = 0; i < this.count; i++) {
53
+ result[i] = this.events[(this.head + i) % this.MAX_EVENTS];
54
+ }
55
+ return Object.freeze(result);
35
56
  }
36
57
  /**
37
- * Clear all events
58
+ * Clear all events - O(1)
38
59
  */
39
60
  clear() {
40
- this.events = [];
61
+ this.head = 0;
62
+ this.count = 0;
41
63
  }
42
64
  /**
43
65
  * Enable/disable telemetry
44
66
  */
45
67
  setEnabled(enabled) {
46
68
  this.enabled = enabled;
69
+ if (!enabled) {
70
+ this.clear();
71
+ }
47
72
  }
48
73
  /**
49
74
  * Check if telemetry is enabled
@@ -51,6 +76,12 @@ class Telemetry {
51
76
  isEnabled() {
52
77
  return this.enabled;
53
78
  }
79
+ /**
80
+ * Get event count - O(1)
81
+ */
82
+ getEventCount() {
83
+ return this.count;
84
+ }
54
85
  }
55
86
  /**
56
87
  * Singleton instance
@@ -58,13 +89,15 @@ class Telemetry {
58
89
  exports.telemetry = new Telemetry();
59
90
  /**
60
91
  * Hook to use telemetry in components
92
+ * Memoized to prevent unnecessary re-renders
61
93
  */
62
94
  function useTelemetry() {
63
- return {
95
+ return (0, react_1.useMemo)(() => ({
64
96
  log: exports.telemetry.log.bind(exports.telemetry),
65
97
  getEvents: exports.telemetry.getEvents.bind(exports.telemetry),
66
98
  clear: exports.telemetry.clear.bind(exports.telemetry),
67
99
  isEnabled: exports.telemetry.isEnabled.bind(exports.telemetry),
68
- };
100
+ getEventCount: exports.telemetry.getEventCount.bind(exports.telemetry),
101
+ }), []);
69
102
  }
70
103
  //# sourceMappingURL=TelemetryHooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TelemetryHooks.js","sourceRoot":"","sources":["../../../src/infrastructure/telemetry/TelemetryHooks.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAoEH,oCAOC;AAnED,MAAM,SAAS;IAAf;QACU,WAAM,GAAqB,EAAE,CAAC;QAC9B,YAAO,GAAG,OAAO,CAAC;IAgD5B,CAAC;IA9CC;;OAEG;IACH,GAAG,CAAC,IAAY,EAAE,IAA8B;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,KAAK,GAAmB;YAC5B,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI;SACL,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED;;GAEG;AACU,QAAA,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC;;GAEG;AACH,SAAgB,YAAY;IAC1B,OAAO;QACL,GAAG,EAAE,iBAAS,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAS,CAAC;QAClC,SAAS,EAAE,iBAAS,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAS,CAAC;QAC9C,KAAK,EAAE,iBAAS,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAS,CAAC;QACtC,SAAS,EAAE,iBAAS,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAS,CAAC;KAC/C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"TelemetryHooks.js","sourceRoot":"","sources":["../../../src/infrastructure/telemetry/TelemetryHooks.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,11 @@ export interface AsyncCallbacks<T> {
21
21
  */
22
22
  export declare function executeWithState<T>(setters: AsyncStateSetters<T>, asyncFn: () => Promise<T>, callbacks?: AsyncCallbacks<T>): Promise<T>;
23
23
  /**
24
- * Execute async function with retry logic
24
+ * Execute async function with retry logic and exponential backoff
25
+ * @param asyncFn - Function to execute
26
+ * @param maxRetries - Maximum number of retry attempts (default: 3)
27
+ * @param delayMs - Initial delay in milliseconds (default: 1000)
28
+ * @param signal - Optional AbortSignal to cancel retries
25
29
  */
26
- export declare function executeWithRetry<T>(asyncFn: () => Promise<T>, maxRetries?: number, delayMs?: number): Promise<T>;
30
+ export declare function executeWithRetry<T>(asyncFn: () => Promise<T>, maxRetries?: number, delayMs?: number, signal?: AbortSignal): Promise<T>;
27
31
  //# sourceMappingURL=execute-state.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"execute-state.util.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/utils/async/execute-state.util.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,UAAU,GAAE,MAAU,EACtB,OAAO,GAAE,MAAa,GACrB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
1
+ {"version":3,"file":"execute-state.util.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/utils/async/execute-state.util.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,UAAU,GAAE,MAAU,EACtB,OAAO,GAAE,MAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAyCZ"}
@@ -5,6 +5,7 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.executeWithState = executeWithState;
7
7
  exports.executeWithRetry = executeWithRetry;
8
+ const calculation_util_1 = require("../calculation.util");
8
9
  /**
9
10
  * Execute async function with state management
10
11
  */
@@ -29,19 +30,43 @@ async function executeWithState(setters, asyncFn, callbacks) {
29
30
  }
30
31
  }
31
32
  /**
32
- * Execute async function with retry logic
33
+ * Execute async function with retry logic and exponential backoff
34
+ * @param asyncFn - Function to execute
35
+ * @param maxRetries - Maximum number of retry attempts (default: 3)
36
+ * @param delayMs - Initial delay in milliseconds (default: 1000)
37
+ * @param signal - Optional AbortSignal to cancel retries
33
38
  */
34
- async function executeWithRetry(asyncFn, maxRetries = 3, delayMs = 1000) {
39
+ async function executeWithRetry(asyncFn, maxRetries = 3, delayMs = 1000, signal) {
40
+ // Validate inputs
41
+ if (maxRetries < 1) {
42
+ throw new Error("maxRetries must be at least 1");
43
+ }
44
+ if (delayMs < 0) {
45
+ throw new Error("delayMs must be non-negative");
46
+ }
35
47
  let lastError = null;
48
+ const MAX_DELAY_MS = 30000; // Cap at 30 seconds
36
49
  for (let attempt = 0; attempt < maxRetries; attempt++) {
50
+ // Check if aborted
51
+ if (signal?.aborted) {
52
+ throw new Error("Retry operation was aborted");
53
+ }
37
54
  try {
38
55
  return await asyncFn();
39
56
  }
40
57
  catch (error) {
41
58
  lastError = error;
42
59
  if (attempt < maxRetries - 1) {
43
- // Wait before retrying with exponential backoff
44
- await new Promise((resolve) => setTimeout(resolve, delayMs * Math.pow(2, attempt)));
60
+ // Calculate exponential backoff delay using utility
61
+ const delay = (0, calculation_util_1.calculateExponentialBackoff)(delayMs, attempt);
62
+ const cappedDelay = (0, calculation_util_1.clamp)(delay, 0, MAX_DELAY_MS);
63
+ await new Promise((resolve, reject) => {
64
+ const timeoutId = setTimeout(() => resolve(), cappedDelay);
65
+ signal?.addEventListener("abort", () => {
66
+ clearTimeout(timeoutId);
67
+ reject(new Error("Retry operation was aborted during delay"));
68
+ }, { once: true });
69
+ });
45
70
  }
46
71
  }
47
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"execute-state.util.js","sourceRoot":"","sources":["../../../../src/infrastructure/utils/async/execute-state.util.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAsBH,4CAyBC;AAKD,4CAqBC;AAtDD;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAA6B,EAC7B,OAAyB,EACzB,SAA6B;IAE7B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAElD,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAE/B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,SAAS,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvB,SAAS,EAAE,OAAO,EAAE,CAAC,KAAc,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAAyB,EACzB,aAAqB,CAAC,EACtB,UAAkB,IAAI;IAEtB,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAc,CAAC;YAE3B,IAAI,OAAO,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC7B,gDAAgD;gBAChD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"execute-state.util.js","sourceRoot":"","sources":["../../../../src/infrastructure/utils/async/execute-state.util.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA2BH,4CAyBC;AASD,4CA8CC;AAzGD,0DAG6B;AAmB7B;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAA6B,EAC7B,OAAyB,EACzB,SAA6B;IAE7B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAElD,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAE/B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAClB,SAAS,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvB,SAAS,EAAE,OAAO,EAAE,CAAC,KAAc,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAAyB,EACzB,aAAqB,CAAC,EACtB,UAAkB,IAAI,EACtB,MAAoB;IAEpB,kBAAkB;IAClB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,oBAAoB;IAEhD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACtD,mBAAmB;QACnB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAc,CAAC;YAE3B,IAAI,OAAO,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC7B,oDAAoD;gBACpD,MAAM,KAAK,GAAG,IAAA,8CAA2B,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC5D,MAAM,WAAW,GAAG,IAAA,wBAAK,EAAC,KAAK,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;gBAElD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;oBAE3D,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;wBACrC,YAAY,CAAC,SAAS,CAAC,CAAC;wBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;oBAChE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Calculation Utilities
3
+ * Common calculation and utility functions for numeric operations
4
+ * Optimized for performance
5
+ */
6
+ /**
7
+ * Generate a random unique identifier string
8
+ * Uses optimized single-pass operations
9
+ */
10
+ export declare function generateRandomId(length?: number): string;
11
+ /**
12
+ * Generate a unique chat session ID
13
+ */
14
+ export declare function generateSessionId(prefix?: string): string;
15
+ /**
16
+ * Calculate maximum number of messages based on token limit
17
+ */
18
+ export declare function calculateMaxMessages(maxTokens: number, tokensPerMessage?: number): number;
19
+ /**
20
+ * Calculate exponential backoff delay
21
+ */
22
+ export declare function calculateExponentialBackoff(baseDelay: number, attempt: number): number;
23
+ /**
24
+ * Clamp a value between min and max
25
+ */
26
+ export declare function clamp(value: number, min: number, max: number): number;
27
+ /**
28
+ * Calculate percentage with optional decimal places
29
+ * Optimized: avoids string conversion
30
+ */
31
+ export declare function calculatePercentage(value: number, total: number, decimals?: number): number;
32
+ /**
33
+ * Calculate buffer size limit for streaming
34
+ */
35
+ export declare function calculateSafeBufferSize(currentSize: number, maxSize: number): number;
36
+ /**
37
+ * Calculate token estimate from text
38
+ */
39
+ export declare function estimateTokens(text: string): number;
40
+ /**
41
+ * Calculate if message count is within safe limits
42
+ */
43
+ export declare function isWithinSafeLimit(messageCount: number, maxMessages: number): boolean;
44
+ /**
45
+ * Calculate retry delay with jitter
46
+ */
47
+ export declare function calculateRetryDelayWithJitter(baseDelay: number, attempt: number, jitterFactor?: number): number;
48
+ /**
49
+ * Calculate timeout for network requests
50
+ */
51
+ export declare function calculateRequestTimeout(attempt: number, baseTimeout?: number, maxTimeout?: number): number;
52
+ /**
53
+ * Calculate data transfer rate
54
+ */
55
+ export declare function calculateTransferRate(bytes: number, milliseconds: number): number;
56
+ /**
57
+ * Calculate average from array of numbers
58
+ * Optimized: Single pass with inline validation
59
+ */
60
+ export declare function calculateAverage(values: number[]): number;
61
+ //# sourceMappingURL=calculation.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculation.util.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/utils/calculation.util.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,MAAU,GAAG,MAAM,CAI3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAoB,GAAG,MAAM,CAEtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,gBAAgB,GAAE,MAAY,GAC7B,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtF;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAU,GACnB,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAKpF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,MAAY,GACzB,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAa,EAC1B,UAAU,GAAE,MAAc,GACzB,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAOjF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBzD"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Calculation Utilities
4
+ * Common calculation and utility functions for numeric operations
5
+ * Optimized for performance
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateRandomId = generateRandomId;
9
+ exports.generateSessionId = generateSessionId;
10
+ exports.calculateMaxMessages = calculateMaxMessages;
11
+ exports.calculateExponentialBackoff = calculateExponentialBackoff;
12
+ exports.clamp = clamp;
13
+ exports.calculatePercentage = calculatePercentage;
14
+ exports.calculateSafeBufferSize = calculateSafeBufferSize;
15
+ exports.estimateTokens = estimateTokens;
16
+ exports.isWithinSafeLimit = isWithinSafeLimit;
17
+ exports.calculateRetryDelayWithJitter = calculateRetryDelayWithJitter;
18
+ exports.calculateRequestTimeout = calculateRequestTimeout;
19
+ exports.calculateTransferRate = calculateTransferRate;
20
+ exports.calculateAverage = calculateAverage;
21
+ const MAX_RANDOM_ID_LENGTH = 11;
22
+ /**
23
+ * Generate a random unique identifier string
24
+ * Uses optimized single-pass operations
25
+ */
26
+ function generateRandomId(length = 9) {
27
+ const safeLength = Math.min(Math.max(1, Math.floor(length)), MAX_RANDOM_ID_LENGTH);
28
+ const randomStr = Math.random().toString(36).substring(2, 2 + safeLength);
29
+ return randomStr;
30
+ }
31
+ /**
32
+ * Generate a unique chat session ID
33
+ */
34
+ function generateSessionId(prefix = "groq-chat") {
35
+ return `${prefix}-${Date.now()}-${generateRandomId(9)}`;
36
+ }
37
+ /**
38
+ * Calculate maximum number of messages based on token limit
39
+ */
40
+ function calculateMaxMessages(maxTokens, tokensPerMessage = 100) {
41
+ if (!Number.isFinite(maxTokens) || maxTokens <= 0 ||
42
+ !Number.isFinite(tokensPerMessage) || tokensPerMessage <= 0) {
43
+ return 0;
44
+ }
45
+ return Math.floor(maxTokens / tokensPerMessage);
46
+ }
47
+ /**
48
+ * Calculate exponential backoff delay
49
+ */
50
+ function calculateExponentialBackoff(baseDelay, attempt) {
51
+ if (!Number.isFinite(baseDelay) || baseDelay < 0 ||
52
+ !Number.isFinite(attempt) || attempt < 0) {
53
+ return 0;
54
+ }
55
+ return baseDelay * Math.pow(2, attempt);
56
+ }
57
+ /**
58
+ * Clamp a value between min and max
59
+ */
60
+ function clamp(value, min, max) {
61
+ if (!Number.isFinite(value))
62
+ return min;
63
+ if (!Number.isFinite(min))
64
+ return max;
65
+ if (!Number.isFinite(max))
66
+ return value;
67
+ return Math.min(Math.max(value, min), max);
68
+ }
69
+ /**
70
+ * Calculate percentage with optional decimal places
71
+ * Optimized: avoids string conversion
72
+ */
73
+ function calculatePercentage(value, total, decimals = 2) {
74
+ if (!Number.isFinite(value) || !Number.isFinite(total) || total === 0) {
75
+ return 0;
76
+ }
77
+ const multiplier = Math.pow(10, Math.max(0, Math.min(20, Math.floor(decimals))));
78
+ return Math.round((value / total) * 100 * multiplier) / multiplier;
79
+ }
80
+ /**
81
+ * Calculate buffer size limit for streaming
82
+ */
83
+ function calculateSafeBufferSize(currentSize, maxSize) {
84
+ if (!Number.isFinite(currentSize) || !Number.isFinite(maxSize) || maxSize <= 0) {
85
+ return 0;
86
+ }
87
+ if (currentSize > maxSize) {
88
+ return Math.floor(maxSize / 2);
89
+ }
90
+ return currentSize;
91
+ }
92
+ /**
93
+ * Calculate token estimate from text
94
+ */
95
+ function estimateTokens(text) {
96
+ if (!text)
97
+ return 0;
98
+ return Math.ceil(text.length / 4);
99
+ }
100
+ /**
101
+ * Calculate if message count is within safe limits
102
+ */
103
+ function isWithinSafeLimit(messageCount, maxMessages) {
104
+ return Number.isFinite(messageCount) &&
105
+ Number.isFinite(maxMessages) &&
106
+ messageCount >= 0 &&
107
+ messageCount <= maxMessages;
108
+ }
109
+ /**
110
+ * Calculate retry delay with jitter
111
+ */
112
+ function calculateRetryDelayWithJitter(baseDelay, attempt, jitterFactor = 0.1) {
113
+ if (!Number.isFinite(baseDelay) || baseDelay < 0 ||
114
+ !Number.isFinite(attempt) || attempt < 0) {
115
+ return 0;
116
+ }
117
+ const safeJitterFactor = clamp(jitterFactor, 0, 1);
118
+ const exponentialDelay = calculateExponentialBackoff(baseDelay, attempt);
119
+ const jitter = exponentialDelay * safeJitterFactor * (Math.random() * 2 - 1);
120
+ return Math.max(0, exponentialDelay + jitter);
121
+ }
122
+ /**
123
+ * Calculate timeout for network requests
124
+ */
125
+ function calculateRequestTimeout(attempt, baseTimeout = 5000, maxTimeout = 30000) {
126
+ if (!Number.isFinite(attempt) || attempt < 0) {
127
+ return baseTimeout;
128
+ }
129
+ const safeBaseTimeout = Math.max(0, baseTimeout);
130
+ const safeMaxTimeout = Math.max(safeBaseTimeout, maxTimeout);
131
+ const timeout = calculateExponentialBackoff(safeBaseTimeout, attempt);
132
+ return Math.min(timeout, safeMaxTimeout);
133
+ }
134
+ /**
135
+ * Calculate data transfer rate
136
+ */
137
+ function calculateTransferRate(bytes, milliseconds) {
138
+ if (!Number.isFinite(bytes) || bytes < 0 ||
139
+ !Number.isFinite(milliseconds) || milliseconds <= 0) {
140
+ return 0;
141
+ }
142
+ const kilobytesPerSecond = (bytes / 1024) * (1000 / milliseconds);
143
+ return Math.round(kilobytesPerSecond * 100) / 100;
144
+ }
145
+ /**
146
+ * Calculate average from array of numbers
147
+ * Optimized: Single pass with inline validation
148
+ */
149
+ function calculateAverage(values) {
150
+ if (!Array.isArray(values) || values.length === 0) {
151
+ return 0;
152
+ }
153
+ let sum = 0;
154
+ let count = 0;
155
+ // Single pass: validate and sum
156
+ for (let i = 0; i < values.length; i++) {
157
+ const v = values[i];
158
+ if (Number.isFinite(v)) {
159
+ sum += v;
160
+ count++;
161
+ }
162
+ }
163
+ return count === 0 ? 0 : sum / count;
164
+ }
165
+ //# sourceMappingURL=calculation.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculation.util.js","sourceRoot":"","sources":["../../../src/infrastructure/utils/calculation.util.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAQH,4CAIC;AAKD,8CAEC;AAKD,oDASC;AAKD,kEAMC;AAKD,sBAKC;AAMD,kDAUC;AAKD,0DAQC;AAKD,wCAGC;AAKD,8CAKC;AAKD,sEAaC;AAKD,0DAYC;AAKD,sDAOC;AAMD,4CAkBC;AA1KD,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,SAAiB,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,WAAW;IAC5D,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,SAAiB,EACjB,mBAA2B,GAAG;IAE9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAC7C,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAgB,2BAA2B,CAAC,SAAiB,EAAE,OAAe;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;QAC5C,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,KAAa,EACb,KAAa,EACb,WAAmB,CAAC;IAEpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,WAAmB,EAAE,OAAe;IAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,WAAW,GAAG,OAAO,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,YAAoB,EAAE,WAAmB;IACzE,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC7B,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5B,YAAY,IAAI,CAAC;QACjB,YAAY,IAAI,WAAW,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,6BAA6B,CAC3C,SAAiB,EACjB,OAAe,EACf,eAAuB,GAAG;IAE1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;QAC5C,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CACrC,OAAe,EACf,cAAsB,IAAI,EAC1B,aAAqB,KAAK;IAE1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,2BAA2B,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,KAAa,EAAE,YAAoB;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QACpC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,kBAAkB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,MAAgB;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,gCAAgC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,GAAG,IAAI,CAAC,CAAC;YACT,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Content Mapper Utility
3
3
  * Utilities for working with message content
4
4
  */
5
- import type { GroqMessage } from "../../domain/entities";
5
+ import type { GroqMessage } from "../../domain/entities/groq.types";
6
6
  /**
7
7
  * Create a user message
8
8
  */
@@ -31,4 +31,8 @@ export declare function extractTextFromMessages(messages: GroqMessage[]): string
31
31
  * Format messages for display in UI
32
32
  */
33
33
  export declare function formatMessagesForDisplay(messages: GroqMessage[]): string;
34
+ /**
35
+ * Clean JSON response by removing markdown code blocks
36
+ */
37
+ export declare function cleanJsonResponse(content: string): string;
34
38
  //# sourceMappingURL=content-mapper.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-mapper.util.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/utils/content-mapper.util.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAK9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAKnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAKhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,WAAW,GAAG,QAAiB,GAAG,WAAW,CAK9G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAOxE"}
1
+ {"version":3,"file":"content-mapper.util.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/utils/content-mapper.util.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAK9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAKnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAKhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,WAAW,GAAG,QAAiB,GAAG,WAAW,CAK9G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAOxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWzD"}
@@ -11,6 +11,7 @@ exports.createTextMessage = createTextMessage;
11
11
  exports.promptToMessages = promptToMessages;
12
12
  exports.extractTextFromMessages = extractTextFromMessages;
13
13
  exports.formatMessagesForDisplay = formatMessagesForDisplay;
14
+ exports.cleanJsonResponse = cleanJsonResponse;
14
15
  /**
15
16
  * Create a user message
16
17
  */
@@ -81,4 +82,20 @@ function formatMessagesForDisplay(messages) {
81
82
  })
82
83
  .join("\n\n---\n\n");
83
84
  }
85
+ /**
86
+ * Clean JSON response by removing markdown code blocks
87
+ */
88
+ function cleanJsonResponse(content) {
89
+ let cleaned = content.trim();
90
+ if (cleaned.startsWith("```json")) {
91
+ cleaned = cleaned.slice(7);
92
+ }
93
+ else if (cleaned.startsWith("```")) {
94
+ cleaned = cleaned.slice(3);
95
+ }
96
+ if (cleaned.endsWith("```")) {
97
+ cleaned = cleaned.slice(0, -3);
98
+ }
99
+ return cleaned.trim();
100
+ }
84
101
  //# sourceMappingURL=content-mapper.util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-mapper.util.js","sourceRoot":"","sources":["../../../src/infrastructure/utils/content-mapper.util.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,8CAKC;AAKD,wDAKC;AAKD,kDAKC;AAKD,8CAKC;AAKD,4CAgBC;AAKD,0DAEC;AAKD,4DAOC;AA9ED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,OAAe;IACpD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe,EAAE,OAAwC,MAAM;IAC/F,OAAO;QACL,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAc,EAAE,YAAqB;IACpE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;QACZ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAAuB;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,QAAuB;IAC9D,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;QACtF,OAAO,GAAG,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"content-mapper.util.js","sourceRoot":"","sources":["../../../src/infrastructure/utils/content-mapper.util.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,8CAKC;AAKD,wDAKC;AAKD,kDAKC;AAKD,8CAKC;AAKD,4CAgBC;AAKD,0DAEC;AAKD,4DAOC;AAKD,8CAWC;AA9FD;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,OAAe;IACpD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe,EAAE,OAAwC,MAAM;IAC/F,OAAO;QACL,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAc,EAAE,YAAqB;IACpE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;QACZ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAAuB;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,QAAuB;IAC9D,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;QACtF,OAAO,GAAG,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * useGroq Hook
3
+ * Main React hook for Groq text generation
4
+ */
5
+ import type { GroqGenerationConfig } from "../../domain/entities/groq.types";
6
+ export interface UseGroqOptions {
7
+ model?: string;
8
+ generationConfig?: GroqGenerationConfig;
9
+ onStart?: () => void;
10
+ onSuccess?: (result: string) => void;
11
+ onError?: (error: string) => void;
12
+ }
13
+ export interface UseGroqReturn {
14
+ isLoading: boolean;
15
+ error: string | null;
16
+ result: string | null;
17
+ generate: (prompt: string, config?: GroqGenerationConfig) => Promise<string>;
18
+ generateJSON: <T = Record<string, unknown>>(prompt: string, config?: GroqGenerationConfig & {
19
+ schema?: Record<string, unknown>;
20
+ }) => Promise<T>;
21
+ stream: (prompt: string, onChunk: (chunk: string) => void, config?: GroqGenerationConfig) => Promise<void>;
22
+ reset: () => void;
23
+ clearError: () => void;
24
+ }
25
+ export declare function useGroq(options?: UseGroqOptions): UseGroqReturn;
26
+ //# sourceMappingURL=use-groq.hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-groq.hook.d.ts","sourceRoot":"","sources":["../../../src/presentation/hooks/use-groq.hook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAM7E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,YAAY,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,oBAAoB,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KACjE,OAAO,CAAC,CAAC,CAAC,CAAC;IAChB,MAAM,EAAE,CACN,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,MAAM,CAAC,EAAE,oBAAoB,KAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAkKnE"}