@agentica/core 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +1 -1
  2. package/lib/Agentica.d.ts +7 -2
  3. package/lib/Agentica.js +12 -7
  4. package/lib/Agentica.js.map +1 -1
  5. package/lib/MicroAgentica.d.ts +2 -2
  6. package/lib/MicroAgentica.js +4 -4
  7. package/lib/MicroAgentica.js.map +1 -1
  8. package/lib/context/AgenticaContext.d.ts +6 -2
  9. package/lib/context/MicroAgenticaContext.d.ts +2 -2
  10. package/lib/context/index.d.ts +5 -0
  11. package/lib/{structures/mcp → context}/index.js +5 -1
  12. package/lib/context/index.js.map +1 -0
  13. package/lib/events/AgenticaAssistantMessageEvent.d.ts +9 -0
  14. package/lib/{histories/AgenticaUserInputHistory.js → events/AgenticaAssistantMessageEvent.js} +1 -1
  15. package/lib/events/AgenticaAssistantMessageEvent.js.map +1 -0
  16. package/lib/events/AgenticaEvent.d.ts +9 -9
  17. package/lib/events/AgenticaUserMessageEvent.d.ts +9 -0
  18. package/lib/events/{AgenticaUserInputEvent.js → AgenticaUserMessageEvent.js} +1 -1
  19. package/lib/events/AgenticaUserMessageEvent.js.map +1 -0
  20. package/lib/events/MicroAgenticaEvent.d.ts +6 -6
  21. package/lib/events/index.d.ts +14 -0
  22. package/lib/events/index.js +31 -0
  23. package/lib/events/index.js.map +1 -0
  24. package/lib/factory/events.d.ts +8 -8
  25. package/lib/factory/events.js +23 -38
  26. package/lib/factory/events.js.map +1 -1
  27. package/lib/factory/histories.d.ts +1 -36
  28. package/lib/factory/histories.js +77 -24
  29. package/lib/factory/histories.js.map +1 -1
  30. package/lib/functional/assertHttpController.js +6 -6
  31. package/lib/functional/assertHttpLlmApplication.js +6 -6
  32. package/lib/functional/assertMcpController.d.ts +1 -2
  33. package/lib/functional/assertMcpController.js +6 -6
  34. package/lib/functional/assertMcpController.js.map +1 -1
  35. package/lib/functional/index.d.ts +6 -0
  36. package/lib/functional/index.js +23 -0
  37. package/lib/functional/index.js.map +1 -0
  38. package/lib/functional/validateHttpController.js +5 -5
  39. package/lib/functional/validateHttpLlmApplication.js +5 -5
  40. package/lib/functional/validateMcpController.d.ts +1 -2
  41. package/lib/functional/validateMcpController.js +11 -11
  42. package/lib/functional/validateMcpController.js.map +1 -1
  43. package/lib/histories/{AgenticaTextHistory.d.ts → AgenticaAssistantMessageHistory.d.ts} +1 -2
  44. package/lib/histories/AgenticaAssistantMessageHistory.js +3 -0
  45. package/lib/histories/AgenticaAssistantMessageHistory.js.map +1 -0
  46. package/lib/histories/AgenticaHistory.d.ts +7 -7
  47. package/lib/histories/AgenticaUserMessageHistory.d.ts +6 -0
  48. package/lib/{events/AgenticaTextEvent.js → histories/AgenticaUserMessageHistory.js} +1 -1
  49. package/lib/histories/AgenticaUserMessageHistory.js.map +1 -0
  50. package/lib/histories/MicroAgenticaHistory.d.ts +5 -4
  51. package/lib/histories/contents/AgenticaUserMessageAudioContent.d.ts +19 -0
  52. package/lib/histories/contents/AgenticaUserMessageAudioContent.js +3 -0
  53. package/lib/histories/contents/AgenticaUserMessageAudioContent.js.map +1 -0
  54. package/lib/histories/contents/AgenticaUserMessageContent.d.ts +14 -0
  55. package/lib/histories/{AgenticaTextHistory.js → contents/AgenticaUserMessageContent.js} +1 -1
  56. package/lib/histories/contents/AgenticaUserMessageContent.js.map +1 -0
  57. package/lib/histories/contents/AgenticaUserMessageContentBase.d.ts +6 -0
  58. package/lib/histories/contents/AgenticaUserMessageContentBase.js +3 -0
  59. package/lib/histories/contents/AgenticaUserMessageContentBase.js.map +1 -0
  60. package/lib/histories/contents/AgenticaUserMessageFileContent.d.ts +26 -0
  61. package/lib/histories/contents/AgenticaUserMessageFileContent.js +3 -0
  62. package/lib/histories/contents/AgenticaUserMessageFileContent.js.map +1 -0
  63. package/lib/histories/contents/AgenticaUserMessageImageContent.d.ts +20 -0
  64. package/lib/histories/contents/AgenticaUserMessageImageContent.js +3 -0
  65. package/lib/histories/contents/AgenticaUserMessageImageContent.js.map +1 -0
  66. package/lib/histories/contents/AgenticaUserMessageTextContent.d.ts +14 -0
  67. package/lib/histories/contents/AgenticaUserMessageTextContent.js +3 -0
  68. package/lib/histories/contents/AgenticaUserMessageTextContent.js.map +1 -0
  69. package/lib/histories/contents/index.d.ts +5 -0
  70. package/lib/histories/contents/index.js +22 -0
  71. package/lib/histories/contents/index.js.map +1 -0
  72. package/lib/histories/index.d.ts +9 -0
  73. package/lib/histories/index.js +26 -0
  74. package/lib/histories/index.js.map +1 -0
  75. package/lib/index.d.ts +6 -45
  76. package/lib/index.js +6 -46
  77. package/lib/index.js.map +1 -1
  78. package/lib/index.mjs +155 -135
  79. package/lib/index.mjs.map +1 -1
  80. package/lib/json/IAgenticaEventJson.d.ts +29 -23
  81. package/lib/json/IAgenticaHistoryJson.d.ts +24 -19
  82. package/lib/json/IMicroAgenticaEventJson.d.ts +1 -1
  83. package/lib/json/IMicroAgenticaHistoryJson.d.ts +1 -1
  84. package/lib/json/index.d.ts +7 -0
  85. package/lib/json/index.js +24 -0
  86. package/lib/json/index.js.map +1 -0
  87. package/lib/orchestrate/call.js +4 -4
  88. package/lib/orchestrate/call.js.map +1 -1
  89. package/lib/orchestrate/cancel.js +1 -1
  90. package/lib/orchestrate/cancel.js.map +1 -1
  91. package/lib/orchestrate/initialize.js +4 -4
  92. package/lib/orchestrate/initialize.js.map +1 -1
  93. package/lib/orchestrate/select.js +3 -3
  94. package/lib/orchestrate/select.js.map +1 -1
  95. package/lib/structures/IAgenticaController.d.ts +1 -2
  96. package/lib/structures/index.d.ts +10 -0
  97. package/lib/structures/index.js +27 -0
  98. package/lib/structures/index.js.map +1 -0
  99. package/lib/transformers/transformEvent.d.ts +1 -0
  100. package/lib/transformers/{AgenticaEventTransformer.js → transformEvent.js} +74 -31
  101. package/lib/transformers/transformEvent.js.map +1 -0
  102. package/lib/transformers/transformHistory.d.ts +1 -0
  103. package/lib/transformers/{AgenticaHistoryTransformer.js → transformHistory.js} +24 -23
  104. package/lib/transformers/transformHistory.js.map +1 -0
  105. package/lib/utils/ChatGptCompletionMessageUtil.js +2 -2
  106. package/lib/utils/ChatGptCompletionMessageUtil.spec.d.ts +1 -0
  107. package/lib/utils/ChatGptCompletionMessageUtil.spec.js +288 -0
  108. package/lib/utils/ChatGptCompletionMessageUtil.spec.js.map +1 -0
  109. package/lib/utils/ChatGptTokenUsageAggregator.spec.d.ts +1 -0
  110. package/lib/utils/ChatGptTokenUsageAggregator.spec.js +199 -0
  111. package/lib/utils/ChatGptTokenUsageAggregator.spec.js.map +1 -0
  112. package/lib/utils/Singleton.js +18 -0
  113. package/lib/utils/Singleton.js.map +1 -1
  114. package/lib/utils/Singleton.spec.d.ts +1 -0
  115. package/lib/utils/Singleton.spec.js +106 -0
  116. package/lib/utils/Singleton.spec.js.map +1 -0
  117. package/lib/utils/__map_take.spec.d.ts +1 -0
  118. package/lib/utils/__map_take.spec.js +108 -0
  119. package/lib/utils/__map_take.spec.js.map +1 -0
  120. package/package.json +5 -6
  121. package/src/Agentica.ts +25 -10
  122. package/src/MicroAgentica.ts +12 -9
  123. package/src/context/AgenticaContext.ts +7 -2
  124. package/src/context/MicroAgenticaContext.ts +2 -2
  125. package/src/context/index.ts +5 -0
  126. package/src/events/AgenticaAssistantMessageEvent.ts +12 -0
  127. package/src/events/AgenticaEvent.ts +15 -15
  128. package/src/events/AgenticaUserMessageEvent.ts +12 -0
  129. package/src/events/MicroAgenticaEvent.ts +9 -9
  130. package/src/events/index.ts +14 -0
  131. package/src/factory/events.ts +29 -34
  132. package/src/factory/histories.ts +81 -32
  133. package/src/functional/assertMcpController.ts +4 -2
  134. package/src/functional/index.ts +7 -0
  135. package/src/functional/validateMcpController.ts +4 -2
  136. package/src/histories/{AgenticaTextHistory.ts → AgenticaAssistantMessageHistory.ts} +4 -2
  137. package/src/histories/AgenticaHistory.ts +8 -8
  138. package/src/histories/AgenticaUserMessageHistory.ts +11 -0
  139. package/src/histories/MicroAgenticaHistory.ts +6 -5
  140. package/src/histories/contents/AgenticaUserMessageAudioContent.ts +21 -0
  141. package/src/histories/contents/AgenticaUserMessageContent.ts +19 -0
  142. package/src/histories/contents/AgenticaUserMessageContentBase.ts +6 -0
  143. package/src/histories/contents/AgenticaUserMessageFileContent.ts +27 -0
  144. package/src/histories/contents/AgenticaUserMessageImageContent.ts +23 -0
  145. package/src/histories/contents/AgenticaUserMessageTextContent.ts +15 -0
  146. package/src/histories/contents/index.ts +5 -0
  147. package/src/histories/index.ts +9 -0
  148. package/src/index.ts +6 -54
  149. package/src/json/IAgenticaEventJson.ts +36 -28
  150. package/src/json/IAgenticaHistoryJson.ts +28 -22
  151. package/src/json/IMicroAgenticaEventJson.ts +2 -1
  152. package/src/json/IMicroAgenticaHistoryJson.ts +2 -1
  153. package/src/json/index.ts +7 -0
  154. package/src/orchestrate/call.ts +8 -8
  155. package/src/orchestrate/cancel.ts +2 -2
  156. package/src/orchestrate/initialize.ts +5 -5
  157. package/src/orchestrate/select.ts +5 -5
  158. package/src/structures/IAgenticaController.ts +4 -2
  159. package/src/structures/index.ts +10 -0
  160. package/src/transformers/{AgenticaEventTransformer.ts → transformEvent.ts} +94 -42
  161. package/src/transformers/{AgenticaHistoryTransformer.ts → transformHistory.ts} +30 -26
  162. package/src/utils/ChatGptCompletionMessageUtil.spec.ts +320 -0
  163. package/src/utils/ChatGptTokenUsageAggregator.spec.ts +226 -0
  164. package/src/utils/Singleton.spec.ts +138 -0
  165. package/src/utils/Singleton.ts +18 -0
  166. package/src/utils/__map_take.spec.ts +140 -0
  167. package/lib/events/AgenticaTextEvent.d.ts +0 -10
  168. package/lib/events/AgenticaTextEvent.js.map +0 -1
  169. package/lib/events/AgenticaUserInputEvent.d.ts +0 -10
  170. package/lib/events/AgenticaUserInputEvent.js.map +0 -1
  171. package/lib/histories/AgenticaTextHistory.js.map +0 -1
  172. package/lib/histories/AgenticaUserInputHistory.d.ts +0 -80
  173. package/lib/histories/AgenticaUserInputHistory.js.map +0 -1
  174. package/lib/structures/mcp/IMcpLlmTransportProps.d.ts +0 -11
  175. package/lib/structures/mcp/IMcpLlmTransportProps.js +0 -3
  176. package/lib/structures/mcp/IMcpLlmTransportProps.js.map +0 -1
  177. package/lib/structures/mcp/index.d.ts +0 -1
  178. package/lib/structures/mcp/index.js.map +0 -1
  179. package/lib/transformers/AgenticaEventTransformer.d.ts +0 -63
  180. package/lib/transformers/AgenticaEventTransformer.js.map +0 -1
  181. package/lib/transformers/AgenticaHistoryTransformer.d.ts +0 -41
  182. package/lib/transformers/AgenticaHistoryTransformer.js.map +0 -1
  183. package/lib/utils/MathUtil.d.ts +0 -3
  184. package/lib/utils/MathUtil.js +0 -8
  185. package/lib/utils/MathUtil.js.map +0 -1
  186. package/src/events/AgenticaTextEvent.ts +0 -12
  187. package/src/events/AgenticaUserInputEvent.ts +0 -12
  188. package/src/histories/AgenticaUserInputHistory.ts +0 -88
  189. package/src/structures/mcp/IMcpLlmTransportProps.ts +0 -13
  190. package/src/structures/mcp/index.ts +0 -1
  191. package/src/utils/MathUtil.ts +0 -3
@@ -0,0 +1,226 @@
1
+ import type { CompletionUsage } from "openai/resources";
2
+
3
+ import { ChatGptTokenUsageAggregator } from "./ChatGptTokenUsageAggregator";
4
+
5
+ describe("chatGptTokenUsageAggregator", () => {
6
+ describe("sum", () => {
7
+ it("should sum basic token usage", () => {
8
+ const usage1: CompletionUsage = {
9
+ prompt_tokens: 10,
10
+ completion_tokens: 5,
11
+ total_tokens: 15,
12
+ };
13
+
14
+ const usage2: CompletionUsage = {
15
+ prompt_tokens: 20,
16
+ completion_tokens: 10,
17
+ total_tokens: 30,
18
+ };
19
+
20
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
21
+
22
+ expect(result).toEqual({
23
+ prompt_tokens: 30,
24
+ completion_tokens: 15,
25
+ total_tokens: 45,
26
+ completion_tokens_details: {
27
+ accepted_prediction_tokens: 0,
28
+ reasoning_tokens: 0,
29
+ rejected_prediction_tokens: 0,
30
+ },
31
+ prompt_tokens_details: {
32
+ audio_tokens: 0,
33
+ cached_tokens: 0,
34
+ },
35
+ });
36
+ });
37
+
38
+ it("should handle undefined values", () => {
39
+ const usage1: CompletionUsage = {
40
+ prompt_tokens: 10,
41
+ completion_tokens: 5,
42
+ total_tokens: 15,
43
+ };
44
+
45
+ const usage2: CompletionUsage = {
46
+ // @ts-expect-error - intended to be undefined
47
+ prompt_tokens: undefined,
48
+ // @ts-expect-error - intended to be undefined
49
+ completion_tokens: undefined,
50
+ // @ts-expect-error - intended to be undefined
51
+ total_tokens: undefined,
52
+ };
53
+
54
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
55
+
56
+ expect(result).toEqual({
57
+ prompt_tokens: 10,
58
+ completion_tokens: 5,
59
+ total_tokens: 15,
60
+ completion_tokens_details: {
61
+ accepted_prediction_tokens: 0,
62
+ reasoning_tokens: 0,
63
+ rejected_prediction_tokens: 0,
64
+ },
65
+ prompt_tokens_details: {
66
+ audio_tokens: 0,
67
+ cached_tokens: 0,
68
+ },
69
+ });
70
+ });
71
+
72
+ it("should sum completion token details", () => {
73
+ const usage1: CompletionUsage = {
74
+ prompt_tokens: 10,
75
+ completion_tokens: 5,
76
+ total_tokens: 15,
77
+ completion_tokens_details: {
78
+ accepted_prediction_tokens: 3,
79
+ reasoning_tokens: 1,
80
+ rejected_prediction_tokens: 1,
81
+ },
82
+ };
83
+
84
+ const usage2: CompletionUsage = {
85
+ prompt_tokens: 20,
86
+ completion_tokens: 10,
87
+ total_tokens: 30,
88
+ completion_tokens_details: {
89
+ accepted_prediction_tokens: 7,
90
+ reasoning_tokens: 2,
91
+ rejected_prediction_tokens: 1,
92
+ },
93
+ };
94
+
95
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
96
+
97
+ expect(result.completion_tokens_details).toEqual({
98
+ accepted_prediction_tokens: 10,
99
+ reasoning_tokens: 3,
100
+ rejected_prediction_tokens: 2,
101
+ });
102
+ });
103
+
104
+ it("should handle undefined completion token details", () => {
105
+ const usage1: CompletionUsage = {
106
+ prompt_tokens: 10,
107
+ completion_tokens: 5,
108
+ total_tokens: 15,
109
+ completion_tokens_details: {
110
+ accepted_prediction_tokens: 3,
111
+ reasoning_tokens: 1,
112
+ rejected_prediction_tokens: 1,
113
+ },
114
+ };
115
+
116
+ const usage2: CompletionUsage = {
117
+ prompt_tokens: 20,
118
+ completion_tokens: 10,
119
+ total_tokens: 30,
120
+ };
121
+
122
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
123
+
124
+ expect(result.completion_tokens_details).toEqual({
125
+ accepted_prediction_tokens: 3,
126
+ reasoning_tokens: 1,
127
+ rejected_prediction_tokens: 1,
128
+ });
129
+ });
130
+
131
+ it("should sum prompt token details", () => {
132
+ const usage1: CompletionUsage = {
133
+ prompt_tokens: 10,
134
+ completion_tokens: 5,
135
+ total_tokens: 15,
136
+ prompt_tokens_details: {
137
+ audio_tokens: 3,
138
+ cached_tokens: 2,
139
+ },
140
+ };
141
+
142
+ const usage2: CompletionUsage = {
143
+ prompt_tokens: 20,
144
+ completion_tokens: 10,
145
+ total_tokens: 30,
146
+ prompt_tokens_details: {
147
+ audio_tokens: 7,
148
+ cached_tokens: 3,
149
+ },
150
+ };
151
+
152
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
153
+
154
+ expect(result.prompt_tokens_details).toEqual({
155
+ audio_tokens: 10,
156
+ cached_tokens: 5,
157
+ });
158
+ });
159
+
160
+ it("should handle undefined prompt token details", () => {
161
+ const usage1: CompletionUsage = {
162
+ prompt_tokens: 10,
163
+ completion_tokens: 5,
164
+ total_tokens: 15,
165
+ prompt_tokens_details: {
166
+ audio_tokens: 3,
167
+ cached_tokens: 2,
168
+ },
169
+ };
170
+
171
+ const usage2: CompletionUsage = {
172
+ prompt_tokens: 20,
173
+ completion_tokens: 10,
174
+ total_tokens: 30,
175
+ };
176
+
177
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
178
+
179
+ expect(result.prompt_tokens_details).toEqual({
180
+ audio_tokens: 3,
181
+ cached_tokens: 2,
182
+ });
183
+ });
184
+
185
+ it("should handle all undefined values", () => {
186
+ const usage1: CompletionUsage = {
187
+ // @ts-expect-error - intended to be undefined
188
+ prompt_tokens: undefined,
189
+ // @ts-expect-error - intended to be undefined
190
+ completion_tokens: undefined,
191
+ // @ts-expect-error - intended to be undefined
192
+ total_tokens: undefined,
193
+ completion_tokens_details: undefined,
194
+ prompt_tokens_details: undefined,
195
+ };
196
+
197
+ const usage2: CompletionUsage = {
198
+ // @ts-expect-error - intended to be undefined
199
+ prompt_tokens: undefined,
200
+ // @ts-expect-error - intended to be undefined
201
+ completion_tokens: undefined,
202
+ // @ts-expect-error - intended to be undefined
203
+ total_tokens: undefined,
204
+ completion_tokens_details: undefined,
205
+ prompt_tokens_details: undefined,
206
+ };
207
+
208
+ const result = ChatGptTokenUsageAggregator.sum(usage1, usage2);
209
+
210
+ expect(result).toEqual({
211
+ prompt_tokens: 0,
212
+ completion_tokens: 0,
213
+ total_tokens: 0,
214
+ completion_tokens_details: {
215
+ accepted_prediction_tokens: 0,
216
+ reasoning_tokens: 0,
217
+ rejected_prediction_tokens: 0,
218
+ },
219
+ prompt_tokens_details: {
220
+ audio_tokens: 0,
221
+ cached_tokens: 0,
222
+ },
223
+ });
224
+ });
225
+ });
226
+ });
@@ -0,0 +1,138 @@
1
+ import { Singleton } from "./Singleton";
2
+
3
+ describe("singleton", () => {
4
+ describe("basic functionality", () => {
5
+ it("should create instance only once", () => {
6
+ const factory = () => ({ value: 42 });
7
+ const singleton = new Singleton(factory);
8
+
9
+ const instance1 = singleton.get();
10
+ const instance2 = singleton.get();
11
+
12
+ expect(instance1).toBe(instance2);
13
+ expect(instance1.value).toBe(42);
14
+ });
15
+
16
+ it("should create different instances for different singletons", () => {
17
+ const factory1 = () => ({ value: 42 });
18
+ const factory2 = () => ({ value: 24 });
19
+
20
+ const singleton1 = new Singleton(factory1);
21
+ const singleton2 = new Singleton(factory2);
22
+
23
+ const instance1 = singleton1.get();
24
+ const instance2 = singleton2.get();
25
+
26
+ expect(instance1).not.toBe(instance2);
27
+ expect(instance1.value).toBe(42);
28
+ expect(instance2.value).toBe(24);
29
+ });
30
+ });
31
+
32
+ describe("constructor arguments", () => {
33
+ it("should pass constructor arguments to factory", () => {
34
+ const factory = (value: number) => ({ value });
35
+ const singleton = new Singleton(factory);
36
+
37
+ const instance = singleton.get(42);
38
+ expect(instance.value).toBe(42);
39
+ });
40
+
41
+ it("should use same instance with same constructor arguments", () => {
42
+ const factory = (value: number) => ({ value });
43
+ const singleton = new Singleton(factory);
44
+
45
+ const instance1 = singleton.get(42);
46
+ const instance2 = singleton.get(42);
47
+
48
+ expect(instance1).toBe(instance2);
49
+ expect(instance1.value).toBe(42);
50
+ });
51
+
52
+ it("should return same instance even with different constructor arguments", () => {
53
+ const factory = (value: number) => ({ value });
54
+ const singleton = new Singleton(factory);
55
+
56
+ const instance1 = singleton.get(42);
57
+ const instance2 = singleton.get(24);
58
+
59
+ expect(instance1).toBe(instance2);
60
+ expect(instance1.value).toBe(42);
61
+ expect(instance2.value).toBe(42);
62
+ });
63
+ });
64
+
65
+ describe("complex object types", () => {
66
+ it("should handle complex objects", () => {
67
+ interface ComplexObject {
68
+ id: number;
69
+ data: { name: string; value: number };
70
+ timestamp: Date;
71
+ }
72
+
73
+ const factory = (id: number, name: string, value: number) => ({
74
+ id,
75
+ data: { name, value },
76
+ timestamp: new Date(),
77
+ });
78
+
79
+ const singleton = new Singleton<ComplexObject, [number, string, number]>(factory);
80
+ const instance = singleton.get(1, "test", 42);
81
+
82
+ expect(instance.id).toBe(1);
83
+ expect(instance.data.name).toBe("test");
84
+ expect(instance.data.value).toBe(42);
85
+ expect(instance.timestamp).toBeInstanceOf(Date);
86
+ });
87
+
88
+ it("should maintain same complex object instance", () => {
89
+ const factory = () => ({
90
+ data: new Map<string, number>([["key", 42]]),
91
+ array: [1, 2, 3],
92
+ });
93
+
94
+ const singleton = new Singleton(factory);
95
+ const instance1 = singleton.get();
96
+ const instance2 = singleton.get();
97
+
98
+ expect(instance1).toBe(instance2);
99
+ expect(instance1.data).toBe(instance2.data);
100
+ expect(instance1.array).toBe(instance2.array);
101
+ });
102
+ });
103
+
104
+ describe("edge cases", () => {
105
+ it("should handle null factory return", () => {
106
+ const factory = () => null;
107
+ const singleton = new Singleton(factory);
108
+
109
+ const instance = singleton.get();
110
+ expect(instance).toBeNull();
111
+ });
112
+
113
+ it("should handle undefined factory return", () => {
114
+ const factory = () => undefined;
115
+ const singleton = new Singleton(factory);
116
+
117
+ const instance = singleton.get();
118
+ expect(instance).toBeUndefined();
119
+ });
120
+
121
+ it("should handle primitive values", () => {
122
+ const factory = () => 42;
123
+ const singleton = new Singleton(factory);
124
+
125
+ const instance = singleton.get();
126
+ expect(instance).toBe(42);
127
+ });
128
+
129
+ it("should handle factory throwing error", () => {
130
+ const factory = () => {
131
+ throw new Error("Factory error");
132
+ };
133
+ const singleton = new Singleton(factory);
134
+
135
+ expect(() => singleton.get()).toThrow("Factory error");
136
+ });
137
+ });
138
+ });
@@ -5,6 +5,24 @@ const NOT_MOUNTED_YET = {};
5
5
 
6
6
  /**
7
7
  * @internal
8
+ *
9
+ * @description
10
+ * A singleton class that creates a single instance of a class.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const singleton = new Singleton((name: string) => new SomeClass(name));
15
+ * const instance = singleton.get("test");
16
+ * ```
17
+ *
18
+ * but next case is not work
19
+ * ```ts
20
+ * const singleton = new Singleton((name: string) => new SomeClass(name));
21
+ * const instance = singleton.get("test");
22
+ * const instance2 = singleton.get("test2");
23
+ *
24
+ * expect(instance).toBe(instance2); // true
25
+ * ```
8
26
  */
9
27
  export class Singleton<T, Args extends any[] = []> {
10
28
  private readonly closure_: (...args: Args) => T;
@@ -0,0 +1,140 @@
1
+ import { __map_take } from "./__map_take";
2
+
3
+ describe("__map_take", () => {
4
+ describe("basic functionality", () => {
5
+ it("should generate value for new key", () => {
6
+ const map = new Map<string, number>();
7
+ const generator = () => 42;
8
+
9
+ const result = __map_take(map, "test", generator);
10
+
11
+ expect(result).toBe(42);
12
+ expect(map.get("test")).toBe(42);
13
+ });
14
+
15
+ it("should return existing value for existing key", () => {
16
+ const map = new Map<string, number>();
17
+ map.set("test", 100);
18
+
19
+ const generator = () => 42;
20
+ const result = __map_take(map, "test", generator);
21
+
22
+ expect(result).toBe(100);
23
+ expect(map.get("test")).toBe(100);
24
+ });
25
+ });
26
+
27
+ describe("various type tests", () => {
28
+ it("should handle object type", () => {
29
+ const map = new Map<string, { value: number }>();
30
+ const generator = () => ({ value: 42 });
31
+
32
+ const result = __map_take(map, "test", generator);
33
+
34
+ expect(result).toEqual({ value: 42 });
35
+ expect(map.get("test")).toEqual({ value: 42 });
36
+ });
37
+
38
+ it("should handle array type", () => {
39
+ const map = new Map<string, number[]>();
40
+ const generator = () => [1, 2, 3];
41
+
42
+ const result = __map_take(map, "test", generator);
43
+
44
+ expect(result).toEqual([1, 2, 3]);
45
+ expect(map.get("test")).toEqual([1, 2, 3]);
46
+ });
47
+
48
+ it("should handle function type", () => {
49
+ const map = new Map<string, () => number>();
50
+ const generator = () => () => 42;
51
+
52
+ const result = __map_take(map, "test", generator);
53
+
54
+ expect(result()).toBe(42);
55
+ expect(map.get("test")?.()).toBe(42);
56
+ });
57
+ });
58
+
59
+ describe("edge cases", () => {
60
+ it("should handle null key", () => {
61
+ const map = new Map<null, string>();
62
+ const generator = () => "test";
63
+
64
+ const result = __map_take(map, null, generator);
65
+
66
+ expect(result).toBe("test");
67
+ expect(map.get(null)).toBe("test");
68
+ });
69
+
70
+ it("should handle undefined key", () => {
71
+ const map = new Map<undefined, string>();
72
+ const generator = () => "test";
73
+
74
+ const result = __map_take(map, undefined, generator);
75
+
76
+ expect(result).toBe("test");
77
+ expect(map.get(undefined)).toBe("test");
78
+ });
79
+
80
+ it("should handle empty string key", () => {
81
+ const map = new Map<string, string>();
82
+ const generator = () => "test";
83
+
84
+ const result = __map_take(map, "", generator);
85
+
86
+ expect(result).toBe("test");
87
+ expect(map.get("")).toBe("test");
88
+ });
89
+ });
90
+
91
+ describe("generator function tests", () => {
92
+ it("should not call generator multiple times", () => {
93
+ const map = new Map<string, number>();
94
+ let callCount = 0;
95
+
96
+ const generator = () => {
97
+ callCount++;
98
+ return 42;
99
+ };
100
+
101
+ __map_take(map, "test", generator);
102
+ __map_take(map, "test", generator);
103
+
104
+ expect(callCount).toBe(1);
105
+ });
106
+
107
+ it("should handle generator throwing error", () => {
108
+ const map = new Map<string, number>();
109
+ const generator = () => {
110
+ throw new Error("Generator error");
111
+ };
112
+
113
+ expect(() => __map_take(map, "test", generator)).toThrow("Generator error");
114
+ });
115
+
116
+ it("should handle generator returning undefined", () => {
117
+ const map = new Map<string, undefined>();
118
+ const generator = () => undefined;
119
+
120
+ const result = __map_take(map, "test", generator);
121
+
122
+ expect(result).toBeUndefined();
123
+ expect(map.get("test")).toBeUndefined();
124
+ });
125
+ });
126
+
127
+ describe("concurrency tests", () => {
128
+ it("should handle concurrent access to same key", () => {
129
+ const map = new Map<string, number>();
130
+ const generator = () => 42;
131
+
132
+ const result1 = __map_take(map, "test", generator);
133
+ const result2 = __map_take(map, "test", generator);
134
+
135
+ expect(result1).toBe(42);
136
+ expect(result2).toBe(42);
137
+ expect(map.get("test")).toBe(42);
138
+ });
139
+ });
140
+ });
@@ -1,10 +0,0 @@
1
- import type { AgenticaTextHistory } from "../histories/AgenticaTextHistory";
2
- import type { IAgenticaEventJson } from "../json/IAgenticaEventJson";
3
- import type { AgenticaEventBase } from "./AgenticaEventBase";
4
- export interface AgenticaTextEvent extends AgenticaEventBase<"text"> {
5
- role: "assistant";
6
- stream: AsyncGenerator<string, undefined, undefined>;
7
- join: () => Promise<string>;
8
- toJSON: () => IAgenticaEventJson.IText;
9
- toHistory: () => AgenticaTextHistory;
10
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgenticaTextEvent.js","sourceRoot":"","sources":["../../src/events/AgenticaTextEvent.ts"],"names":[],"mappings":""}
@@ -1,10 +0,0 @@
1
- import type { AgenticaUserInputHistory } from "../histories/AgenticaUserInputHistory";
2
- import type { IAgenticaEventJson } from "../json/IAgenticaEventJson";
3
- import type { AgenticaEventBase } from "./AgenticaEventBase";
4
- export interface AgenticaUserInputEvent extends AgenticaEventBase<"user_input"> {
5
- role: "user";
6
- contents: Array<AgenticaUserInputHistory.Contents>;
7
- join: () => Promise<Array<AgenticaUserInputHistory.Contents>>;
8
- toJSON: () => IAgenticaEventJson.IUserInput;
9
- toHistory: () => AgenticaUserInputHistory;
10
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgenticaUserInputEvent.js","sourceRoot":"","sources":["../../src/events/AgenticaUserInputEvent.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgenticaTextHistory.js","sourceRoot":"","sources":["../../src/histories/AgenticaTextHistory.ts"],"names":[],"mappings":""}
@@ -1,80 +0,0 @@
1
- import type { IAgenticaHistoryJson } from "../json/IAgenticaHistoryJson";
2
- import type { AgenticaHistoryBase } from "./AgenticaHistoryBase";
3
- export interface AgenticaUserInputHistory extends AgenticaHistoryBase<"user_input", IAgenticaHistoryJson.IUserInput> {
4
- role: "user";
5
- contents: Array<AgenticaUserInputHistory.Contents>;
6
- }
7
- export declare namespace AgenticaUserInputHistory {
8
- type Contents = Contents.File | Contents.Image | Contents.InputAudio | Contents.Text;
9
- namespace Contents {
10
- interface ContentsBase<Type extends string> {
11
- /**
12
- * The type of the content part.
13
- */
14
- type: Type;
15
- }
16
- /**
17
- * Learn about
18
- * [text inputs](https://platform.openai.com/docs/guides/text-generation).
19
- */
20
- export interface Text extends ContentsBase<"text"> {
21
- /**
22
- * The text content.
23
- */
24
- text: string;
25
- }
26
- /**
27
- * Learn about [image inputs](https://platform.openai.com/docs/guides/vision).
28
- */
29
- export interface Image extends ContentsBase<"image_url"> {
30
- image_url: {
31
- /**
32
- * Either a URL of the image or the base64 encoded image data.
33
- */
34
- url: string;
35
- /**
36
- * Specifies the detail level of the image. Learn more in the
37
- * [Vision guide](https://platform.openai.com/docs/guides/vision#low-or-high-fidelity-image-understanding).
38
- */
39
- detail?: "auto" | "high" | "low";
40
- };
41
- }
42
- /**
43
- * Learn about [audio inputs](https://platform.openai.com/docs/guides/audio).
44
- */
45
- export interface InputAudio extends ContentsBase<"input_audio"> {
46
- input_audio: {
47
- /**
48
- * Base64 encoded audio data.
49
- */
50
- data: string;
51
- /**
52
- * The format of the encoded audio data. Currently supports "wav" and "mp3".
53
- */
54
- format: "wav" | "mp3";
55
- };
56
- }
57
- /**
58
- * Learn about [file inputs](https://platform.openai.com/docs/guides/text) for text
59
- * generation.
60
- */
61
- export interface File extends ContentsBase<"file"> {
62
- file: {
63
- /**
64
- * The base64 encoded file data, used when passing the file to the model as a
65
- * string.
66
- */
67
- file_data?: string;
68
- /**
69
- * The ID of an uploaded file to use as input.
70
- */
71
- file_id?: string;
72
- /**
73
- * The name of the file, used when passing the file to the model as a string.
74
- */
75
- filename?: string;
76
- };
77
- }
78
- export {};
79
- }
80
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgenticaUserInputHistory.js","sourceRoot":"","sources":["../../src/histories/AgenticaUserInputHistory.ts"],"names":[],"mappings":""}
@@ -1,11 +0,0 @@
1
- import type { SSEClientTransportOptions } from "@modelcontextprotocol/sdk/client/sse.d.ts";
2
- import type { StdioServerParameters } from "@modelcontextprotocol/sdk/client/stdio.d.ts";
3
- export type IMcpLlmTransportProps = IMcpLlmTransportPropsHttp | IMcpLlmTransportPropsStdio;
4
- export interface IMcpLlmTransportPropsHttp extends IMcpLlmTransportPropsBase<"sse">, SSEClientTransportOptions {
5
- url: URL;
6
- }
7
- export interface IMcpLlmTransportPropsStdio extends IMcpLlmTransportPropsBase<"stdio">, StdioServerParameters {
8
- }
9
- export interface IMcpLlmTransportPropsBase<T extends string> {
10
- type: T;
11
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=IMcpLlmTransportProps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"IMcpLlmTransportProps.js","sourceRoot":"","sources":["../../../src/structures/mcp/IMcpLlmTransportProps.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- export * from "./IMcpLlmTransportProps";
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/structures/mcp/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC"}