@agentica/core 0.43.2 → 0.44.0-dev.20260313

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/LICENSE +21 -21
  2. package/README.md +218 -218
  3. package/lib/constants/AgenticaSystemPrompt.js +1 -1
  4. package/lib/constants/AgenticaSystemPrompt.js.map +1 -1
  5. package/lib/context/AgenticaOperation.d.ts +3 -2
  6. package/lib/context/internal/AgenticaOperationComposer.js.map +1 -1
  7. package/lib/context/internal/AgenticaTokenUsageAggregator.js.map +1 -1
  8. package/lib/context/internal/__IChatInitialApplication.d.ts +1 -1
  9. package/lib/errors/AgenticaJsonParseError.d.ts +5 -8
  10. package/lib/errors/AgenticaJsonParseError.js +11 -6
  11. package/lib/errors/AgenticaJsonParseError.js.map +1 -1
  12. package/lib/errors/AgenticaValidationError.d.ts +1 -1
  13. package/lib/events/AgenticaExecuteEvent.d.ts +1 -1
  14. package/lib/events/AgenticaJsonParseErrorEvent.d.ts +2 -2
  15. package/lib/factory/events.d.ts +2 -3
  16. package/lib/factory/events.js +1 -2
  17. package/lib/factory/events.js.map +1 -1
  18. package/lib/functional/assertHttpController.d.ts +2 -3
  19. package/lib/functional/assertHttpController.js +3939 -2656
  20. package/lib/functional/assertHttpController.js.map +1 -1
  21. package/lib/functional/assertHttpLlmApplication.d.ts +3 -3
  22. package/lib/functional/assertHttpLlmApplication.js +3939 -2656
  23. package/lib/functional/assertHttpLlmApplication.js.map +1 -1
  24. package/lib/functional/assertMcpController.d.ts +2 -2
  25. package/lib/functional/assertMcpController.js +202 -629
  26. package/lib/functional/assertMcpController.js.map +1 -1
  27. package/lib/functional/createMcpLlmApplication.d.ts +6 -0
  28. package/lib/functional/createMcpLlmApplication.js +56 -0
  29. package/lib/functional/createMcpLlmApplication.js.map +1 -0
  30. package/lib/functional/validateHttpController.d.ts +3 -3
  31. package/lib/functional/validateHttpController.js +3367 -2268
  32. package/lib/functional/validateHttpController.js.map +1 -1
  33. package/lib/functional/validateHttpLlmApplication.d.ts +3 -4
  34. package/lib/functional/validateHttpLlmApplication.js +3367 -2268
  35. package/lib/functional/validateHttpLlmApplication.js.map +1 -1
  36. package/lib/functional/validateMcpController.d.ts +2 -2
  37. package/lib/functional/validateMcpController.js +388 -1161
  38. package/lib/functional/validateMcpController.js.map +1 -1
  39. package/lib/histories/AgenticaExecuteHistory.d.ts +1 -1
  40. package/lib/index.mjs +21256 -18948
  41. package/lib/index.mjs.map +1 -1
  42. package/lib/orchestrate/call.js +43 -56
  43. package/lib/orchestrate/call.js.map +1 -1
  44. package/lib/orchestrate/cancel.js +9 -66
  45. package/lib/orchestrate/cancel.js.map +1 -1
  46. package/lib/orchestrate/initialize.js +4 -947
  47. package/lib/orchestrate/initialize.js.map +1 -1
  48. package/lib/orchestrate/select.js +11 -68
  49. package/lib/orchestrate/select.js.map +1 -1
  50. package/lib/structures/IAgenticaController.d.ts +143 -151
  51. package/lib/structures/IMcpTool.d.ts +52 -0
  52. package/lib/structures/IMcpTool.js +3 -0
  53. package/lib/structures/IMcpTool.js.map +1 -0
  54. package/lib/utils/ChatGptCompletionMessageUtil.js +16 -5
  55. package/lib/utils/ChatGptCompletionMessageUtil.js.map +1 -1
  56. package/lib/utils/ChatGptCompletionMessageUtil.spec.js +0 -5
  57. package/lib/utils/ChatGptCompletionMessageUtil.spec.js.map +1 -1
  58. package/package.json +7 -9
  59. package/prompts/cancel.md +5 -5
  60. package/prompts/common.md +3 -3
  61. package/prompts/describe.md +7 -7
  62. package/prompts/execute.md +122 -122
  63. package/prompts/initialize.md +3 -3
  64. package/prompts/json_parse_error.md +35 -33
  65. package/prompts/select.md +7 -7
  66. package/prompts/validate.md +123 -123
  67. package/prompts/validate_repeated.md +31 -31
  68. package/src/Agentica.ts +367 -367
  69. package/src/MicroAgentica.ts +357 -357
  70. package/src/constants/AgenticaConstant.ts +4 -4
  71. package/src/constants/AgenticaDefaultPrompt.ts +44 -44
  72. package/src/constants/AgenticaSystemPrompt.ts +1 -1
  73. package/src/constants/index.ts +2 -2
  74. package/src/context/AgenticaContext.ts +136 -136
  75. package/src/context/AgenticaContextRequestResult.ts +14 -14
  76. package/src/context/AgenticaOperation.ts +73 -72
  77. package/src/context/AgenticaOperationCollection.ts +49 -49
  78. package/src/context/AgenticaOperationSelection.ts +9 -9
  79. package/src/context/AgenticaTokenUsage.ts +186 -186
  80. package/src/context/MicroAgenticaContext.ts +99 -99
  81. package/src/context/index.ts +5 -5
  82. package/src/context/internal/AgenticaOperationComposer.ts +177 -177
  83. package/src/context/internal/AgenticaTokenUsageAggregator.ts +66 -66
  84. package/src/context/internal/__IChatCancelFunctionsApplication.ts +23 -23
  85. package/src/context/internal/__IChatFunctionReference.ts +21 -21
  86. package/src/context/internal/__IChatInitialApplication.ts +15 -15
  87. package/src/context/internal/__IChatSelectFunctionsApplication.ts +24 -24
  88. package/src/context/internal/isAgenticaContext.ts +11 -11
  89. package/src/errors/AgenticaJsonParseError.ts +52 -47
  90. package/src/errors/AgenticaValidationError.ts +49 -49
  91. package/src/errors/index.ts +2 -2
  92. package/src/events/AgenticaAssistantMessageEvent.ts +12 -12
  93. package/src/events/AgenticaCallEvent.ts +27 -27
  94. package/src/events/AgenticaCancelEvent.ts +9 -9
  95. package/src/events/AgenticaDescribeEvent.ts +14 -14
  96. package/src/events/AgenticaEvent.ts +59 -59
  97. package/src/events/AgenticaEvent.type.ts +19 -19
  98. package/src/events/AgenticaEventBase.ts +18 -18
  99. package/src/events/AgenticaEventSource.ts +6 -6
  100. package/src/events/AgenticaExecuteEvent.ts +45 -45
  101. package/src/events/AgenticaInitializeEvent.ts +7 -7
  102. package/src/events/AgenticaJsonParseErrorEvent.ts +16 -15
  103. package/src/events/AgenticaRequestEvent.ts +27 -27
  104. package/src/events/AgenticaResponseEvent.ts +32 -32
  105. package/src/events/AgenticaSelectEvent.ts +11 -11
  106. package/src/events/AgenticaUserMessageEvent.ts +12 -12
  107. package/src/events/AgenticaValidateEvent.ts +32 -32
  108. package/src/events/MicroAgenticaEvent.ts +45 -45
  109. package/src/events/index.ts +15 -15
  110. package/src/factory/events.ts +357 -359
  111. package/src/factory/histories.ts +348 -348
  112. package/src/factory/index.ts +3 -3
  113. package/src/factory/operations.ts +16 -16
  114. package/src/functional/assertHttpController.ts +106 -104
  115. package/src/functional/assertHttpLlmApplication.ts +52 -57
  116. package/src/functional/assertMcpController.ts +47 -44
  117. package/src/functional/createMcpLlmApplication.ts +72 -0
  118. package/src/functional/index.ts +7 -7
  119. package/src/functional/validateHttpController.ts +113 -110
  120. package/src/functional/validateHttpLlmApplication.ts +65 -70
  121. package/src/functional/validateMcpController.ts +53 -50
  122. package/src/histories/AgenticaAssistantMessageHistory.ts +10 -10
  123. package/src/histories/AgenticaCancelHistory.ts +8 -8
  124. package/src/histories/AgenticaDescribeHistory.ts +18 -18
  125. package/src/histories/AgenticaExecuteHistory.ts +64 -64
  126. package/src/histories/AgenticaHistory.ts +28 -28
  127. package/src/histories/AgenticaHistoryBase.ts +35 -35
  128. package/src/histories/AgenticaSelectHistory.ts +8 -8
  129. package/src/histories/AgenticaSystemMessageHistory.ts +10 -10
  130. package/src/histories/AgenticaUserMessageHistory.ts +11 -11
  131. package/src/histories/MicroAgenticaHistory.ts +19 -19
  132. package/src/histories/contents/AgenticaUserMessageAudioContent.ts +21 -21
  133. package/src/histories/contents/AgenticaUserMessageContent.ts +19 -19
  134. package/src/histories/contents/AgenticaUserMessageContentBase.ts +6 -6
  135. package/src/histories/contents/AgenticaUserMessageFileContent.ts +25 -25
  136. package/src/histories/contents/AgenticaUserMessageImageContent.ts +33 -33
  137. package/src/histories/contents/AgenticaUserMessageTextContent.ts +15 -15
  138. package/src/histories/contents/index.ts +5 -5
  139. package/src/histories/index.ts +10 -10
  140. package/src/index.ts +15 -15
  141. package/src/json/IAgenticaEventJson.ts +265 -265
  142. package/src/json/IAgenticaEventJson.type.ts +19 -19
  143. package/src/json/IAgenticaHistoryJson.ts +165 -165
  144. package/src/json/IAgenticaHistoryJson.type.ts +19 -19
  145. package/src/json/IAgenticaOperationJson.ts +36 -36
  146. package/src/json/IAgenticaOperationSelectionJson.ts +26 -26
  147. package/src/json/IAgenticaTokenUsageJson.ts +107 -107
  148. package/src/json/IMicroAgenticaEventJson.ts +22 -22
  149. package/src/json/IMicroAgenticaHistoryJson.ts +25 -25
  150. package/src/json/index.ts +7 -7
  151. package/src/orchestrate/call.ts +542 -558
  152. package/src/orchestrate/cancel.ts +265 -269
  153. package/src/orchestrate/describe.ts +66 -66
  154. package/src/orchestrate/execute.ts +61 -61
  155. package/src/orchestrate/index.ts +6 -6
  156. package/src/orchestrate/initialize.ts +102 -102
  157. package/src/orchestrate/internal/cancelFunctionFromContext.ts +33 -33
  158. package/src/orchestrate/internal/selectFunctionFromContext.ts +34 -34
  159. package/src/orchestrate/select.ts +320 -322
  160. package/src/structures/IAgenticaConfig.ts +83 -83
  161. package/src/structures/IAgenticaConfigBase.ts +87 -87
  162. package/src/structures/IAgenticaController.ts +143 -151
  163. package/src/structures/IAgenticaExecutor.ts +167 -167
  164. package/src/structures/IAgenticaProps.ts +78 -78
  165. package/src/structures/IAgenticaSystemPrompt.ts +236 -236
  166. package/src/structures/IAgenticaVendor.ts +54 -54
  167. package/src/structures/IMcpTool.ts +60 -0
  168. package/src/structures/IMicroAgenticaConfig.ts +56 -56
  169. package/src/structures/IMicroAgenticaExecutor.ts +67 -67
  170. package/src/structures/IMicroAgenticaProps.ts +77 -77
  171. package/src/structures/IMicroAgenticaSystemPrompt.ts +169 -169
  172. package/src/structures/index.ts +10 -10
  173. package/src/transformers/transformHistory.ts +172 -172
  174. package/src/utils/AssistantMessageEmptyError.ts +20 -20
  175. package/src/utils/AsyncQueue.spec.ts +355 -355
  176. package/src/utils/AsyncQueue.ts +95 -95
  177. package/src/utils/ByteArrayUtil.ts +5 -5
  178. package/src/utils/ChatGptCompletionMessageUtil.spec.ts +314 -320
  179. package/src/utils/ChatGptCompletionMessageUtil.ts +210 -195
  180. package/src/utils/ChatGptCompletionStreamingUtil.spec.ts +909 -909
  181. package/src/utils/ChatGptCompletionStreamingUtil.ts +91 -91
  182. package/src/utils/ChatGptTokenUsageAggregator.spec.ts +226 -226
  183. package/src/utils/ChatGptTokenUsageAggregator.ts +57 -57
  184. package/src/utils/MPSC.spec.ts +276 -276
  185. package/src/utils/MPSC.ts +42 -42
  186. package/src/utils/Singleton.spec.ts +138 -138
  187. package/src/utils/Singleton.ts +42 -42
  188. package/src/utils/StreamUtil.spec.ts +512 -512
  189. package/src/utils/StreamUtil.ts +87 -87
  190. package/src/utils/__map_take.spec.ts +140 -140
  191. package/src/utils/__map_take.ts +13 -13
  192. package/src/utils/__retry.spec.ts +198 -198
  193. package/src/utils/__retry.ts +18 -18
  194. package/src/utils/assertExecuteFailure.ts +16 -16
  195. package/src/utils/index.ts +4 -4
  196. package/src/utils/request.ts +140 -140
  197. package/src/utils/types.ts +50 -50
  198. package/lib/context/internal/AgenticaOperationComposer.spec.d.ts +0 -1
  199. package/lib/context/internal/AgenticaOperationComposer.spec.js +0 -353
  200. package/lib/context/internal/AgenticaOperationComposer.spec.js.map +0 -1
  201. package/lib/utils/JsonUtil.d.ts +0 -8
  202. package/lib/utils/JsonUtil.js +0 -350
  203. package/lib/utils/JsonUtil.js.map +0 -1
  204. package/src/context/internal/AgenticaOperationComposer.spec.ts +0 -401
  205. package/src/utils/JsonUtil.ts +0 -462
@@ -1,198 +1,198 @@
1
- import { __get_retry } from "./__retry";
2
-
3
- describe("__get_retry", () => {
4
- beforeEach(() => {
5
- vi.clearAllMocks();
6
- });
7
-
8
- describe("success cases", () => {
9
- it("should not retry when successful on first attempt", async () => {
10
- const mockFn = vi.fn().mockResolvedValue("success");
11
- const retryFn = __get_retry(3);
12
-
13
- const result = await retryFn(mockFn);
14
-
15
- expect(result).toBe("success");
16
- expect(mockFn).toHaveBeenCalledTimes(1);
17
- expect(mockFn).toHaveBeenCalledWith(undefined);
18
- });
19
-
20
- it("should call exactly 2 times when successful on second attempt", async () => {
21
- const mockFn = vi.fn()
22
- .mockRejectedValueOnce(new Error("First failure"))
23
- .mockResolvedValue("success");
24
- const retryFn = __get_retry(3);
25
-
26
- const result = await retryFn(mockFn);
27
-
28
- expect(result).toBe("success");
29
- expect(mockFn).toHaveBeenCalledTimes(2);
30
- expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
31
- expect(mockFn).toHaveBeenNthCalledWith(2, new Error("First failure"));
32
- });
33
-
34
- it("should call limit times when successful on last attempt", async () => {
35
- const mockFn = vi.fn()
36
- .mockRejectedValueOnce(new Error("First failure"))
37
- .mockRejectedValueOnce(new Error("Second failure"))
38
- .mockResolvedValue("success");
39
- const retryFn = __get_retry(3);
40
-
41
- const result = await retryFn(mockFn);
42
-
43
- expect(result).toBe("success");
44
- expect(mockFn).toHaveBeenCalledTimes(3);
45
- expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
46
- expect(mockFn).toHaveBeenNthCalledWith(2, new Error("First failure"));
47
- expect(mockFn).toHaveBeenNthCalledWith(3, new Error("Second failure"));
48
- });
49
- });
50
-
51
- describe("failure cases", () => {
52
- it("should throw last error after limit attempts", async () => {
53
- const error1 = new Error("First failure");
54
- const error2 = new Error("Second failure");
55
- const error3 = new Error("Third failure");
56
-
57
- const mockFn = vi.fn()
58
- .mockRejectedValueOnce(error1)
59
- .mockRejectedValueOnce(error2)
60
- .mockRejectedValueOnce(error3);
61
- const retryFn = __get_retry(3);
62
-
63
- await expect(retryFn(mockFn)).rejects.toThrow("Third failure");
64
- expect(mockFn).toHaveBeenCalledTimes(3);
65
- expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
66
- expect(mockFn).toHaveBeenNthCalledWith(2, error1);
67
- expect(mockFn).toHaveBeenNthCalledWith(3, error2);
68
- });
69
-
70
- it("should throw error immediately when limit is 1", async () => {
71
- const error = new Error("Immediate failure");
72
- const mockFn = vi.fn().mockRejectedValue(error);
73
- const retryFn = __get_retry(1);
74
-
75
- await expect(retryFn(mockFn)).rejects.toThrow("Immediate failure");
76
- expect(mockFn).toHaveBeenCalledTimes(1);
77
- expect(mockFn).toHaveBeenCalledWith(undefined);
78
- });
79
- });
80
-
81
- describe("prevError propagation", () => {
82
- it("should pass previous error as prevError correctly", async () => {
83
- const error1 = new Error("First error");
84
- const error2 = new Error("Second error");
85
-
86
- const mockFn = vi.fn()
87
- .mockRejectedValueOnce(error1)
88
- .mockRejectedValueOnce(error2)
89
- .mockResolvedValue("success");
90
- const retryFn = __get_retry(3);
91
-
92
- const result = await retryFn(mockFn);
93
-
94
- expect(result).toBe("success");
95
- expect(mockFn).toHaveBeenCalledTimes(3);
96
- expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
97
- expect(mockFn).toHaveBeenNthCalledWith(2, error1);
98
- expect(mockFn).toHaveBeenNthCalledWith(3, error2);
99
- });
100
-
101
- it("should use initial prevError in first call when provided", async () => {
102
- const initialError = new Error("Initial error");
103
- const mockFn = vi.fn().mockResolvedValue("success");
104
- const retryFn = __get_retry(3);
105
-
106
- const result = await retryFn(mockFn, initialError);
107
-
108
- expect(result).toBe("success");
109
- expect(mockFn).toHaveBeenCalledTimes(1);
110
- expect(mockFn).toHaveBeenCalledWith(initialError);
111
- });
112
- });
113
-
114
- describe("different error types", () => {
115
- it("should handle string errors correctly", async () => {
116
- const mockFn = vi.fn()
117
- .mockRejectedValueOnce("String error")
118
- .mockResolvedValue("success");
119
- const retryFn = __get_retry(2);
120
-
121
- const result = await retryFn(mockFn);
122
-
123
- expect(result).toBe("success");
124
- expect(mockFn).toHaveBeenCalledTimes(2);
125
- expect(mockFn).toHaveBeenNthCalledWith(2, "String error");
126
- });
127
-
128
- it("should handle null errors correctly", async () => {
129
- const mockFn = vi.fn()
130
- .mockRejectedValueOnce(null)
131
- .mockResolvedValue("success");
132
- const retryFn = __get_retry(2);
133
-
134
- const result = await retryFn(mockFn);
135
-
136
- expect(result).toBe("success");
137
- expect(mockFn).toHaveBeenCalledTimes(2);
138
- expect(mockFn).toHaveBeenNthCalledWith(2, null);
139
- });
140
-
141
- it("should handle undefined errors correctly", async () => {
142
- const mockFn = vi.fn()
143
- .mockRejectedValueOnce(undefined)
144
- .mockResolvedValue("success");
145
- const retryFn = __get_retry(2);
146
-
147
- const result = await retryFn(mockFn);
148
-
149
- expect(result).toBe("success");
150
- expect(mockFn).toHaveBeenCalledTimes(2);
151
- expect(mockFn).toHaveBeenNthCalledWith(2, undefined);
152
- });
153
- });
154
-
155
- describe("recursive call verification", () => {
156
- it("should occur recursive calls in correct order", async () => {
157
- const callOrder: string[] = [];
158
- const mockFn = vi.fn()
159
- .mockImplementationOnce(() => {
160
- callOrder.push("first call");
161
- throw new Error("First failure");
162
- })
163
- .mockImplementationOnce(() => {
164
- callOrder.push("second call");
165
- throw new Error("Second failure");
166
- })
167
- .mockImplementationOnce(async () => {
168
- callOrder.push("third call");
169
- return Promise.resolve("success");
170
- });
171
-
172
- const retryFn = __get_retry(3);
173
- const result = await retryFn(mockFn);
174
-
175
- expect(result).toBe("success");
176
- expect(callOrder).toEqual(["first call", "second call", "third call"]);
177
- expect(mockFn).toHaveBeenCalledTimes(3);
178
- });
179
- });
180
-
181
- describe("type safety", () => {
182
- it("should handle different return types correctly", async () => {
183
- const stringFn = vi.fn().mockResolvedValue("string result");
184
- const numberFn = vi.fn().mockResolvedValue(42);
185
- const objectFn = vi.fn().mockResolvedValue({ key: "value" });
186
-
187
- const retryFn = __get_retry(3);
188
-
189
- const stringResult = await retryFn(stringFn);
190
- const numberResult = await retryFn(numberFn);
191
- const objectResult = await retryFn(objectFn);
192
-
193
- expect(stringResult).toBe("string result");
194
- expect(numberResult).toBe(42);
195
- expect(objectResult).toEqual({ key: "value" });
196
- });
197
- });
198
- });
1
+ import { __get_retry } from "./__retry";
2
+
3
+ describe("__get_retry", () => {
4
+ beforeEach(() => {
5
+ vi.clearAllMocks();
6
+ });
7
+
8
+ describe("success cases", () => {
9
+ it("should not retry when successful on first attempt", async () => {
10
+ const mockFn = vi.fn().mockResolvedValue("success");
11
+ const retryFn = __get_retry(3);
12
+
13
+ const result = await retryFn(mockFn);
14
+
15
+ expect(result).toBe("success");
16
+ expect(mockFn).toHaveBeenCalledTimes(1);
17
+ expect(mockFn).toHaveBeenCalledWith(undefined);
18
+ });
19
+
20
+ it("should call exactly 2 times when successful on second attempt", async () => {
21
+ const mockFn = vi.fn()
22
+ .mockRejectedValueOnce(new Error("First failure"))
23
+ .mockResolvedValue("success");
24
+ const retryFn = __get_retry(3);
25
+
26
+ const result = await retryFn(mockFn);
27
+
28
+ expect(result).toBe("success");
29
+ expect(mockFn).toHaveBeenCalledTimes(2);
30
+ expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
31
+ expect(mockFn).toHaveBeenNthCalledWith(2, new Error("First failure"));
32
+ });
33
+
34
+ it("should call limit times when successful on last attempt", async () => {
35
+ const mockFn = vi.fn()
36
+ .mockRejectedValueOnce(new Error("First failure"))
37
+ .mockRejectedValueOnce(new Error("Second failure"))
38
+ .mockResolvedValue("success");
39
+ const retryFn = __get_retry(3);
40
+
41
+ const result = await retryFn(mockFn);
42
+
43
+ expect(result).toBe("success");
44
+ expect(mockFn).toHaveBeenCalledTimes(3);
45
+ expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
46
+ expect(mockFn).toHaveBeenNthCalledWith(2, new Error("First failure"));
47
+ expect(mockFn).toHaveBeenNthCalledWith(3, new Error("Second failure"));
48
+ });
49
+ });
50
+
51
+ describe("failure cases", () => {
52
+ it("should throw last error after limit attempts", async () => {
53
+ const error1 = new Error("First failure");
54
+ const error2 = new Error("Second failure");
55
+ const error3 = new Error("Third failure");
56
+
57
+ const mockFn = vi.fn()
58
+ .mockRejectedValueOnce(error1)
59
+ .mockRejectedValueOnce(error2)
60
+ .mockRejectedValueOnce(error3);
61
+ const retryFn = __get_retry(3);
62
+
63
+ await expect(retryFn(mockFn)).rejects.toThrow("Third failure");
64
+ expect(mockFn).toHaveBeenCalledTimes(3);
65
+ expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
66
+ expect(mockFn).toHaveBeenNthCalledWith(2, error1);
67
+ expect(mockFn).toHaveBeenNthCalledWith(3, error2);
68
+ });
69
+
70
+ it("should throw error immediately when limit is 1", async () => {
71
+ const error = new Error("Immediate failure");
72
+ const mockFn = vi.fn().mockRejectedValue(error);
73
+ const retryFn = __get_retry(1);
74
+
75
+ await expect(retryFn(mockFn)).rejects.toThrow("Immediate failure");
76
+ expect(mockFn).toHaveBeenCalledTimes(1);
77
+ expect(mockFn).toHaveBeenCalledWith(undefined);
78
+ });
79
+ });
80
+
81
+ describe("prevError propagation", () => {
82
+ it("should pass previous error as prevError correctly", async () => {
83
+ const error1 = new Error("First error");
84
+ const error2 = new Error("Second error");
85
+
86
+ const mockFn = vi.fn()
87
+ .mockRejectedValueOnce(error1)
88
+ .mockRejectedValueOnce(error2)
89
+ .mockResolvedValue("success");
90
+ const retryFn = __get_retry(3);
91
+
92
+ const result = await retryFn(mockFn);
93
+
94
+ expect(result).toBe("success");
95
+ expect(mockFn).toHaveBeenCalledTimes(3);
96
+ expect(mockFn).toHaveBeenNthCalledWith(1, undefined);
97
+ expect(mockFn).toHaveBeenNthCalledWith(2, error1);
98
+ expect(mockFn).toHaveBeenNthCalledWith(3, error2);
99
+ });
100
+
101
+ it("should use initial prevError in first call when provided", async () => {
102
+ const initialError = new Error("Initial error");
103
+ const mockFn = vi.fn().mockResolvedValue("success");
104
+ const retryFn = __get_retry(3);
105
+
106
+ const result = await retryFn(mockFn, initialError);
107
+
108
+ expect(result).toBe("success");
109
+ expect(mockFn).toHaveBeenCalledTimes(1);
110
+ expect(mockFn).toHaveBeenCalledWith(initialError);
111
+ });
112
+ });
113
+
114
+ describe("different error types", () => {
115
+ it("should handle string errors correctly", async () => {
116
+ const mockFn = vi.fn()
117
+ .mockRejectedValueOnce("String error")
118
+ .mockResolvedValue("success");
119
+ const retryFn = __get_retry(2);
120
+
121
+ const result = await retryFn(mockFn);
122
+
123
+ expect(result).toBe("success");
124
+ expect(mockFn).toHaveBeenCalledTimes(2);
125
+ expect(mockFn).toHaveBeenNthCalledWith(2, "String error");
126
+ });
127
+
128
+ it("should handle null errors correctly", async () => {
129
+ const mockFn = vi.fn()
130
+ .mockRejectedValueOnce(null)
131
+ .mockResolvedValue("success");
132
+ const retryFn = __get_retry(2);
133
+
134
+ const result = await retryFn(mockFn);
135
+
136
+ expect(result).toBe("success");
137
+ expect(mockFn).toHaveBeenCalledTimes(2);
138
+ expect(mockFn).toHaveBeenNthCalledWith(2, null);
139
+ });
140
+
141
+ it("should handle undefined errors correctly", async () => {
142
+ const mockFn = vi.fn()
143
+ .mockRejectedValueOnce(undefined)
144
+ .mockResolvedValue("success");
145
+ const retryFn = __get_retry(2);
146
+
147
+ const result = await retryFn(mockFn);
148
+
149
+ expect(result).toBe("success");
150
+ expect(mockFn).toHaveBeenCalledTimes(2);
151
+ expect(mockFn).toHaveBeenNthCalledWith(2, undefined);
152
+ });
153
+ });
154
+
155
+ describe("recursive call verification", () => {
156
+ it("should occur recursive calls in correct order", async () => {
157
+ const callOrder: string[] = [];
158
+ const mockFn = vi.fn()
159
+ .mockImplementationOnce(() => {
160
+ callOrder.push("first call");
161
+ throw new Error("First failure");
162
+ })
163
+ .mockImplementationOnce(() => {
164
+ callOrder.push("second call");
165
+ throw new Error("Second failure");
166
+ })
167
+ .mockImplementationOnce(async () => {
168
+ callOrder.push("third call");
169
+ return Promise.resolve("success");
170
+ });
171
+
172
+ const retryFn = __get_retry(3);
173
+ const result = await retryFn(mockFn);
174
+
175
+ expect(result).toBe("success");
176
+ expect(callOrder).toEqual(["first call", "second call", "third call"]);
177
+ expect(mockFn).toHaveBeenCalledTimes(3);
178
+ });
179
+ });
180
+
181
+ describe("type safety", () => {
182
+ it("should handle different return types correctly", async () => {
183
+ const stringFn = vi.fn().mockResolvedValue("string result");
184
+ const numberFn = vi.fn().mockResolvedValue(42);
185
+ const objectFn = vi.fn().mockResolvedValue({ key: "value" });
186
+
187
+ const retryFn = __get_retry(3);
188
+
189
+ const stringResult = await retryFn(stringFn);
190
+ const numberResult = await retryFn(numberFn);
191
+ const objectResult = await retryFn(objectFn);
192
+
193
+ expect(stringResult).toBe("string result");
194
+ expect(numberResult).toBe(42);
195
+ expect(objectResult).toEqual({ key: "value" });
196
+ });
197
+ });
198
+ });
@@ -1,18 +1,18 @@
1
- /**
2
- * @internal
3
- */
4
- export function __get_retry(limit: number) {
5
- const retryFn = async <T>(fn: (prevError?: unknown) => Promise<T>, prevError?: unknown, attempt: number = 0): Promise<T> => {
6
- try {
7
- return await fn(prevError);
8
- }
9
- catch (error) {
10
- if (attempt >= limit - 1) {
11
- throw error;
12
- }
13
- return retryFn(fn, error, attempt + 1);
14
- }
15
- };
16
-
17
- return retryFn;
18
- }
1
+ /**
2
+ * @internal
3
+ */
4
+ export function __get_retry(limit: number) {
5
+ const retryFn = async <T>(fn: (prevError?: unknown) => Promise<T>, prevError?: unknown, attempt: number = 0): Promise<T> => {
6
+ try {
7
+ return await fn(prevError);
8
+ }
9
+ catch (error) {
10
+ if (attempt >= limit - 1) {
11
+ throw error;
12
+ }
13
+ return retryFn(fn, error, attempt + 1);
14
+ }
15
+ };
16
+
17
+ return retryFn;
18
+ }
@@ -1,16 +1,16 @@
1
- import type { AgenticaExecuteHistory } from "../histories/AgenticaExecuteHistory";
2
-
3
- export function assertExecuteFailure(failure: AgenticaExecuteHistory): void {
4
- if (failure.success === true) {
5
- return;
6
- }
7
- else if (failure.value instanceof Error) {
8
- throw failure.value;
9
- }
10
- else if (typeof failure.value === "object" && failure.value !== null) {
11
- const error: Error = new Error("Error from execute failure");
12
- Object.assign(error, failure.value);
13
- throw error;
14
- }
15
- throw failure.value;
16
- }
1
+ import type { AgenticaExecuteHistory } from "../histories/AgenticaExecuteHistory";
2
+
3
+ export function assertExecuteFailure(failure: AgenticaExecuteHistory): void {
4
+ if (failure.success === true) {
5
+ return;
6
+ }
7
+ else if (failure.value instanceof Error) {
8
+ throw failure.value;
9
+ }
10
+ else if (typeof failure.value === "object" && failure.value !== null) {
11
+ const error: Error = new Error("Error from execute failure");
12
+ Object.assign(error, failure.value);
13
+ throw error;
14
+ }
15
+ throw failure.value;
16
+ }
@@ -1,4 +1,4 @@
1
- export * from "./AsyncQueue";
2
- export * from "./ChatGptCompletionMessageUtil";
3
- export * from "./MPSC";
4
- export * from "./StreamUtil";
1
+ export * from "./AsyncQueue";
2
+ export * from "./ChatGptCompletionMessageUtil";
3
+ export * from "./MPSC";
4
+ export * from "./StreamUtil";