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