@agentica/core 0.44.0-dev.20260313-2 → 0.44.1

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 (154) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +218 -218
  3. package/lib/context/internal/__IChatInitialApplication.d.ts +1 -2
  4. package/lib/errors/AgenticaJsonParseError.js +6 -6
  5. package/lib/index.mjs +47 -7
  6. package/lib/index.mjs.map +1 -1
  7. package/lib/orchestrate/call.js +16 -16
  8. package/lib/orchestrate/cancel.js +1 -1
  9. package/lib/orchestrate/cancel.js.map +1 -1
  10. package/lib/orchestrate/initialize.js +44 -2
  11. package/lib/orchestrate/initialize.js.map +1 -1
  12. package/lib/orchestrate/select.js +1 -1
  13. package/lib/orchestrate/select.js.map +1 -1
  14. package/lib/structures/IAgenticaController.d.ts +143 -143
  15. package/lib/utils/ChatGptCompletionMessageUtil.js +6 -6
  16. package/package.json +6 -6
  17. package/prompts/cancel.md +5 -5
  18. package/prompts/common.md +3 -3
  19. package/prompts/describe.md +7 -7
  20. package/prompts/execute.md +122 -122
  21. package/prompts/initialize.md +3 -3
  22. package/prompts/json_parse_error.md +35 -35
  23. package/prompts/select.md +7 -7
  24. package/prompts/validate.md +123 -123
  25. package/prompts/validate_repeated.md +31 -31
  26. package/src/Agentica.ts +367 -367
  27. package/src/MicroAgentica.ts +357 -357
  28. package/src/constants/AgenticaConstant.ts +4 -4
  29. package/src/constants/AgenticaDefaultPrompt.ts +44 -44
  30. package/src/constants/index.ts +2 -2
  31. package/src/context/AgenticaContext.ts +136 -136
  32. package/src/context/AgenticaContextRequestResult.ts +14 -14
  33. package/src/context/AgenticaOperation.ts +73 -73
  34. package/src/context/AgenticaOperationCollection.ts +49 -49
  35. package/src/context/AgenticaOperationSelection.ts +9 -9
  36. package/src/context/AgenticaTokenUsage.ts +186 -186
  37. package/src/context/MicroAgenticaContext.ts +99 -99
  38. package/src/context/index.ts +5 -5
  39. package/src/context/internal/AgenticaOperationComposer.ts +177 -177
  40. package/src/context/internal/AgenticaTokenUsageAggregator.ts +66 -66
  41. package/src/context/internal/__IChatCancelFunctionsApplication.ts +23 -23
  42. package/src/context/internal/__IChatFunctionReference.ts +21 -21
  43. package/src/context/internal/__IChatInitialApplication.ts +13 -15
  44. package/src/context/internal/__IChatSelectFunctionsApplication.ts +24 -24
  45. package/src/context/internal/isAgenticaContext.ts +11 -11
  46. package/src/errors/AgenticaJsonParseError.ts +52 -52
  47. package/src/errors/AgenticaValidationError.ts +49 -49
  48. package/src/errors/index.ts +2 -2
  49. package/src/events/AgenticaAssistantMessageEvent.ts +12 -12
  50. package/src/events/AgenticaCallEvent.ts +27 -27
  51. package/src/events/AgenticaCancelEvent.ts +9 -9
  52. package/src/events/AgenticaDescribeEvent.ts +14 -14
  53. package/src/events/AgenticaEvent.ts +59 -59
  54. package/src/events/AgenticaEvent.type.ts +19 -19
  55. package/src/events/AgenticaEventBase.ts +18 -18
  56. package/src/events/AgenticaEventSource.ts +6 -6
  57. package/src/events/AgenticaExecuteEvent.ts +45 -45
  58. package/src/events/AgenticaInitializeEvent.ts +7 -7
  59. package/src/events/AgenticaJsonParseErrorEvent.ts +16 -16
  60. package/src/events/AgenticaRequestEvent.ts +27 -27
  61. package/src/events/AgenticaResponseEvent.ts +32 -32
  62. package/src/events/AgenticaSelectEvent.ts +11 -11
  63. package/src/events/AgenticaUserMessageEvent.ts +12 -12
  64. package/src/events/AgenticaValidateEvent.ts +32 -32
  65. package/src/events/MicroAgenticaEvent.ts +45 -45
  66. package/src/events/index.ts +15 -15
  67. package/src/factory/events.ts +357 -357
  68. package/src/factory/histories.ts +348 -348
  69. package/src/factory/index.ts +3 -3
  70. package/src/factory/operations.ts +16 -16
  71. package/src/functional/assertHttpController.ts +106 -106
  72. package/src/functional/assertHttpLlmApplication.ts +52 -52
  73. package/src/functional/assertMcpController.ts +47 -47
  74. package/src/functional/createMcpLlmApplication.ts +72 -72
  75. package/src/functional/index.ts +7 -7
  76. package/src/functional/validateHttpController.ts +113 -113
  77. package/src/functional/validateHttpLlmApplication.ts +65 -65
  78. package/src/functional/validateMcpController.ts +53 -53
  79. package/src/histories/AgenticaAssistantMessageHistory.ts +10 -10
  80. package/src/histories/AgenticaCancelHistory.ts +8 -8
  81. package/src/histories/AgenticaDescribeHistory.ts +18 -18
  82. package/src/histories/AgenticaExecuteHistory.ts +64 -64
  83. package/src/histories/AgenticaHistory.ts +28 -28
  84. package/src/histories/AgenticaHistoryBase.ts +35 -35
  85. package/src/histories/AgenticaSelectHistory.ts +8 -8
  86. package/src/histories/AgenticaSystemMessageHistory.ts +10 -10
  87. package/src/histories/AgenticaUserMessageHistory.ts +11 -11
  88. package/src/histories/MicroAgenticaHistory.ts +19 -19
  89. package/src/histories/contents/AgenticaUserMessageAudioContent.ts +21 -21
  90. package/src/histories/contents/AgenticaUserMessageContent.ts +19 -19
  91. package/src/histories/contents/AgenticaUserMessageContentBase.ts +6 -6
  92. package/src/histories/contents/AgenticaUserMessageFileContent.ts +25 -25
  93. package/src/histories/contents/AgenticaUserMessageImageContent.ts +33 -33
  94. package/src/histories/contents/AgenticaUserMessageTextContent.ts +15 -15
  95. package/src/histories/contents/index.ts +5 -5
  96. package/src/histories/index.ts +10 -10
  97. package/src/index.ts +15 -15
  98. package/src/json/IAgenticaEventJson.ts +265 -265
  99. package/src/json/IAgenticaEventJson.type.ts +19 -19
  100. package/src/json/IAgenticaHistoryJson.ts +165 -165
  101. package/src/json/IAgenticaHistoryJson.type.ts +19 -19
  102. package/src/json/IAgenticaOperationJson.ts +36 -36
  103. package/src/json/IAgenticaOperationSelectionJson.ts +26 -26
  104. package/src/json/IAgenticaTokenUsageJson.ts +107 -107
  105. package/src/json/IMicroAgenticaEventJson.ts +22 -22
  106. package/src/json/IMicroAgenticaHistoryJson.ts +25 -25
  107. package/src/json/index.ts +7 -7
  108. package/src/orchestrate/call.ts +542 -542
  109. package/src/orchestrate/cancel.ts +265 -265
  110. package/src/orchestrate/describe.ts +66 -66
  111. package/src/orchestrate/execute.ts +61 -61
  112. package/src/orchestrate/index.ts +6 -6
  113. package/src/orchestrate/initialize.ts +102 -102
  114. package/src/orchestrate/internal/cancelFunctionFromContext.ts +33 -33
  115. package/src/orchestrate/internal/selectFunctionFromContext.ts +34 -34
  116. package/src/orchestrate/select.ts +320 -320
  117. package/src/structures/IAgenticaConfig.ts +83 -83
  118. package/src/structures/IAgenticaConfigBase.ts +87 -87
  119. package/src/structures/IAgenticaController.ts +143 -143
  120. package/src/structures/IAgenticaExecutor.ts +167 -167
  121. package/src/structures/IAgenticaProps.ts +78 -78
  122. package/src/structures/IAgenticaSystemPrompt.ts +236 -236
  123. package/src/structures/IAgenticaVendor.ts +54 -54
  124. package/src/structures/IMcpTool.ts +60 -60
  125. package/src/structures/IMicroAgenticaConfig.ts +56 -56
  126. package/src/structures/IMicroAgenticaExecutor.ts +67 -67
  127. package/src/structures/IMicroAgenticaProps.ts +77 -77
  128. package/src/structures/IMicroAgenticaSystemPrompt.ts +169 -169
  129. package/src/structures/index.ts +10 -10
  130. package/src/transformers/transformHistory.ts +172 -172
  131. package/src/utils/AssistantMessageEmptyError.ts +20 -20
  132. package/src/utils/AsyncQueue.spec.ts +355 -355
  133. package/src/utils/AsyncQueue.ts +95 -95
  134. package/src/utils/ByteArrayUtil.ts +5 -5
  135. package/src/utils/ChatGptCompletionMessageUtil.spec.ts +314 -314
  136. package/src/utils/ChatGptCompletionMessageUtil.ts +210 -210
  137. package/src/utils/ChatGptCompletionStreamingUtil.spec.ts +909 -909
  138. package/src/utils/ChatGptCompletionStreamingUtil.ts +91 -91
  139. package/src/utils/ChatGptTokenUsageAggregator.spec.ts +226 -226
  140. package/src/utils/ChatGptTokenUsageAggregator.ts +57 -57
  141. package/src/utils/MPSC.spec.ts +276 -276
  142. package/src/utils/MPSC.ts +42 -42
  143. package/src/utils/Singleton.spec.ts +138 -138
  144. package/src/utils/Singleton.ts +42 -42
  145. package/src/utils/StreamUtil.spec.ts +512 -512
  146. package/src/utils/StreamUtil.ts +87 -87
  147. package/src/utils/__map_take.spec.ts +140 -140
  148. package/src/utils/__map_take.ts +13 -13
  149. package/src/utils/__retry.spec.ts +198 -198
  150. package/src/utils/__retry.ts +18 -18
  151. package/src/utils/assertExecuteFailure.ts +16 -16
  152. package/src/utils/index.ts +4 -4
  153. package/src/utils/request.ts +140 -140
  154. package/src/utils/types.ts +50 -50
@@ -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";