@aigne/agent-runtime 1.12.0-beta.5

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 (234) hide show
  1. package/LICENSE.md +26 -0
  2. package/README.md +79 -0
  3. package/dist/agent-runners/ai-runner.cjs +133 -0
  4. package/dist/agent-runners/ai-runner.d.cts +33 -0
  5. package/dist/agent-runners/ai-runner.d.cts.map +1 -0
  6. package/dist/agent-runners/ai-runner.d.mts +33 -0
  7. package/dist/agent-runners/ai-runner.d.mts.map +1 -0
  8. package/dist/agent-runners/ai-runner.mjs +134 -0
  9. package/dist/agent-runners/ai-runner.mjs.map +1 -0
  10. package/dist/agent-runners/ash-runner.cjs +272 -0
  11. package/dist/agent-runners/ash-runner.d.cts +30 -0
  12. package/dist/agent-runners/ash-runner.d.cts.map +1 -0
  13. package/dist/agent-runners/ash-runner.d.mts +30 -0
  14. package/dist/agent-runners/ash-runner.d.mts.map +1 -0
  15. package/dist/agent-runners/ash-runner.mjs +273 -0
  16. package/dist/agent-runners/ash-runner.mjs.map +1 -0
  17. package/dist/agent-runners/budget.cjs +71 -0
  18. package/dist/agent-runners/budget.d.cts +40 -0
  19. package/dist/agent-runners/budget.d.cts.map +1 -0
  20. package/dist/agent-runners/budget.d.mts +40 -0
  21. package/dist/agent-runners/budget.d.mts.map +1 -0
  22. package/dist/agent-runners/budget.mjs +67 -0
  23. package/dist/agent-runners/budget.mjs.map +1 -0
  24. package/dist/agent-runners/code-runner.cjs +61 -0
  25. package/dist/agent-runners/code-runner.mjs +61 -0
  26. package/dist/agent-runners/code-runner.mjs.map +1 -0
  27. package/dist/agent-runners/env-whitelist.cjs +36 -0
  28. package/dist/agent-runners/env-whitelist.d.cts +5 -0
  29. package/dist/agent-runners/env-whitelist.d.cts.map +1 -0
  30. package/dist/agent-runners/env-whitelist.d.mts +5 -0
  31. package/dist/agent-runners/env-whitelist.d.mts.map +1 -0
  32. package/dist/agent-runners/env-whitelist.mjs +36 -0
  33. package/dist/agent-runners/env-whitelist.mjs.map +1 -0
  34. package/dist/agent-runners/guide-rails.cjs +47 -0
  35. package/dist/agent-runners/guide-rails.d.cts +16 -0
  36. package/dist/agent-runners/guide-rails.d.cts.map +1 -0
  37. package/dist/agent-runners/guide-rails.d.mts +16 -0
  38. package/dist/agent-runners/guide-rails.d.mts.map +1 -0
  39. package/dist/agent-runners/guide-rails.mjs +48 -0
  40. package/dist/agent-runners/guide-rails.mjs.map +1 -0
  41. package/dist/agent-runners/hook-channel.cjs +55 -0
  42. package/dist/agent-runners/hook-channel.d.cts +38 -0
  43. package/dist/agent-runners/hook-channel.d.cts.map +1 -0
  44. package/dist/agent-runners/hook-channel.d.mts +38 -0
  45. package/dist/agent-runners/hook-channel.d.mts.map +1 -0
  46. package/dist/agent-runners/hook-channel.mjs +55 -0
  47. package/dist/agent-runners/hook-channel.mjs.map +1 -0
  48. package/dist/agent-runners/hooks.cjs +107 -0
  49. package/dist/agent-runners/hooks.d.cts +41 -0
  50. package/dist/agent-runners/hooks.d.cts.map +1 -0
  51. package/dist/agent-runners/hooks.d.mts +41 -0
  52. package/dist/agent-runners/hooks.d.mts.map +1 -0
  53. package/dist/agent-runners/hooks.mjs +107 -0
  54. package/dist/agent-runners/hooks.mjs.map +1 -0
  55. package/dist/agent-runners/memory-afs.cjs +342 -0
  56. package/dist/agent-runners/memory-afs.d.cts +221 -0
  57. package/dist/agent-runners/memory-afs.d.cts.map +1 -0
  58. package/dist/agent-runners/memory-afs.d.mts +221 -0
  59. package/dist/agent-runners/memory-afs.d.mts.map +1 -0
  60. package/dist/agent-runners/memory-afs.mjs +326 -0
  61. package/dist/agent-runners/memory-afs.mjs.map +1 -0
  62. package/dist/agent-runners/memory-archive.cjs +263 -0
  63. package/dist/agent-runners/memory-archive.d.cts +47 -0
  64. package/dist/agent-runners/memory-archive.d.cts.map +1 -0
  65. package/dist/agent-runners/memory-archive.d.mts +47 -0
  66. package/dist/agent-runners/memory-archive.d.mts.map +1 -0
  67. package/dist/agent-runners/memory-archive.mjs +257 -0
  68. package/dist/agent-runners/memory-archive.mjs.map +1 -0
  69. package/dist/agent-runners/orchestrator-runner.cjs +302 -0
  70. package/dist/agent-runners/orchestrator-runner.d.cts +23 -0
  71. package/dist/agent-runners/orchestrator-runner.d.cts.map +1 -0
  72. package/dist/agent-runners/orchestrator-runner.d.mts +23 -0
  73. package/dist/agent-runners/orchestrator-runner.d.mts.map +1 -0
  74. package/dist/agent-runners/orchestrator-runner.mjs +303 -0
  75. package/dist/agent-runners/orchestrator-runner.mjs.map +1 -0
  76. package/dist/agent-runners/orchestrator-state.cjs +68 -0
  77. package/dist/agent-runners/orchestrator-state.d.cts +23 -0
  78. package/dist/agent-runners/orchestrator-state.d.cts.map +1 -0
  79. package/dist/agent-runners/orchestrator-state.d.mts +23 -0
  80. package/dist/agent-runners/orchestrator-state.d.mts.map +1 -0
  81. package/dist/agent-runners/orchestrator-state.mjs +65 -0
  82. package/dist/agent-runners/orchestrator-state.mjs.map +1 -0
  83. package/dist/agent-runners/retry.cjs +30 -0
  84. package/dist/agent-runners/retry.d.cts +13 -0
  85. package/dist/agent-runners/retry.d.cts.map +1 -0
  86. package/dist/agent-runners/retry.d.mts +13 -0
  87. package/dist/agent-runners/retry.d.mts.map +1 -0
  88. package/dist/agent-runners/retry.mjs +30 -0
  89. package/dist/agent-runners/retry.mjs.map +1 -0
  90. package/dist/agent-runners/scratchpad-afs.cjs +276 -0
  91. package/dist/agent-runners/scratchpad-afs.d.cts +103 -0
  92. package/dist/agent-runners/scratchpad-afs.d.cts.map +1 -0
  93. package/dist/agent-runners/scratchpad-afs.d.mts +103 -0
  94. package/dist/agent-runners/scratchpad-afs.d.mts.map +1 -0
  95. package/dist/agent-runners/scratchpad-afs.mjs +271 -0
  96. package/dist/agent-runners/scratchpad-afs.mjs.map +1 -0
  97. package/dist/agent-runners/stream-router.cjs +72 -0
  98. package/dist/agent-runners/stream-router.d.cts +22 -0
  99. package/dist/agent-runners/stream-router.d.cts.map +1 -0
  100. package/dist/agent-runners/stream-router.d.mts +22 -0
  101. package/dist/agent-runners/stream-router.d.mts.map +1 -0
  102. package/dist/agent-runners/stream-router.mjs +72 -0
  103. package/dist/agent-runners/stream-router.mjs.map +1 -0
  104. package/dist/agent-runners/system-prompt.cjs +35 -0
  105. package/dist/agent-runners/system-prompt.d.cts +17 -0
  106. package/dist/agent-runners/system-prompt.d.cts.map +1 -0
  107. package/dist/agent-runners/system-prompt.d.mts +17 -0
  108. package/dist/agent-runners/system-prompt.d.mts.map +1 -0
  109. package/dist/agent-runners/system-prompt.mjs +34 -0
  110. package/dist/agent-runners/system-prompt.mjs.map +1 -0
  111. package/dist/agent-runners/team-modes/aggregates.cjs +36 -0
  112. package/dist/agent-runners/team-modes/aggregates.mjs +35 -0
  113. package/dist/agent-runners/team-modes/aggregates.mjs.map +1 -0
  114. package/dist/agent-runners/team-modes/iterate.cjs +46 -0
  115. package/dist/agent-runners/team-modes/iterate.mjs +47 -0
  116. package/dist/agent-runners/team-modes/iterate.mjs.map +1 -0
  117. package/dist/agent-runners/team-modes/parallel.cjs +59 -0
  118. package/dist/agent-runners/team-modes/parallel.mjs +60 -0
  119. package/dist/agent-runners/team-modes/parallel.mjs.map +1 -0
  120. package/dist/agent-runners/team-modes/reflection.cjs +155 -0
  121. package/dist/agent-runners/team-modes/reflection.mjs +156 -0
  122. package/dist/agent-runners/team-modes/reflection.mjs.map +1 -0
  123. package/dist/agent-runners/team-modes/sequential.cjs +63 -0
  124. package/dist/agent-runners/team-modes/sequential.mjs +64 -0
  125. package/dist/agent-runners/team-modes/sequential.mjs.map +1 -0
  126. package/dist/agent-runners/team-modes/utils.cjs +39 -0
  127. package/dist/agent-runners/team-modes/utils.mjs +36 -0
  128. package/dist/agent-runners/team-modes/utils.mjs.map +1 -0
  129. package/dist/agent-runners/team-runner.cjs +277 -0
  130. package/dist/agent-runners/team-runner.d.cts +34 -0
  131. package/dist/agent-runners/team-runner.d.cts.map +1 -0
  132. package/dist/agent-runners/team-runner.d.mts +34 -0
  133. package/dist/agent-runners/team-runner.d.mts.map +1 -0
  134. package/dist/agent-runners/team-runner.mjs +278 -0
  135. package/dist/agent-runners/team-runner.mjs.map +1 -0
  136. package/dist/agent-runners/template-context.cjs +32 -0
  137. package/dist/agent-runners/template-context.d.cts +43 -0
  138. package/dist/agent-runners/template-context.d.cts.map +1 -0
  139. package/dist/agent-runners/template-context.d.mts +43 -0
  140. package/dist/agent-runners/template-context.d.mts.map +1 -0
  141. package/dist/agent-runners/template-context.mjs +33 -0
  142. package/dist/agent-runners/template-context.mjs.map +1 -0
  143. package/dist/index.cjs +123 -0
  144. package/dist/index.d.cts +29 -0
  145. package/dist/index.d.mts +29 -0
  146. package/dist/index.mjs +29 -0
  147. package/dist/program/agent-action.cjs +496 -0
  148. package/dist/program/agent-action.d.cts +42 -0
  149. package/dist/program/agent-action.d.cts.map +1 -0
  150. package/dist/program/agent-action.d.mts +42 -0
  151. package/dist/program/agent-action.d.mts.map +1 -0
  152. package/dist/program/agent-action.mjs +497 -0
  153. package/dist/program/agent-action.mjs.map +1 -0
  154. package/dist/program/agent-messages-tools.cjs +137 -0
  155. package/dist/program/agent-messages-tools.d.cts +59 -0
  156. package/dist/program/agent-messages-tools.d.cts.map +1 -0
  157. package/dist/program/agent-messages-tools.d.mts +59 -0
  158. package/dist/program/agent-messages-tools.d.mts.map +1 -0
  159. package/dist/program/agent-messages-tools.mjs +130 -0
  160. package/dist/program/agent-messages-tools.mjs.map +1 -0
  161. package/dist/program/agent-runner-registry.cjs +314 -0
  162. package/dist/program/agent-runner-registry.d.cts +52 -0
  163. package/dist/program/agent-runner-registry.d.cts.map +1 -0
  164. package/dist/program/agent-runner-registry.d.mts +52 -0
  165. package/dist/program/agent-runner-registry.d.mts.map +1 -0
  166. package/dist/program/agent-runner-registry.mjs +313 -0
  167. package/dist/program/agent-runner-registry.mjs.map +1 -0
  168. package/dist/program/agent-subscribe.cjs +72 -0
  169. package/dist/program/agent-subscribe.d.cts +18 -0
  170. package/dist/program/agent-subscribe.d.cts.map +1 -0
  171. package/dist/program/agent-subscribe.d.mts +18 -0
  172. package/dist/program/agent-subscribe.d.mts.map +1 -0
  173. package/dist/program/agent-subscribe.mjs +73 -0
  174. package/dist/program/agent-subscribe.mjs.map +1 -0
  175. package/dist/program/agent-tools.cjs +135 -0
  176. package/dist/program/agent-tools.d.cts +35 -0
  177. package/dist/program/agent-tools.d.cts.map +1 -0
  178. package/dist/program/agent-tools.d.mts +35 -0
  179. package/dist/program/agent-tools.d.mts.map +1 -0
  180. package/dist/program/agent-tools.mjs +136 -0
  181. package/dist/program/agent-tools.mjs.map +1 -0
  182. package/dist/program/manifest-nesting.cjs +57 -0
  183. package/dist/program/manifest-nesting.d.cts +13 -0
  184. package/dist/program/manifest-nesting.d.cts.map +1 -0
  185. package/dist/program/manifest-nesting.d.mts +13 -0
  186. package/dist/program/manifest-nesting.d.mts.map +1 -0
  187. package/dist/program/manifest-nesting.mjs +57 -0
  188. package/dist/program/manifest-nesting.mjs.map +1 -0
  189. package/dist/program/result-contract.cjs +55 -0
  190. package/dist/program/result-contract.d.cts +23 -0
  191. package/dist/program/result-contract.d.cts.map +1 -0
  192. package/dist/program/result-contract.d.mts +23 -0
  193. package/dist/program/result-contract.d.mts.map +1 -0
  194. package/dist/program/result-contract.mjs +51 -0
  195. package/dist/program/result-contract.mjs.map +1 -0
  196. package/dist/program/runner-error.cjs +71 -0
  197. package/dist/program/runner-error.d.cts +25 -0
  198. package/dist/program/runner-error.d.cts.map +1 -0
  199. package/dist/program/runner-error.d.mts +25 -0
  200. package/dist/program/runner-error.d.mts.map +1 -0
  201. package/dist/program/runner-error.mjs +72 -0
  202. package/dist/program/runner-error.mjs.map +1 -0
  203. package/dist/program/scoped-afs.cjs +538 -0
  204. package/dist/program/scoped-afs.d.cts +245 -0
  205. package/dist/program/scoped-afs.d.cts.map +1 -0
  206. package/dist/program/scoped-afs.d.mts +245 -0
  207. package/dist/program/scoped-afs.d.mts.map +1 -0
  208. package/dist/program/scoped-afs.mjs +531 -0
  209. package/dist/program/scoped-afs.mjs.map +1 -0
  210. package/dist/program/session-hierarchy.cjs +1 -0
  211. package/dist/program/session-hierarchy.d.cts +2 -0
  212. package/dist/program/session-hierarchy.d.mts +2 -0
  213. package/dist/program/session-hierarchy.mjs +3 -0
  214. package/dist/program/tool-discovery/ash-frontmatter.cjs +83 -0
  215. package/dist/program/tool-discovery/ash-frontmatter.d.cts +21 -0
  216. package/dist/program/tool-discovery/ash-frontmatter.d.cts.map +1 -0
  217. package/dist/program/tool-discovery/ash-frontmatter.d.mts +21 -0
  218. package/dist/program/tool-discovery/ash-frontmatter.d.mts.map +1 -0
  219. package/dist/program/tool-discovery/ash-frontmatter.mjs +84 -0
  220. package/dist/program/tool-discovery/ash-frontmatter.mjs.map +1 -0
  221. package/dist/program/tool-discovery/dot-path-resolver.cjs +60 -0
  222. package/dist/program/tool-discovery/dot-path-resolver.mjs +61 -0
  223. package/dist/program/tool-discovery/dot-path-resolver.mjs.map +1 -0
  224. package/dist/program/tool-discovery/skill-gate.cjs +36 -0
  225. package/dist/program/tool-discovery/skill-gate.d.cts +10 -0
  226. package/dist/program/tool-discovery/skill-gate.d.cts.map +1 -0
  227. package/dist/program/tool-discovery/skill-gate.d.mts +10 -0
  228. package/dist/program/tool-discovery/skill-gate.d.mts.map +1 -0
  229. package/dist/program/tool-discovery/skill-gate.mjs +35 -0
  230. package/dist/program/tool-discovery/skill-gate.mjs.map +1 -0
  231. package/dist/providers/basic/ash/dist/index.cjs +1809 -0
  232. package/dist/providers/basic/ash/dist/index.mjs +1807 -0
  233. package/dist/providers/basic/ash/dist/index.mjs.map +1 -0
  234. package/package.json +67 -0
@@ -0,0 +1,155 @@
1
+ const require_memory_archive = require('../memory-archive.cjs');
2
+ const require_utils = require('./utils.cjs');
3
+
4
+ //#region src/agent-runners/team-modes/reflection.ts
5
+ const HARD_MAX_ITERATIONS = 50;
6
+ function parseReviewerOutput(reply, isApprovedField) {
7
+ let obj;
8
+ if (typeof reply === "string") try {
9
+ obj = JSON.parse(reply);
10
+ } catch {
11
+ return {
12
+ approved: false,
13
+ feedback: reply
14
+ };
15
+ }
16
+ else if (reply && typeof reply === "object") obj = reply;
17
+ else return { approved: false };
18
+ return {
19
+ approved: !!obj[isApprovedField],
20
+ feedback: obj.feedback ?? obj
21
+ };
22
+ }
23
+ async function runReflection(opts) {
24
+ const { afs, actorPath, reviewerPath, session, inputKey, input, isApprovedField, hookChannel, runMember } = opts;
25
+ const maxIterations = Math.min(opts.maxIterations, HARD_MAX_ITERATIONS);
26
+ const returnLastOnMax = opts.returnLastOnMax;
27
+ const actorName = require_utils.memberName(actorPath);
28
+ const reviewerName = require_utils.memberName(reviewerPath);
29
+ const actorSession = require_utils.memberSession(session, actorPath, "actor");
30
+ const reviewerSession = require_utils.memberSession(session, reviewerPath, "reviewer");
31
+ let lastActorOutput;
32
+ let currentInput = { ...input };
33
+ let iteration = 0;
34
+ for (iteration = 1; iteration <= maxIterations; iteration++) {
35
+ const actorResult = await runMember(actorPath, currentInput, actorSession);
36
+ if (!actorResult.success) return {
37
+ success: false,
38
+ error: {
39
+ code: "TEAM_MEMBER_FAILED",
40
+ message: `Actor "${actorName}" failed at iteration ${iteration}`,
41
+ member: actorName
42
+ },
43
+ _meta: {
44
+ mode: "reflection",
45
+ iterations: iteration,
46
+ max_iterations_hit: false,
47
+ hook_events: hookChannel.drain()
48
+ }
49
+ };
50
+ lastActorOutput = require_utils.extractReply(actorResult);
51
+ const actorContent = require_memory_archive.toContentString(lastActorOutput);
52
+ const actorHash = require_memory_archive.contentHash(actorContent);
53
+ await require_memory_archive.tryRemember(afs, {
54
+ content: actorContent,
55
+ level: "observation",
56
+ layer: "execution",
57
+ anchors: [{
58
+ type: "topic",
59
+ values: [actorName],
60
+ confidence: 1
61
+ }, {
62
+ type: "topic",
63
+ values: ["reflection"],
64
+ confidence: 1
65
+ }],
66
+ meta: {
67
+ round: iteration,
68
+ role: "actor",
69
+ session,
70
+ output_hash: actorHash
71
+ }
72
+ });
73
+ hookChannel.emit("on_handoff", {
74
+ from: actorName,
75
+ to: reviewerName,
76
+ iteration,
77
+ session
78
+ });
79
+ const reviewerResult = await runMember(reviewerPath, { [inputKey]: typeof lastActorOutput === "string" ? lastActorOutput : JSON.stringify(lastActorOutput) }, reviewerSession);
80
+ if (!reviewerResult.success) return {
81
+ success: false,
82
+ error: {
83
+ code: "TEAM_MEMBER_FAILED",
84
+ message: `Reviewer "${reviewerName}" failed at iteration ${iteration}`,
85
+ member: reviewerName
86
+ },
87
+ _meta: {
88
+ mode: "reflection",
89
+ iterations: iteration,
90
+ max_iterations_hit: false,
91
+ hook_events: hookChannel.drain()
92
+ }
93
+ };
94
+ const reviewerReply = require_utils.extractReply(reviewerResult);
95
+ const { approved, feedback } = parseReviewerOutput(reviewerReply, isApprovedField);
96
+ await require_memory_archive.tryRemember(afs, {
97
+ content: require_memory_archive.toContentString(feedback ?? reviewerReply),
98
+ level: "observation",
99
+ layer: "execution",
100
+ anchors: [{
101
+ type: "topic",
102
+ values: [reviewerName],
103
+ confidence: 1
104
+ }, {
105
+ type: "topic",
106
+ values: ["reflection"],
107
+ confidence: 1
108
+ }],
109
+ meta: {
110
+ round: iteration,
111
+ role: "reviewer",
112
+ session,
113
+ target_hash: actorHash,
114
+ approved
115
+ }
116
+ });
117
+ if (approved) return {
118
+ success: true,
119
+ data: { result: lastActorOutput },
120
+ _meta: {
121
+ mode: "reflection",
122
+ iterations: iteration,
123
+ max_iterations_hit: false,
124
+ hook_events: hookChannel.drain()
125
+ }
126
+ };
127
+ currentInput = { [inputKey]: typeof feedback === "string" ? feedback : JSON.stringify(feedback) };
128
+ }
129
+ if (returnLastOnMax && lastActorOutput !== void 0) return {
130
+ success: true,
131
+ data: { result: lastActorOutput },
132
+ _meta: {
133
+ mode: "reflection",
134
+ iterations: maxIterations,
135
+ max_iterations_hit: true,
136
+ hook_events: hookChannel.drain()
137
+ }
138
+ };
139
+ return {
140
+ success: false,
141
+ error: {
142
+ code: "REFLECTION_MAX_ITERATIONS",
143
+ message: `Reflection did not converge within ${maxIterations} iterations`
144
+ },
145
+ _meta: {
146
+ mode: "reflection",
147
+ iterations: maxIterations,
148
+ max_iterations_hit: true,
149
+ hook_events: hookChannel.drain()
150
+ }
151
+ };
152
+ }
153
+
154
+ //#endregion
155
+ exports.runReflection = runReflection;
@@ -0,0 +1,156 @@
1
+ import { contentHash, toContentString, tryRemember } from "../memory-archive.mjs";
2
+ import { extractReply, memberName, memberSession } from "./utils.mjs";
3
+
4
+ //#region src/agent-runners/team-modes/reflection.ts
5
+ const HARD_MAX_ITERATIONS = 50;
6
+ function parseReviewerOutput(reply, isApprovedField) {
7
+ let obj;
8
+ if (typeof reply === "string") try {
9
+ obj = JSON.parse(reply);
10
+ } catch {
11
+ return {
12
+ approved: false,
13
+ feedback: reply
14
+ };
15
+ }
16
+ else if (reply && typeof reply === "object") obj = reply;
17
+ else return { approved: false };
18
+ return {
19
+ approved: !!obj[isApprovedField],
20
+ feedback: obj.feedback ?? obj
21
+ };
22
+ }
23
+ async function runReflection(opts) {
24
+ const { afs, actorPath, reviewerPath, session, inputKey, input, isApprovedField, hookChannel, runMember } = opts;
25
+ const maxIterations = Math.min(opts.maxIterations, HARD_MAX_ITERATIONS);
26
+ const returnLastOnMax = opts.returnLastOnMax;
27
+ const actorName = memberName(actorPath);
28
+ const reviewerName = memberName(reviewerPath);
29
+ const actorSession = memberSession(session, actorPath, "actor");
30
+ const reviewerSession = memberSession(session, reviewerPath, "reviewer");
31
+ let lastActorOutput;
32
+ let currentInput = { ...input };
33
+ let iteration = 0;
34
+ for (iteration = 1; iteration <= maxIterations; iteration++) {
35
+ const actorResult = await runMember(actorPath, currentInput, actorSession);
36
+ if (!actorResult.success) return {
37
+ success: false,
38
+ error: {
39
+ code: "TEAM_MEMBER_FAILED",
40
+ message: `Actor "${actorName}" failed at iteration ${iteration}`,
41
+ member: actorName
42
+ },
43
+ _meta: {
44
+ mode: "reflection",
45
+ iterations: iteration,
46
+ max_iterations_hit: false,
47
+ hook_events: hookChannel.drain()
48
+ }
49
+ };
50
+ lastActorOutput = extractReply(actorResult);
51
+ const actorContent = toContentString(lastActorOutput);
52
+ const actorHash = contentHash(actorContent);
53
+ await tryRemember(afs, {
54
+ content: actorContent,
55
+ level: "observation",
56
+ layer: "execution",
57
+ anchors: [{
58
+ type: "topic",
59
+ values: [actorName],
60
+ confidence: 1
61
+ }, {
62
+ type: "topic",
63
+ values: ["reflection"],
64
+ confidence: 1
65
+ }],
66
+ meta: {
67
+ round: iteration,
68
+ role: "actor",
69
+ session,
70
+ output_hash: actorHash
71
+ }
72
+ });
73
+ hookChannel.emit("on_handoff", {
74
+ from: actorName,
75
+ to: reviewerName,
76
+ iteration,
77
+ session
78
+ });
79
+ const reviewerResult = await runMember(reviewerPath, { [inputKey]: typeof lastActorOutput === "string" ? lastActorOutput : JSON.stringify(lastActorOutput) }, reviewerSession);
80
+ if (!reviewerResult.success) return {
81
+ success: false,
82
+ error: {
83
+ code: "TEAM_MEMBER_FAILED",
84
+ message: `Reviewer "${reviewerName}" failed at iteration ${iteration}`,
85
+ member: reviewerName
86
+ },
87
+ _meta: {
88
+ mode: "reflection",
89
+ iterations: iteration,
90
+ max_iterations_hit: false,
91
+ hook_events: hookChannel.drain()
92
+ }
93
+ };
94
+ const reviewerReply = extractReply(reviewerResult);
95
+ const { approved, feedback } = parseReviewerOutput(reviewerReply, isApprovedField);
96
+ await tryRemember(afs, {
97
+ content: toContentString(feedback ?? reviewerReply),
98
+ level: "observation",
99
+ layer: "execution",
100
+ anchors: [{
101
+ type: "topic",
102
+ values: [reviewerName],
103
+ confidence: 1
104
+ }, {
105
+ type: "topic",
106
+ values: ["reflection"],
107
+ confidence: 1
108
+ }],
109
+ meta: {
110
+ round: iteration,
111
+ role: "reviewer",
112
+ session,
113
+ target_hash: actorHash,
114
+ approved
115
+ }
116
+ });
117
+ if (approved) return {
118
+ success: true,
119
+ data: { result: lastActorOutput },
120
+ _meta: {
121
+ mode: "reflection",
122
+ iterations: iteration,
123
+ max_iterations_hit: false,
124
+ hook_events: hookChannel.drain()
125
+ }
126
+ };
127
+ currentInput = { [inputKey]: typeof feedback === "string" ? feedback : JSON.stringify(feedback) };
128
+ }
129
+ if (returnLastOnMax && lastActorOutput !== void 0) return {
130
+ success: true,
131
+ data: { result: lastActorOutput },
132
+ _meta: {
133
+ mode: "reflection",
134
+ iterations: maxIterations,
135
+ max_iterations_hit: true,
136
+ hook_events: hookChannel.drain()
137
+ }
138
+ };
139
+ return {
140
+ success: false,
141
+ error: {
142
+ code: "REFLECTION_MAX_ITERATIONS",
143
+ message: `Reflection did not converge within ${maxIterations} iterations`
144
+ },
145
+ _meta: {
146
+ mode: "reflection",
147
+ iterations: maxIterations,
148
+ max_iterations_hit: true,
149
+ hook_events: hookChannel.drain()
150
+ }
151
+ };
152
+ }
153
+
154
+ //#endregion
155
+ export { runReflection };
156
+ //# sourceMappingURL=reflection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflection.mjs","names":[],"sources":["../../../src/agent-runners/team-modes/reflection.ts"],"sourcesContent":["import type { AFSRoot } from \"@aigne/afs\";\nimport type { HookChannel } from \"../hook-channel.js\";\nimport { contentHash, toContentString, tryRemember } from \"../memory-archive.js\";\nimport type { MemberRunFn } from \"./types.js\";\nimport { extractReply, memberName, memberSession } from \"./utils.js\";\n\nconst HARD_MAX_ITERATIONS = 50;\n\nexport interface ReflectionOptions {\n afs?: AFSRoot;\n actorPath: string;\n reviewerPath: string;\n session: string;\n inputKey: string;\n input: Record<string, unknown>;\n isApprovedField: string;\n maxIterations: number;\n returnLastOnMax: boolean;\n hookChannel: HookChannel;\n runMember: MemberRunFn;\n}\n\nexport interface ReflectionResult {\n success: boolean;\n data?: Record<string, unknown>;\n error?: { code: string; message: string; member?: string };\n _meta: {\n mode: \"reflection\";\n iterations: number;\n max_iterations_hit: boolean;\n hook_events: any[];\n };\n}\n\nfunction parseReviewerOutput(\n reply: unknown,\n isApprovedField: string,\n): { approved: boolean; feedback?: unknown } {\n let obj: Record<string, unknown>;\n if (typeof reply === \"string\") {\n try {\n obj = JSON.parse(reply);\n } catch {\n return { approved: false, feedback: reply };\n }\n } else if (reply && typeof reply === \"object\") {\n obj = reply as Record<string, unknown>;\n } else {\n return { approved: false };\n }\n\n const approved = !!obj[isApprovedField];\n return { approved, feedback: obj.feedback ?? obj };\n}\n\nexport async function runReflection(opts: ReflectionOptions): Promise<ReflectionResult> {\n const {\n afs,\n actorPath,\n reviewerPath,\n session,\n inputKey,\n input,\n isApprovedField,\n hookChannel,\n runMember,\n } = opts;\n const maxIterations = Math.min(opts.maxIterations, HARD_MAX_ITERATIONS);\n const returnLastOnMax = opts.returnLastOnMax;\n\n const actorName = memberName(actorPath);\n const reviewerName = memberName(reviewerPath);\n const actorSession = memberSession(session, actorPath, \"actor\");\n const reviewerSession = memberSession(session, reviewerPath, \"reviewer\");\n\n let lastActorOutput: unknown;\n let currentInput: Record<string, unknown> = { ...input };\n let iteration = 0;\n\n for (iteration = 1; iteration <= maxIterations; iteration++) {\n // Run actor\n const actorResult = await runMember(actorPath, currentInput, actorSession);\n if (!actorResult.success) {\n return {\n success: false,\n error: {\n code: \"TEAM_MEMBER_FAILED\",\n message: `Actor \"${actorName}\" failed at iteration ${iteration}`,\n member: actorName,\n },\n _meta: {\n mode: \"reflection\",\n iterations: iteration,\n max_iterations_hit: false,\n hook_events: hookChannel.drain(),\n },\n };\n }\n\n lastActorOutput = extractReply(actorResult);\n\n // Archive actor output (fire-and-forget — /memory/.actions/remember).\n const actorContent = toContentString(lastActorOutput);\n const actorHash = contentHash(actorContent);\n await tryRemember(afs, {\n content: actorContent,\n level: \"observation\",\n layer: \"execution\",\n anchors: [\n { type: \"topic\", values: [actorName], confidence: 1 },\n { type: \"topic\", values: [\"reflection\"], confidence: 1 },\n ],\n meta: {\n round: iteration,\n role: \"actor\",\n session,\n output_hash: actorHash,\n },\n });\n\n // Emit on_handoff at iteration boundary (actor → reviewer)\n hookChannel.emit(\"on_handoff\", {\n from: actorName,\n to: reviewerName,\n iteration,\n session,\n });\n\n // Run reviewer — only pass the actor's output, not internal metadata\n const reviewerInput: Record<string, unknown> = {\n [inputKey]:\n typeof lastActorOutput === \"string\" ? lastActorOutput : JSON.stringify(lastActorOutput),\n };\n const reviewerResult = await runMember(reviewerPath, reviewerInput, reviewerSession);\n if (!reviewerResult.success) {\n return {\n success: false,\n error: {\n code: \"TEAM_MEMBER_FAILED\",\n message: `Reviewer \"${reviewerName}\" failed at iteration ${iteration}`,\n member: reviewerName,\n },\n _meta: {\n mode: \"reflection\",\n iterations: iteration,\n max_iterations_hit: false,\n hook_events: hookChannel.drain(),\n },\n };\n }\n\n const reviewerReply = extractReply(reviewerResult);\n const { approved, feedback } = parseReviewerOutput(reviewerReply, isApprovedField);\n\n // Archive reviewer verdict (fire-and-forget), binding to actor via target_hash.\n const reviewerContent = toContentString(feedback ?? reviewerReply);\n await tryRemember(afs, {\n content: reviewerContent,\n level: \"observation\",\n layer: \"execution\",\n anchors: [\n { type: \"topic\", values: [reviewerName], confidence: 1 },\n { type: \"topic\", values: [\"reflection\"], confidence: 1 },\n ],\n meta: {\n round: iteration,\n role: \"reviewer\",\n session,\n target_hash: actorHash,\n approved,\n },\n });\n\n if (approved) {\n return {\n success: true,\n data: { result: lastActorOutput },\n _meta: {\n mode: \"reflection\",\n iterations: iteration,\n max_iterations_hit: false,\n hook_events: hookChannel.drain(),\n },\n };\n }\n\n // Feed reviewer feedback back to actor for next iteration\n currentInput = {\n [inputKey]: typeof feedback === \"string\" ? feedback : JSON.stringify(feedback),\n };\n }\n\n // Max iterations hit\n if (returnLastOnMax && lastActorOutput !== undefined) {\n return {\n success: true,\n data: { result: lastActorOutput },\n _meta: {\n mode: \"reflection\",\n iterations: maxIterations,\n max_iterations_hit: true,\n hook_events: hookChannel.drain(),\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: \"REFLECTION_MAX_ITERATIONS\",\n message: `Reflection did not converge within ${maxIterations} iterations`,\n },\n _meta: {\n mode: \"reflection\",\n iterations: maxIterations,\n max_iterations_hit: true,\n hook_events: hookChannel.drain(),\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ const require_utils = require('./utils.cjs');
2
+ const require_aggregates = require('./aggregates.cjs');
3
+
4
+ //#region src/agent-runners/team-modes/sequential.ts
5
+ async function runSequential(opts) {
6
+ const { members, session, inputKey, input, hookChannel, runMember } = opts;
7
+ let currentInput = { ...input };
8
+ let completedSteps = 0;
9
+ const agg = require_aggregates.emptyAggregates();
10
+ for (let i = 0; i < members.length; i++) {
11
+ const memberPath = members[i];
12
+ const name = require_utils.memberName(memberPath);
13
+ if (i > 0) {
14
+ const prevName = require_utils.memberName(members[i - 1]);
15
+ hookChannel.emit("on_handoff", {
16
+ from: prevName,
17
+ to: name,
18
+ session
19
+ });
20
+ }
21
+ const memberResult = await runMember(memberPath, currentInput, require_utils.memberSession(session, memberPath, i));
22
+ require_aggregates.mergeMemberMeta(agg, memberResult);
23
+ if (!memberResult.success) return {
24
+ success: false,
25
+ error: {
26
+ code: "TEAM_MEMBER_FAILED",
27
+ message: `Member "${name}" failed at step ${i}`,
28
+ member: name,
29
+ index: i
30
+ },
31
+ _meta: {
32
+ mode: "sequential",
33
+ members_run: i + 1,
34
+ completed_steps: completedSteps,
35
+ hook_events: hookChannel.drain(),
36
+ member_run_ids: agg.member_run_ids,
37
+ rounds: agg.rounds,
38
+ tokens_used: agg.tokens_used,
39
+ sub_runs: i + 1
40
+ }
41
+ };
42
+ completedSteps++;
43
+ const reply = require_utils.extractReply(memberResult);
44
+ currentInput = { [inputKey]: typeof reply === "string" ? reply : JSON.stringify(reply) };
45
+ }
46
+ return {
47
+ success: true,
48
+ data: { result: currentInput[inputKey] },
49
+ _meta: {
50
+ mode: "sequential",
51
+ members_run: members.length,
52
+ completed_steps: completedSteps,
53
+ hook_events: hookChannel.drain(),
54
+ member_run_ids: agg.member_run_ids,
55
+ rounds: agg.rounds,
56
+ tokens_used: agg.tokens_used,
57
+ sub_runs: members.length
58
+ }
59
+ };
60
+ }
61
+
62
+ //#endregion
63
+ exports.runSequential = runSequential;
@@ -0,0 +1,64 @@
1
+ import { extractReply, memberName, memberSession } from "./utils.mjs";
2
+ import { emptyAggregates, mergeMemberMeta } from "./aggregates.mjs";
3
+
4
+ //#region src/agent-runners/team-modes/sequential.ts
5
+ async function runSequential(opts) {
6
+ const { members, session, inputKey, input, hookChannel, runMember } = opts;
7
+ let currentInput = { ...input };
8
+ let completedSteps = 0;
9
+ const agg = emptyAggregates();
10
+ for (let i = 0; i < members.length; i++) {
11
+ const memberPath = members[i];
12
+ const name = memberName(memberPath);
13
+ if (i > 0) {
14
+ const prevName = memberName(members[i - 1]);
15
+ hookChannel.emit("on_handoff", {
16
+ from: prevName,
17
+ to: name,
18
+ session
19
+ });
20
+ }
21
+ const memberResult = await runMember(memberPath, currentInput, memberSession(session, memberPath, i));
22
+ mergeMemberMeta(agg, memberResult);
23
+ if (!memberResult.success) return {
24
+ success: false,
25
+ error: {
26
+ code: "TEAM_MEMBER_FAILED",
27
+ message: `Member "${name}" failed at step ${i}`,
28
+ member: name,
29
+ index: i
30
+ },
31
+ _meta: {
32
+ mode: "sequential",
33
+ members_run: i + 1,
34
+ completed_steps: completedSteps,
35
+ hook_events: hookChannel.drain(),
36
+ member_run_ids: agg.member_run_ids,
37
+ rounds: agg.rounds,
38
+ tokens_used: agg.tokens_used,
39
+ sub_runs: i + 1
40
+ }
41
+ };
42
+ completedSteps++;
43
+ const reply = extractReply(memberResult);
44
+ currentInput = { [inputKey]: typeof reply === "string" ? reply : JSON.stringify(reply) };
45
+ }
46
+ return {
47
+ success: true,
48
+ data: { result: currentInput[inputKey] },
49
+ _meta: {
50
+ mode: "sequential",
51
+ members_run: members.length,
52
+ completed_steps: completedSteps,
53
+ hook_events: hookChannel.drain(),
54
+ member_run_ids: agg.member_run_ids,
55
+ rounds: agg.rounds,
56
+ tokens_used: agg.tokens_used,
57
+ sub_runs: members.length
58
+ }
59
+ };
60
+ }
61
+
62
+ //#endregion
63
+ export { runSequential };
64
+ //# sourceMappingURL=sequential.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequential.mjs","names":[],"sources":["../../../src/agent-runners/team-modes/sequential.ts"],"sourcesContent":["import type { HookChannel } from \"../hook-channel.js\";\nimport { emptyAggregates, type MemberAggregates, mergeMemberMeta } from \"./aggregates.js\";\nimport type { MemberRunFn } from \"./types.js\";\nimport { extractReply, memberName, memberSession } from \"./utils.js\";\n\nexport interface SequentialOptions {\n members: string[];\n session: string;\n inputKey: string;\n input: Record<string, unknown>;\n hookChannel: HookChannel;\n runMember: MemberRunFn;\n}\n\nexport interface SequentialResult {\n success: boolean;\n data?: Record<string, unknown>;\n error?: { code: string; message: string; member?: string; index?: number };\n _meta: {\n mode: \"sequential\";\n members_run: number;\n completed_steps: number;\n hook_events: any[];\n member_run_ids: string[];\n rounds: number;\n tokens_used: number;\n sub_runs: number;\n };\n}\n\nexport async function runSequential(opts: SequentialOptions): Promise<SequentialResult> {\n const { members, session, inputKey, input, hookChannel, runMember } = opts;\n\n let currentInput: Record<string, unknown> = { ...input };\n let completedSteps = 0;\n const agg: MemberAggregates = emptyAggregates();\n\n for (let i = 0; i < members.length; i++) {\n const memberPath = members[i]!;\n const name = memberName(memberPath);\n\n if (i > 0) {\n const prevName = memberName(members[i - 1]!);\n hookChannel.emit(\"on_handoff\", {\n from: prevName,\n to: name,\n session,\n });\n }\n\n const memberResult = await runMember(\n memberPath,\n currentInput,\n memberSession(session, memberPath, i),\n );\n mergeMemberMeta(agg, memberResult);\n\n if (!memberResult.success) {\n return {\n success: false,\n error: {\n code: \"TEAM_MEMBER_FAILED\",\n message: `Member \"${name}\" failed at step ${i}`,\n member: name,\n index: i,\n },\n _meta: {\n mode: \"sequential\",\n members_run: i + 1,\n completed_steps: completedSteps,\n hook_events: hookChannel.drain(),\n member_run_ids: agg.member_run_ids,\n rounds: agg.rounds,\n tokens_used: agg.tokens_used,\n sub_runs: i + 1,\n },\n };\n }\n\n completedSteps++;\n const reply = extractReply(memberResult);\n currentInput = { [inputKey]: typeof reply === \"string\" ? reply : JSON.stringify(reply) };\n }\n\n const lastReply = currentInput[inputKey];\n\n return {\n success: true,\n data: { result: lastReply },\n _meta: {\n mode: \"sequential\",\n members_run: members.length,\n completed_steps: completedSteps,\n hook_events: hookChannel.drain(),\n member_run_ids: agg.member_run_ids,\n rounds: agg.rounds,\n tokens_used: agg.tokens_used,\n sub_runs: members.length,\n },\n };\n}\n"],"mappings":";;;;AA8BA,eAAsB,cAAc,MAAoD;CACtF,MAAM,EAAE,SAAS,SAAS,UAAU,OAAO,aAAa,cAAc;CAEtE,IAAI,eAAwC,EAAE,GAAG,OAAO;CACxD,IAAI,iBAAiB;CACrB,MAAM,MAAwB,iBAAiB;AAE/C,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,aAAa,QAAQ;EAC3B,MAAM,OAAO,WAAW,WAAW;AAEnC,MAAI,IAAI,GAAG;GACT,MAAM,WAAW,WAAW,QAAQ,IAAI,GAAI;AAC5C,eAAY,KAAK,cAAc;IAC7B,MAAM;IACN,IAAI;IACJ;IACD,CAAC;;EAGJ,MAAM,eAAe,MAAM,UACzB,YACA,cACA,cAAc,SAAS,YAAY,EAAE,CACtC;AACD,kBAAgB,KAAK,aAAa;AAElC,MAAI,CAAC,aAAa,QAChB,QAAO;GACL,SAAS;GACT,OAAO;IACL,MAAM;IACN,SAAS,WAAW,KAAK,mBAAmB;IAC5C,QAAQ;IACR,OAAO;IACR;GACD,OAAO;IACL,MAAM;IACN,aAAa,IAAI;IACjB,iBAAiB;IACjB,aAAa,YAAY,OAAO;IAChC,gBAAgB,IAAI;IACpB,QAAQ,IAAI;IACZ,aAAa,IAAI;IACjB,UAAU,IAAI;IACf;GACF;AAGH;EACA,MAAM,QAAQ,aAAa,aAAa;AACxC,iBAAe,GAAG,WAAW,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,MAAM,EAAE;;AAK1F,QAAO;EACL,SAAS;EACT,MAAM,EAAE,QAJQ,aAAa,WAIF;EAC3B,OAAO;GACL,MAAM;GACN,aAAa,QAAQ;GACrB,iBAAiB;GACjB,aAAa,YAAY,OAAO;GAChC,gBAAgB,IAAI;GACpB,QAAQ,IAAI;GACZ,aAAa,IAAI;GACjB,UAAU,QAAQ;GACnB;EACF"}
@@ -0,0 +1,39 @@
1
+
2
+ //#region src/agent-runners/team-modes/utils.ts
3
+ function memberName(memberPath) {
4
+ const parts = memberPath.replace(/\/$/, "").split("/");
5
+ return parts[parts.length - 1];
6
+ }
7
+ function sessionComponent(value) {
8
+ return value.replace(/[^A-Za-z0-9_.-]/g, "_").replace(/^\.+|\.+$/g, "") || "member";
9
+ }
10
+ function memberSession(teamSession, memberPath, discriminator) {
11
+ const parts = [teamSession, sessionComponent(memberName(memberPath))];
12
+ if (discriminator !== void 0) parts.push(sessionComponent(String(discriminator)));
13
+ return parts.join(".");
14
+ }
15
+ function extractReply(result) {
16
+ const data = result.data;
17
+ if (data?.result?.reply !== void 0) return data.result.reply;
18
+ if (data?.result !== void 0) return data.result;
19
+ return data;
20
+ }
21
+ async function runWithConcurrencyLimit(tasks, limit) {
22
+ const results = new Array(tasks.length);
23
+ let nextIndex = 0;
24
+ async function runNext() {
25
+ while (nextIndex < tasks.length) {
26
+ const idx = nextIndex++;
27
+ results[idx] = await tasks[idx]();
28
+ }
29
+ }
30
+ const workers = Array.from({ length: Math.min(limit, tasks.length) }, () => runNext());
31
+ await Promise.all(workers);
32
+ return results;
33
+ }
34
+
35
+ //#endregion
36
+ exports.extractReply = extractReply;
37
+ exports.memberName = memberName;
38
+ exports.memberSession = memberSession;
39
+ exports.runWithConcurrencyLimit = runWithConcurrencyLimit;
@@ -0,0 +1,36 @@
1
+ //#region src/agent-runners/team-modes/utils.ts
2
+ function memberName(memberPath) {
3
+ const parts = memberPath.replace(/\/$/, "").split("/");
4
+ return parts[parts.length - 1];
5
+ }
6
+ function sessionComponent(value) {
7
+ return value.replace(/[^A-Za-z0-9_.-]/g, "_").replace(/^\.+|\.+$/g, "") || "member";
8
+ }
9
+ function memberSession(teamSession, memberPath, discriminator) {
10
+ const parts = [teamSession, sessionComponent(memberName(memberPath))];
11
+ if (discriminator !== void 0) parts.push(sessionComponent(String(discriminator)));
12
+ return parts.join(".");
13
+ }
14
+ function extractReply(result) {
15
+ const data = result.data;
16
+ if (data?.result?.reply !== void 0) return data.result.reply;
17
+ if (data?.result !== void 0) return data.result;
18
+ return data;
19
+ }
20
+ async function runWithConcurrencyLimit(tasks, limit) {
21
+ const results = new Array(tasks.length);
22
+ let nextIndex = 0;
23
+ async function runNext() {
24
+ while (nextIndex < tasks.length) {
25
+ const idx = nextIndex++;
26
+ results[idx] = await tasks[idx]();
27
+ }
28
+ }
29
+ const workers = Array.from({ length: Math.min(limit, tasks.length) }, () => runNext());
30
+ await Promise.all(workers);
31
+ return results;
32
+ }
33
+
34
+ //#endregion
35
+ export { extractReply, memberName, memberSession, runWithConcurrencyLimit };
36
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/agent-runners/team-modes/utils.ts"],"sourcesContent":["import type { AFSExecResult } from \"@aigne/afs\";\n\nexport function memberName(memberPath: string): string {\n const parts = memberPath.replace(/\\/$/, \"\").split(\"/\");\n return parts[parts.length - 1]!;\n}\n\nfunction sessionComponent(value: string): string {\n const cleaned = value.replace(/[^A-Za-z0-9_.-]/g, \"_\").replace(/^\\.+|\\.+$/g, \"\");\n return cleaned || \"member\";\n}\n\nexport function memberSession(\n teamSession: string,\n memberPath: string,\n discriminator?: string | number,\n): string {\n const parts = [teamSession, sessionComponent(memberName(memberPath))];\n if (discriminator !== undefined) parts.push(sessionComponent(String(discriminator)));\n return parts.join(\".\");\n}\n\nexport function extractReply(result: AFSExecResult): unknown {\n const data = (result as any).data;\n if (data?.result?.reply !== undefined) return data.result.reply;\n if (data?.result !== undefined) return data.result;\n return data;\n}\n\nexport async function runWithConcurrencyLimit<T>(\n tasks: (() => Promise<T>)[],\n limit: number,\n): Promise<T[]> {\n const results: T[] = new Array(tasks.length);\n let nextIndex = 0;\n\n async function runNext(): Promise<void> {\n while (nextIndex < tasks.length) {\n const idx = nextIndex++;\n results[idx] = await tasks[idx]!();\n }\n }\n\n const workers = Array.from({ length: Math.min(limit, tasks.length) }, () => runNext());\n await Promise.all(workers);\n return results;\n}\n"],"mappings":";AAEA,SAAgB,WAAW,YAA4B;CACrD,MAAM,QAAQ,WAAW,QAAQ,OAAO,GAAG,CAAC,MAAM,IAAI;AACtD,QAAO,MAAM,MAAM,SAAS;;AAG9B,SAAS,iBAAiB,OAAuB;AAE/C,QADgB,MAAM,QAAQ,oBAAoB,IAAI,CAAC,QAAQ,cAAc,GAAG,IAC9D;;AAGpB,SAAgB,cACd,aACA,YACA,eACQ;CACR,MAAM,QAAQ,CAAC,aAAa,iBAAiB,WAAW,WAAW,CAAC,CAAC;AACrE,KAAI,kBAAkB,OAAW,OAAM,KAAK,iBAAiB,OAAO,cAAc,CAAC,CAAC;AACpF,QAAO,MAAM,KAAK,IAAI;;AAGxB,SAAgB,aAAa,QAAgC;CAC3D,MAAM,OAAQ,OAAe;AAC7B,KAAI,MAAM,QAAQ,UAAU,OAAW,QAAO,KAAK,OAAO;AAC1D,KAAI,MAAM,WAAW,OAAW,QAAO,KAAK;AAC5C,QAAO;;AAGT,eAAsB,wBACpB,OACA,OACc;CACd,MAAM,UAAe,IAAI,MAAM,MAAM,OAAO;CAC5C,IAAI,YAAY;CAEhB,eAAe,UAAyB;AACtC,SAAO,YAAY,MAAM,QAAQ;GAC/B,MAAM,MAAM;AACZ,WAAQ,OAAO,MAAM,MAAM,MAAO;;;CAItC,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;AACtF,OAAM,QAAQ,IAAI,QAAQ;AAC1B,QAAO"}