@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,72 @@
1
+ import { joinURL } from "ufo";
2
+
3
+ //#region src/agent-runners/stream-router.ts
4
+ const UI_SESSION_RE = /^\/(?:dev\/)?ui\/[^/]+\/sessions\/([^/]+)/;
5
+ function detectUISessionPath(session) {
6
+ if (!session) return null;
7
+ const trimmed = session.replace(/\/+$/, "");
8
+ const match = UI_SESSION_RE.exec(trimmed);
9
+ if (!match) return null;
10
+ const [full] = match;
11
+ return full;
12
+ }
13
+ function createStreamProgressRouter(opts) {
14
+ const sessionPath = opts.sessionPath ?? null;
15
+ if (!sessionPath || !opts.nodeId) return null;
16
+ const patchPath = joinURL(sessionPath, ".actions", "aup_patch");
17
+ const throttleMs = opts.throttleMs ?? 150;
18
+ const state = {
19
+ streamingText: "",
20
+ thinkingText: "",
21
+ dirty: false
22
+ };
23
+ let timer = null;
24
+ let lastFlush = Promise.resolve();
25
+ const sendPatch = async () => {
26
+ if (!state.dirty) return;
27
+ state.dirty = false;
28
+ const patchState = {};
29
+ if (state.streamingText) patchState.streamingText = state.streamingText;
30
+ if (state.thinkingText) patchState.thinkingText = state.thinkingText;
31
+ const ops = [{
32
+ op: "update",
33
+ id: opts.nodeId,
34
+ state: patchState
35
+ }];
36
+ try {
37
+ await opts.afs.exec(patchPath, { ops }, {});
38
+ } catch {}
39
+ };
40
+ const scheduleFlush = () => {
41
+ if (timer) return;
42
+ timer = setTimeout(() => {
43
+ timer = null;
44
+ lastFlush = sendPatch();
45
+ }, throttleMs);
46
+ };
47
+ return {
48
+ onProgress: (event) => {
49
+ if (event.type === "llm_delta" && typeof event.text === "string") {
50
+ state.streamingText += event.text;
51
+ state.dirty = true;
52
+ scheduleFlush();
53
+ } else if (event.type === "thinking_delta" && typeof event.text === "string") {
54
+ state.thinkingText += event.text;
55
+ state.dirty = true;
56
+ scheduleFlush();
57
+ }
58
+ },
59
+ flush: async () => {
60
+ if (timer) {
61
+ clearTimeout(timer);
62
+ timer = null;
63
+ }
64
+ await lastFlush;
65
+ await sendPatch();
66
+ }
67
+ };
68
+ }
69
+
70
+ //#endregion
71
+ export { createStreamProgressRouter, detectUISessionPath };
72
+ //# sourceMappingURL=stream-router.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-router.mjs","names":[],"sources":["../../src/agent-runners/stream-router.ts"],"sourcesContent":["/**\n * Stream router — bridge `_on_tool_progress` events to AUP patches (Phase 2).\n *\n * When `aiRunner` runs inside a UI session, we want each LLM token to\n * surface in the caller's live view without the caller having to wire\n * its own progress callback. This helper:\n *\n * 1. Detects whether a session path points at a UI session\n * (`/ui/web/sessions/<sid>` or `/dev/ui/web/sessions/<sid>`).\n * 2. Accumulates `llm_delta` / `thinking_delta` deltas and flushes\n * them to `<session>/.actions/aup_patch` at a throttled cadence\n * (default 150ms, matching `agent-core.ts`).\n *\n * The router is intentionally tolerant: exec errors are swallowed so a\n * broken UI transport never kills the agent run. Callers should still\n * `await flush()` once the run finishes so the last chunk reaches the UI.\n */\n\nimport type { AFSRoot } from \"@aigne/afs\";\nimport { joinURL } from \"ufo\";\n\nconst UI_SESSION_RE = /^\\/(?:dev\\/)?ui\\/[^/]+\\/sessions\\/([^/]+)/;\n\nexport function detectUISessionPath(session: string | undefined | null): string | null {\n if (!session) return null;\n const trimmed = session.replace(/\\/+$/, \"\");\n const match = UI_SESSION_RE.exec(trimmed);\n if (!match) return null;\n // Ensure we keep exactly `<prefix>/sessions/<sid>` with no trailing segments.\n const [full] = match;\n return full;\n}\n\nexport interface StreamProgressRouterOptions {\n afs: AFSRoot;\n sessionPath: string | null | undefined;\n nodeId?: string;\n throttleMs?: number;\n}\n\nexport interface StreamProgressRouter {\n onProgress: (event: { type: string; round?: number; text?: string }) => void;\n flush: () => Promise<void>;\n}\n\ninterface RouterState {\n streamingText: string;\n thinkingText: string;\n dirty: boolean;\n}\n\nexport function createStreamProgressRouter(\n opts: StreamProgressRouterOptions,\n): StreamProgressRouter | null {\n const sessionPath = opts.sessionPath ?? null;\n if (!sessionPath || !opts.nodeId) return null;\n\n const patchPath = joinURL(sessionPath, \".actions\", \"aup_patch\");\n const throttleMs = opts.throttleMs ?? 150;\n const state: RouterState = { streamingText: \"\", thinkingText: \"\", dirty: false };\n let timer: ReturnType<typeof setTimeout> | null = null;\n let lastFlush: Promise<void> = Promise.resolve();\n\n const sendPatch = async (): Promise<void> => {\n if (!state.dirty) return;\n state.dirty = false;\n const patchState: Record<string, unknown> = {};\n if (state.streamingText) patchState.streamingText = state.streamingText;\n if (state.thinkingText) patchState.thinkingText = state.thinkingText;\n const ops = [{ op: \"update\", id: opts.nodeId, state: patchState }];\n try {\n await opts.afs.exec!(patchPath, { ops }, {});\n } catch {\n // streaming failures must never kill the run\n }\n };\n\n const scheduleFlush = (): void => {\n if (timer) return;\n timer = setTimeout(() => {\n timer = null;\n lastFlush = sendPatch();\n }, throttleMs);\n };\n\n return {\n onProgress: (event) => {\n if (event.type === \"llm_delta\" && typeof event.text === \"string\") {\n state.streamingText += event.text;\n state.dirty = true;\n scheduleFlush();\n } else if (event.type === \"thinking_delta\" && typeof event.text === \"string\") {\n state.thinkingText += event.text;\n state.dirty = true;\n scheduleFlush();\n }\n },\n flush: async () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n await lastFlush;\n await sendPatch();\n },\n };\n}\n"],"mappings":";;;AAqBA,MAAM,gBAAgB;AAEtB,SAAgB,oBAAoB,SAAmD;AACrF,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,UAAU,QAAQ,QAAQ,QAAQ,GAAG;CAC3C,MAAM,QAAQ,cAAc,KAAK,QAAQ;AACzC,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,CAAC,QAAQ;AACf,QAAO;;AAqBT,SAAgB,2BACd,MAC6B;CAC7B,MAAM,cAAc,KAAK,eAAe;AACxC,KAAI,CAAC,eAAe,CAAC,KAAK,OAAQ,QAAO;CAEzC,MAAM,YAAY,QAAQ,aAAa,YAAY,YAAY;CAC/D,MAAM,aAAa,KAAK,cAAc;CACtC,MAAM,QAAqB;EAAE,eAAe;EAAI,cAAc;EAAI,OAAO;EAAO;CAChF,IAAI,QAA8C;CAClD,IAAI,YAA2B,QAAQ,SAAS;CAEhD,MAAM,YAAY,YAA2B;AAC3C,MAAI,CAAC,MAAM,MAAO;AAClB,QAAM,QAAQ;EACd,MAAM,aAAsC,EAAE;AAC9C,MAAI,MAAM,cAAe,YAAW,gBAAgB,MAAM;AAC1D,MAAI,MAAM,aAAc,YAAW,eAAe,MAAM;EACxD,MAAM,MAAM,CAAC;GAAE,IAAI;GAAU,IAAI,KAAK;GAAQ,OAAO;GAAY,CAAC;AAClE,MAAI;AACF,SAAM,KAAK,IAAI,KAAM,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;UACtC;;CAKV,MAAM,sBAA4B;AAChC,MAAI,MAAO;AACX,UAAQ,iBAAiB;AACvB,WAAQ;AACR,eAAY,WAAW;KACtB,WAAW;;AAGhB,QAAO;EACL,aAAa,UAAU;AACrB,OAAI,MAAM,SAAS,eAAe,OAAO,MAAM,SAAS,UAAU;AAChE,UAAM,iBAAiB,MAAM;AAC7B,UAAM,QAAQ;AACd,mBAAe;cACN,MAAM,SAAS,oBAAoB,OAAO,MAAM,SAAS,UAAU;AAC5E,UAAM,gBAAgB,MAAM;AAC5B,UAAM,QAAQ;AACd,mBAAe;;;EAGnB,OAAO,YAAY;AACjB,OAAI,OAAO;AACT,iBAAa,MAAM;AACnB,YAAQ;;AAEV,SAAM;AACN,SAAM,WAAW;;EAEpB"}
@@ -0,0 +1,35 @@
1
+
2
+ //#region src/agent-runners/system-prompt.ts
3
+ /**
4
+ * System-prompt hardening helpers.
5
+ *
6
+ * `extractBlockletId` derives a stable identity from an agent's mount path —
7
+ * used to tag dispatched exec calls with the caller's blocklet id (see B32).
8
+ *
9
+ * `sanitizeSystemAppend` strips known prompt-delimiter patterns before the
10
+ * runtime concatenates a caller-supplied string onto the system prompt.
11
+ * Without this, a child orchestrator's `_system_append` could inject
12
+ * `</system>` or `<|im_end|>` tokens and break prompt isolation.
13
+ */
14
+ function extractBlockletId(mountPath) {
15
+ const segments = mountPath.split("/").filter(Boolean);
16
+ return segments[segments.length - 1] ?? mountPath;
17
+ }
18
+ const PROMPT_DELIMITER_PATTERNS = [
19
+ /<\/?system>/gi,
20
+ /<\|im_(start|end)\|>/gi,
21
+ /#{2,}\s*(System|User|Assistant):/gi,
22
+ /<\/?prompt>/gi,
23
+ /<\/?instructions>/gi
24
+ ];
25
+ function sanitizeSystemAppend(value) {
26
+ if (typeof value !== "string") return void 0;
27
+ if (value.trim() === "") return void 0;
28
+ let sanitized = value;
29
+ for (const pattern of PROMPT_DELIMITER_PATTERNS) sanitized = sanitized.replace(pattern, "");
30
+ return sanitized.trim() || void 0;
31
+ }
32
+
33
+ //#endregion
34
+ exports.extractBlockletId = extractBlockletId;
35
+ exports.sanitizeSystemAppend = sanitizeSystemAppend;
@@ -0,0 +1,17 @@
1
+ //#region src/agent-runners/system-prompt.d.ts
2
+ /**
3
+ * System-prompt hardening helpers.
4
+ *
5
+ * `extractBlockletId` derives a stable identity from an agent's mount path —
6
+ * used to tag dispatched exec calls with the caller's blocklet id (see B32).
7
+ *
8
+ * `sanitizeSystemAppend` strips known prompt-delimiter patterns before the
9
+ * runtime concatenates a caller-supplied string onto the system prompt.
10
+ * Without this, a child orchestrator's `_system_append` could inject
11
+ * `</system>` or `<|im_end|>` tokens and break prompt isolation.
12
+ */
13
+ declare function extractBlockletId(mountPath: string): string;
14
+ declare function sanitizeSystemAppend(value: unknown): string | undefined;
15
+ //#endregion
16
+ export { extractBlockletId, sanitizeSystemAppend };
17
+ //# sourceMappingURL=system-prompt.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.d.cts","names":[],"sources":["../../src/agent-runners/system-prompt.ts"],"mappings":";;AAYA;;;;;AAaA;;;;;iBAbgB,iBAAA,CAAkB,SAAA;AAAA,iBAalB,oBAAA,CAAqB,KAAA"}
@@ -0,0 +1,17 @@
1
+ //#region src/agent-runners/system-prompt.d.ts
2
+ /**
3
+ * System-prompt hardening helpers.
4
+ *
5
+ * `extractBlockletId` derives a stable identity from an agent's mount path —
6
+ * used to tag dispatched exec calls with the caller's blocklet id (see B32).
7
+ *
8
+ * `sanitizeSystemAppend` strips known prompt-delimiter patterns before the
9
+ * runtime concatenates a caller-supplied string onto the system prompt.
10
+ * Without this, a child orchestrator's `_system_append` could inject
11
+ * `</system>` or `<|im_end|>` tokens and break prompt isolation.
12
+ */
13
+ declare function extractBlockletId(mountPath: string): string;
14
+ declare function sanitizeSystemAppend(value: unknown): string | undefined;
15
+ //#endregion
16
+ export { extractBlockletId, sanitizeSystemAppend };
17
+ //# sourceMappingURL=system-prompt.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.d.mts","names":[],"sources":["../../src/agent-runners/system-prompt.ts"],"mappings":";;AAYA;;;;;AAaA;;;;;iBAbgB,iBAAA,CAAkB,SAAA;AAAA,iBAalB,oBAAA,CAAqB,KAAA"}
@@ -0,0 +1,34 @@
1
+ //#region src/agent-runners/system-prompt.ts
2
+ /**
3
+ * System-prompt hardening helpers.
4
+ *
5
+ * `extractBlockletId` derives a stable identity from an agent's mount path —
6
+ * used to tag dispatched exec calls with the caller's blocklet id (see B32).
7
+ *
8
+ * `sanitizeSystemAppend` strips known prompt-delimiter patterns before the
9
+ * runtime concatenates a caller-supplied string onto the system prompt.
10
+ * Without this, a child orchestrator's `_system_append` could inject
11
+ * `</system>` or `<|im_end|>` tokens and break prompt isolation.
12
+ */
13
+ function extractBlockletId(mountPath) {
14
+ const segments = mountPath.split("/").filter(Boolean);
15
+ return segments[segments.length - 1] ?? mountPath;
16
+ }
17
+ const PROMPT_DELIMITER_PATTERNS = [
18
+ /<\/?system>/gi,
19
+ /<\|im_(start|end)\|>/gi,
20
+ /#{2,}\s*(System|User|Assistant):/gi,
21
+ /<\/?prompt>/gi,
22
+ /<\/?instructions>/gi
23
+ ];
24
+ function sanitizeSystemAppend(value) {
25
+ if (typeof value !== "string") return void 0;
26
+ if (value.trim() === "") return void 0;
27
+ let sanitized = value;
28
+ for (const pattern of PROMPT_DELIMITER_PATTERNS) sanitized = sanitized.replace(pattern, "");
29
+ return sanitized.trim() || void 0;
30
+ }
31
+
32
+ //#endregion
33
+ export { extractBlockletId, sanitizeSystemAppend };
34
+ //# sourceMappingURL=system-prompt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.mjs","names":[],"sources":["../../src/agent-runners/system-prompt.ts"],"sourcesContent":["/**\n * System-prompt hardening helpers.\n *\n * `extractBlockletId` derives a stable identity from an agent's mount path —\n * used to tag dispatched exec calls with the caller's blocklet id (see B32).\n *\n * `sanitizeSystemAppend` strips known prompt-delimiter patterns before the\n * runtime concatenates a caller-supplied string onto the system prompt.\n * Without this, a child orchestrator's `_system_append` could inject\n * `</system>` or `<|im_end|>` tokens and break prompt isolation.\n */\n\nexport function extractBlockletId(mountPath: string): string {\n const segments = mountPath.split(\"/\").filter(Boolean);\n return segments[segments.length - 1] ?? mountPath;\n}\n\nconst PROMPT_DELIMITER_PATTERNS = [\n /<\\/?system>/gi,\n /<\\|im_(start|end)\\|>/gi,\n /#{2,}\\s*(System|User|Assistant):/gi,\n /<\\/?prompt>/gi,\n /<\\/?instructions>/gi,\n];\n\nexport function sanitizeSystemAppend(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n if (value.trim() === \"\") return undefined;\n\n let sanitized = value;\n for (const pattern of PROMPT_DELIMITER_PATTERNS) {\n sanitized = sanitized.replace(pattern, \"\");\n }\n return sanitized.trim() || undefined;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgB,kBAAkB,WAA2B;CAC3D,MAAM,WAAW,UAAU,MAAM,IAAI,CAAC,OAAO,QAAQ;AACrD,QAAO,SAAS,SAAS,SAAS,MAAM;;AAG1C,MAAM,4BAA4B;CAChC;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,qBAAqB,OAAoC;AACvE,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,MAAM,MAAM,KAAK,GAAI,QAAO;CAEhC,IAAI,YAAY;AAChB,MAAK,MAAM,WAAW,0BACpB,aAAY,UAAU,QAAQ,SAAS,GAAG;AAE5C,QAAO,UAAU,MAAM,IAAI"}
@@ -0,0 +1,36 @@
1
+
2
+ //#region src/agent-runners/team-modes/aggregates.ts
3
+ function readNumber(v) {
4
+ if (typeof v === "number" && Number.isFinite(v)) return Math.max(0, v);
5
+ if (typeof v === "string") {
6
+ const n = Number(v);
7
+ return Number.isFinite(n) ? Math.max(0, n) : 0;
8
+ }
9
+ return 0;
10
+ }
11
+ function emptyAggregates() {
12
+ return {
13
+ member_run_ids: [],
14
+ rounds: 0,
15
+ tokens_used: 0
16
+ };
17
+ }
18
+ function extractMemberMeta(result) {
19
+ const meta = result?.data?._meta ?? {};
20
+ const runIdRaw = meta.run_id;
21
+ return {
22
+ runId: typeof runIdRaw === "string" && runIdRaw.length > 0 ? runIdRaw : void 0,
23
+ rounds: readNumber(meta.rounds),
24
+ tokensUsed: readNumber(meta.tokens_used ?? result?.data?.total_tokens)
25
+ };
26
+ }
27
+ function mergeMemberMeta(agg, result) {
28
+ const { runId, rounds, tokensUsed } = extractMemberMeta(result);
29
+ if (runId) agg.member_run_ids.push(runId);
30
+ agg.rounds += rounds;
31
+ agg.tokens_used += tokensUsed;
32
+ }
33
+
34
+ //#endregion
35
+ exports.emptyAggregates = emptyAggregates;
36
+ exports.mergeMemberMeta = mergeMemberMeta;
@@ -0,0 +1,35 @@
1
+ //#region src/agent-runners/team-modes/aggregates.ts
2
+ function readNumber(v) {
3
+ if (typeof v === "number" && Number.isFinite(v)) return Math.max(0, v);
4
+ if (typeof v === "string") {
5
+ const n = Number(v);
6
+ return Number.isFinite(n) ? Math.max(0, n) : 0;
7
+ }
8
+ return 0;
9
+ }
10
+ function emptyAggregates() {
11
+ return {
12
+ member_run_ids: [],
13
+ rounds: 0,
14
+ tokens_used: 0
15
+ };
16
+ }
17
+ function extractMemberMeta(result) {
18
+ const meta = result?.data?._meta ?? {};
19
+ const runIdRaw = meta.run_id;
20
+ return {
21
+ runId: typeof runIdRaw === "string" && runIdRaw.length > 0 ? runIdRaw : void 0,
22
+ rounds: readNumber(meta.rounds),
23
+ tokensUsed: readNumber(meta.tokens_used ?? result?.data?.total_tokens)
24
+ };
25
+ }
26
+ function mergeMemberMeta(agg, result) {
27
+ const { runId, rounds, tokensUsed } = extractMemberMeta(result);
28
+ if (runId) agg.member_run_ids.push(runId);
29
+ agg.rounds += rounds;
30
+ agg.tokens_used += tokensUsed;
31
+ }
32
+
33
+ //#endregion
34
+ export { emptyAggregates, mergeMemberMeta };
35
+ //# sourceMappingURL=aggregates.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregates.mjs","names":[],"sources":["../../../src/agent-runners/team-modes/aggregates.ts"],"sourcesContent":["/**\n * B17 — Harvest per-member `_meta` for team-level aggregation.\n *\n * Each member's `_meta` carries `run_id`, `rounds`, `tokens_used`, and\n * (optionally) `sub_runs`. The team runner surfaces:\n * - `member_run_ids`: ordered array of child run ids for tracing\n * - `rounds` / `tokens_used`: summed across all members\n * - `sub_runs`: count of direct members, not summed from grandchildren\n */\n\nimport type { AFSExecResult } from \"@aigne/afs\";\n\nexport interface MemberAggregates {\n member_run_ids: string[];\n rounds: number;\n tokens_used: number;\n}\n\nfunction readNumber(v: unknown): number {\n if (typeof v === \"number\" && Number.isFinite(v)) return Math.max(0, v);\n if (typeof v === \"string\") {\n const n = Number(v);\n return Number.isFinite(n) ? Math.max(0, n) : 0;\n }\n return 0;\n}\n\nexport function emptyAggregates(): MemberAggregates {\n return { member_run_ids: [], rounds: 0, tokens_used: 0 };\n}\n\nexport function extractMemberMeta(result: AFSExecResult | undefined): {\n runId: string | undefined;\n rounds: number;\n tokensUsed: number;\n} {\n const meta = (result as any)?.data?._meta ?? {};\n const runIdRaw = meta.run_id;\n const runId = typeof runIdRaw === \"string\" && runIdRaw.length > 0 ? runIdRaw : undefined;\n return {\n runId,\n rounds: readNumber(meta.rounds),\n tokensUsed: readNumber(meta.tokens_used ?? (result as any)?.data?.total_tokens),\n };\n}\n\nexport function mergeMemberMeta(agg: MemberAggregates, result: AFSExecResult | undefined): void {\n const { runId, rounds, tokensUsed } = extractMemberMeta(result);\n if (runId) agg.member_run_ids.push(runId);\n agg.rounds += rounds;\n agg.tokens_used += tokensUsed;\n}\n"],"mappings":";AAkBA,SAAS,WAAW,GAAoB;AACtC,KAAI,OAAO,MAAM,YAAY,OAAO,SAAS,EAAE,CAAE,QAAO,KAAK,IAAI,GAAG,EAAE;AACtE,KAAI,OAAO,MAAM,UAAU;EACzB,MAAM,IAAI,OAAO,EAAE;AACnB,SAAO,OAAO,SAAS,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG;;AAE/C,QAAO;;AAGT,SAAgB,kBAAoC;AAClD,QAAO;EAAE,gBAAgB,EAAE;EAAE,QAAQ;EAAG,aAAa;EAAG;;AAG1D,SAAgB,kBAAkB,QAIhC;CACA,MAAM,OAAQ,QAAgB,MAAM,SAAS,EAAE;CAC/C,MAAM,WAAW,KAAK;AAEtB,QAAO;EACL,OAFY,OAAO,aAAa,YAAY,SAAS,SAAS,IAAI,WAAW;EAG7E,QAAQ,WAAW,KAAK,OAAO;EAC/B,YAAY,WAAW,KAAK,eAAgB,QAAgB,MAAM,aAAa;EAChF;;AAGH,SAAgB,gBAAgB,KAAuB,QAAyC;CAC9F,MAAM,EAAE,OAAO,QAAQ,eAAe,kBAAkB,OAAO;AAC/D,KAAI,MAAO,KAAI,eAAe,KAAK,MAAM;AACzC,KAAI,UAAU;AACd,KAAI,eAAe"}
@@ -0,0 +1,46 @@
1
+ const require_utils = require('./utils.cjs');
2
+
3
+ //#region src/agent-runners/team-modes/iterate.ts
4
+ const DEFAULT_CONCURRENCY = 10;
5
+ const MAX_CONCURRENCY = 100;
6
+ async function runIterate(opts) {
7
+ const { members, session, inputKey, items, runMember } = opts;
8
+ const concurrency = Math.min(opts.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);
9
+ const firstMember = members[0];
10
+ return {
11
+ success: true,
12
+ data: { result: (await require_utils.runWithConcurrencyLimit(items.map((item, index) => {
13
+ return async () => {
14
+ const input = { [inputKey]: typeof item === "string" ? item : JSON.stringify(item) };
15
+ try {
16
+ const result = await runMember(firstMember, input, require_utils.memberSession(session, firstMember, index));
17
+ if (!result.success) return {
18
+ index,
19
+ value: { error: result.error ?? "unknown" }
20
+ };
21
+ return {
22
+ index,
23
+ value: require_utils.extractReply(result)
24
+ };
25
+ } catch (err) {
26
+ return {
27
+ index,
28
+ value: { error: {
29
+ code: "RUNNER_ERROR",
30
+ message: err instanceof Error ? err.message : String(err)
31
+ } }
32
+ };
33
+ }
34
+ };
35
+ }), concurrency)).map((r) => r.value) },
36
+ _meta: {
37
+ mode: "iterate_on",
38
+ items_count: items.length,
39
+ max_concurrency: concurrency,
40
+ hook_events: []
41
+ }
42
+ };
43
+ }
44
+
45
+ //#endregion
46
+ exports.runIterate = runIterate;
@@ -0,0 +1,47 @@
1
+ import { extractReply, memberSession, runWithConcurrencyLimit } from "./utils.mjs";
2
+
3
+ //#region src/agent-runners/team-modes/iterate.ts
4
+ const DEFAULT_CONCURRENCY = 10;
5
+ const MAX_CONCURRENCY = 100;
6
+ async function runIterate(opts) {
7
+ const { members, session, inputKey, items, runMember } = opts;
8
+ const concurrency = Math.min(opts.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);
9
+ const firstMember = members[0];
10
+ return {
11
+ success: true,
12
+ data: { result: (await runWithConcurrencyLimit(items.map((item, index) => {
13
+ return async () => {
14
+ const input = { [inputKey]: typeof item === "string" ? item : JSON.stringify(item) };
15
+ try {
16
+ const result = await runMember(firstMember, input, memberSession(session, firstMember, index));
17
+ if (!result.success) return {
18
+ index,
19
+ value: { error: result.error ?? "unknown" }
20
+ };
21
+ return {
22
+ index,
23
+ value: extractReply(result)
24
+ };
25
+ } catch (err) {
26
+ return {
27
+ index,
28
+ value: { error: {
29
+ code: "RUNNER_ERROR",
30
+ message: err instanceof Error ? err.message : String(err)
31
+ } }
32
+ };
33
+ }
34
+ };
35
+ }), concurrency)).map((r) => r.value) },
36
+ _meta: {
37
+ mode: "iterate_on",
38
+ items_count: items.length,
39
+ max_concurrency: concurrency,
40
+ hook_events: []
41
+ }
42
+ };
43
+ }
44
+
45
+ //#endregion
46
+ export { runIterate };
47
+ //# sourceMappingURL=iterate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate.mjs","names":[],"sources":["../../../src/agent-runners/team-modes/iterate.ts"],"sourcesContent":["import type { MemberRunFn } from \"./types.js\";\nimport { extractReply, memberSession, runWithConcurrencyLimit } from \"./utils.js\";\n\nconst DEFAULT_CONCURRENCY = 10;\nconst MAX_CONCURRENCY = 100;\n\nexport interface IterateOptions {\n members: string[];\n session: string;\n inputKey: string;\n items: unknown[];\n concurrency?: number;\n runMember: MemberRunFn;\n}\n\nexport interface IterateResult {\n success: boolean;\n data?: Record<string, unknown>;\n error?: { code: string; message: string; member?: string; index?: number };\n _meta: {\n mode: \"iterate_on\";\n items_count: number;\n max_concurrency: number;\n hook_events: any[];\n };\n}\n\nexport async function runIterate(opts: IterateOptions): Promise<IterateResult> {\n const { members, session, inputKey, items, runMember } = opts;\n const concurrency = Math.min(opts.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);\n const firstMember = members[0]!;\n\n const tasks = items.map((item, index) => {\n return async () => {\n const input = {\n [inputKey]: typeof item === \"string\" ? item : JSON.stringify(item),\n };\n try {\n const result = await runMember(\n firstMember,\n input,\n memberSession(session, firstMember, index),\n );\n if (!result.success) {\n return { index, value: { error: (result as any).error ?? \"unknown\" } };\n }\n return { index, value: extractReply(result) };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return { index, value: { error: { code: \"RUNNER_ERROR\", message } } };\n }\n };\n });\n\n const results = await runWithConcurrencyLimit(tasks, concurrency);\n const output = results.map((r) => r.value);\n\n return {\n success: true,\n data: { result: output },\n _meta: {\n mode: \"iterate_on\",\n items_count: items.length,\n max_concurrency: concurrency,\n hook_events: [],\n },\n };\n}\n"],"mappings":";;;AAGA,MAAM,sBAAsB;AAC5B,MAAM,kBAAkB;AAuBxB,eAAsB,WAAW,MAA8C;CAC7E,MAAM,EAAE,SAAS,SAAS,UAAU,OAAO,cAAc;CACzD,MAAM,cAAc,KAAK,IAAI,KAAK,eAAe,qBAAqB,gBAAgB;CACtF,MAAM,cAAc,QAAQ;AA2B5B,QAAO;EACL,SAAS;EACT,MAAM,EAAE,SALM,MAAM,wBAtBR,MAAM,KAAK,MAAM,UAAU;AACvC,UAAO,YAAY;IACjB,MAAM,QAAQ,GACX,WAAW,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,KAAK,EACnE;AACD,QAAI;KACF,MAAM,SAAS,MAAM,UACnB,aACA,OACA,cAAc,SAAS,aAAa,MAAM,CAC3C;AACD,SAAI,CAAC,OAAO,QACV,QAAO;MAAE;MAAO,OAAO,EAAE,OAAQ,OAAe,SAAS,WAAW;MAAE;AAExE,YAAO;MAAE;MAAO,OAAO,aAAa,OAAO;MAAE;aACtC,KAAc;AAErB,YAAO;MAAE;MAAO,OAAO,EAAE,OAAO;OAAE,MAAM;OAAgB,SADxC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;OACC,EAAE;MAAE;;;IAGzE,EAEmD,YAAY,EAC1C,KAAK,MAAM,EAAE,MAAM,EAIhB;EACxB,OAAO;GACL,MAAM;GACN,aAAa,MAAM;GACnB,iBAAiB;GACjB,aAAa,EAAE;GAChB;EACF"}
@@ -0,0 +1,59 @@
1
+ const require_utils = require('./utils.cjs');
2
+ const require_aggregates = require('./aggregates.cjs');
3
+
4
+ //#region src/agent-runners/team-modes/parallel.ts
5
+ const DEFAULT_CONCURRENCY = 10;
6
+ const MAX_CONCURRENCY = 100;
7
+ async function runParallel(opts) {
8
+ const { members, session, input, runMember } = opts;
9
+ const concurrency = Math.min(opts.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);
10
+ const results = await require_utils.runWithConcurrencyLimit(members.map((memberPath, index) => {
11
+ return async () => {
12
+ const name = require_utils.memberName(memberPath);
13
+ try {
14
+ const result = await runMember(memberPath, { ...input }, require_utils.memberSession(session, memberPath, index));
15
+ if (!result.success) return {
16
+ name,
17
+ value: { error: result.error ?? "unknown error" },
18
+ result
19
+ };
20
+ return {
21
+ name,
22
+ value: require_utils.extractReply(result),
23
+ result
24
+ };
25
+ } catch (err) {
26
+ return {
27
+ name,
28
+ value: { error: {
29
+ code: "RUNNER_ERROR",
30
+ message: err instanceof Error ? err.message : String(err)
31
+ } },
32
+ result: void 0
33
+ };
34
+ }
35
+ };
36
+ }), concurrency);
37
+ const aggregated = {};
38
+ const agg = require_aggregates.emptyAggregates();
39
+ for (const r of results) {
40
+ aggregated[r.name] = r.value;
41
+ require_aggregates.mergeMemberMeta(agg, r.result);
42
+ }
43
+ return {
44
+ success: true,
45
+ data: { result: aggregated },
46
+ _meta: {
47
+ mode: "parallel",
48
+ sub_runs: members.length,
49
+ max_concurrency: concurrency,
50
+ hook_events: [],
51
+ member_run_ids: agg.member_run_ids,
52
+ rounds: agg.rounds,
53
+ tokens_used: agg.tokens_used
54
+ }
55
+ };
56
+ }
57
+
58
+ //#endregion
59
+ exports.runParallel = runParallel;
@@ -0,0 +1,60 @@
1
+ import { extractReply, memberName, memberSession, runWithConcurrencyLimit } from "./utils.mjs";
2
+ import { emptyAggregates, mergeMemberMeta } from "./aggregates.mjs";
3
+
4
+ //#region src/agent-runners/team-modes/parallel.ts
5
+ const DEFAULT_CONCURRENCY = 10;
6
+ const MAX_CONCURRENCY = 100;
7
+ async function runParallel(opts) {
8
+ const { members, session, input, runMember } = opts;
9
+ const concurrency = Math.min(opts.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);
10
+ const results = await runWithConcurrencyLimit(members.map((memberPath, index) => {
11
+ return async () => {
12
+ const name = memberName(memberPath);
13
+ try {
14
+ const result = await runMember(memberPath, { ...input }, memberSession(session, memberPath, index));
15
+ if (!result.success) return {
16
+ name,
17
+ value: { error: result.error ?? "unknown error" },
18
+ result
19
+ };
20
+ return {
21
+ name,
22
+ value: extractReply(result),
23
+ result
24
+ };
25
+ } catch (err) {
26
+ return {
27
+ name,
28
+ value: { error: {
29
+ code: "RUNNER_ERROR",
30
+ message: err instanceof Error ? err.message : String(err)
31
+ } },
32
+ result: void 0
33
+ };
34
+ }
35
+ };
36
+ }), concurrency);
37
+ const aggregated = {};
38
+ const agg = emptyAggregates();
39
+ for (const r of results) {
40
+ aggregated[r.name] = r.value;
41
+ mergeMemberMeta(agg, r.result);
42
+ }
43
+ return {
44
+ success: true,
45
+ data: { result: aggregated },
46
+ _meta: {
47
+ mode: "parallel",
48
+ sub_runs: members.length,
49
+ max_concurrency: concurrency,
50
+ hook_events: [],
51
+ member_run_ids: agg.member_run_ids,
52
+ rounds: agg.rounds,
53
+ tokens_used: agg.tokens_used
54
+ }
55
+ };
56
+ }
57
+
58
+ //#endregion
59
+ export { runParallel };
60
+ //# sourceMappingURL=parallel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.mjs","names":[],"sources":["../../../src/agent-runners/team-modes/parallel.ts"],"sourcesContent":["import { emptyAggregates, type MemberAggregates, mergeMemberMeta } from \"./aggregates.js\";\nimport type { MemberRunFn } from \"./types.js\";\nimport { extractReply, memberName, memberSession, runWithConcurrencyLimit } from \"./utils.js\";\n\nconst DEFAULT_CONCURRENCY = 10;\nconst MAX_CONCURRENCY = 100;\n\nexport interface ParallelOptions {\n members: string[];\n session: string;\n input: Record<string, unknown>;\n concurrency?: number;\n runMember: MemberRunFn;\n}\n\nexport interface ParallelResult {\n success: boolean;\n data?: Record<string, unknown>;\n _meta: {\n mode: \"parallel\";\n sub_runs: number;\n max_concurrency: number;\n hook_events: any[];\n member_run_ids: string[];\n rounds: number;\n tokens_used: number;\n };\n}\n\nexport async function runParallel(opts: ParallelOptions): Promise<ParallelResult> {\n const { members, session, input, runMember } = opts;\n const concurrency = Math.min(opts.concurrency ?? DEFAULT_CONCURRENCY, MAX_CONCURRENCY);\n\n const tasks = members.map((memberPath, index) => {\n return async () => {\n const name = memberName(memberPath);\n try {\n const result = await runMember(\n memberPath,\n { ...input },\n memberSession(session, memberPath, index),\n );\n if (!result.success) {\n return {\n name,\n value: { error: (result as any).error ?? \"unknown error\" },\n result,\n };\n }\n return { name, value: extractReply(result), result };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n name,\n value: { error: { code: \"RUNNER_ERROR\", message } },\n result: undefined,\n };\n }\n };\n });\n\n const results = await runWithConcurrencyLimit(tasks, concurrency);\n\n const aggregated: Record<string, unknown> = {};\n const agg: MemberAggregates = emptyAggregates();\n for (const r of results) {\n aggregated[r.name] = r.value;\n mergeMemberMeta(agg, r.result);\n }\n\n return {\n success: true,\n data: { result: aggregated },\n _meta: {\n mode: \"parallel\",\n sub_runs: members.length,\n max_concurrency: concurrency,\n hook_events: [],\n member_run_ids: agg.member_run_ids,\n rounds: agg.rounds,\n tokens_used: agg.tokens_used,\n },\n };\n}\n"],"mappings":";;;;AAIA,MAAM,sBAAsB;AAC5B,MAAM,kBAAkB;AAwBxB,eAAsB,YAAY,MAAgD;CAChF,MAAM,EAAE,SAAS,SAAS,OAAO,cAAc;CAC/C,MAAM,cAAc,KAAK,IAAI,KAAK,eAAe,qBAAqB,gBAAgB;CA8BtF,MAAM,UAAU,MAAM,wBA5BR,QAAQ,KAAK,YAAY,UAAU;AAC/C,SAAO,YAAY;GACjB,MAAM,OAAO,WAAW,WAAW;AACnC,OAAI;IACF,MAAM,SAAS,MAAM,UACnB,YACA,EAAE,GAAG,OAAO,EACZ,cAAc,SAAS,YAAY,MAAM,CAC1C;AACD,QAAI,CAAC,OAAO,QACV,QAAO;KACL;KACA,OAAO,EAAE,OAAQ,OAAe,SAAS,iBAAiB;KAC1D;KACD;AAEH,WAAO;KAAE;KAAM,OAAO,aAAa,OAAO;KAAE;KAAQ;YAC7C,KAAc;AAErB,WAAO;KACL;KACA,OAAO,EAAE,OAAO;MAAE,MAAM;MAAgB,SAH1B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;MAGb,EAAE;KACnD,QAAQ;KACT;;;GAGL,EAEmD,YAAY;CAEjE,MAAM,aAAsC,EAAE;CAC9C,MAAM,MAAwB,iBAAiB;AAC/C,MAAK,MAAM,KAAK,SAAS;AACvB,aAAW,EAAE,QAAQ,EAAE;AACvB,kBAAgB,KAAK,EAAE,OAAO;;AAGhC,QAAO;EACL,SAAS;EACT,MAAM,EAAE,QAAQ,YAAY;EAC5B,OAAO;GACL,MAAM;GACN,UAAU,QAAQ;GAClB,iBAAiB;GACjB,aAAa,EAAE;GACf,gBAAgB,IAAI;GACpB,QAAQ,IAAI;GACZ,aAAa,IAAI;GAClB;EACF"}