@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.
- package/LICENSE.md +26 -0
- package/README.md +79 -0
- package/dist/agent-runners/ai-runner.cjs +133 -0
- package/dist/agent-runners/ai-runner.d.cts +33 -0
- package/dist/agent-runners/ai-runner.d.cts.map +1 -0
- package/dist/agent-runners/ai-runner.d.mts +33 -0
- package/dist/agent-runners/ai-runner.d.mts.map +1 -0
- package/dist/agent-runners/ai-runner.mjs +134 -0
- package/dist/agent-runners/ai-runner.mjs.map +1 -0
- package/dist/agent-runners/ash-runner.cjs +272 -0
- package/dist/agent-runners/ash-runner.d.cts +30 -0
- package/dist/agent-runners/ash-runner.d.cts.map +1 -0
- package/dist/agent-runners/ash-runner.d.mts +30 -0
- package/dist/agent-runners/ash-runner.d.mts.map +1 -0
- package/dist/agent-runners/ash-runner.mjs +273 -0
- package/dist/agent-runners/ash-runner.mjs.map +1 -0
- package/dist/agent-runners/budget.cjs +71 -0
- package/dist/agent-runners/budget.d.cts +40 -0
- package/dist/agent-runners/budget.d.cts.map +1 -0
- package/dist/agent-runners/budget.d.mts +40 -0
- package/dist/agent-runners/budget.d.mts.map +1 -0
- package/dist/agent-runners/budget.mjs +67 -0
- package/dist/agent-runners/budget.mjs.map +1 -0
- package/dist/agent-runners/code-runner.cjs +61 -0
- package/dist/agent-runners/code-runner.mjs +61 -0
- package/dist/agent-runners/code-runner.mjs.map +1 -0
- package/dist/agent-runners/env-whitelist.cjs +36 -0
- package/dist/agent-runners/env-whitelist.d.cts +5 -0
- package/dist/agent-runners/env-whitelist.d.cts.map +1 -0
- package/dist/agent-runners/env-whitelist.d.mts +5 -0
- package/dist/agent-runners/env-whitelist.d.mts.map +1 -0
- package/dist/agent-runners/env-whitelist.mjs +36 -0
- package/dist/agent-runners/env-whitelist.mjs.map +1 -0
- package/dist/agent-runners/guide-rails.cjs +47 -0
- package/dist/agent-runners/guide-rails.d.cts +16 -0
- package/dist/agent-runners/guide-rails.d.cts.map +1 -0
- package/dist/agent-runners/guide-rails.d.mts +16 -0
- package/dist/agent-runners/guide-rails.d.mts.map +1 -0
- package/dist/agent-runners/guide-rails.mjs +48 -0
- package/dist/agent-runners/guide-rails.mjs.map +1 -0
- package/dist/agent-runners/hook-channel.cjs +55 -0
- package/dist/agent-runners/hook-channel.d.cts +38 -0
- package/dist/agent-runners/hook-channel.d.cts.map +1 -0
- package/dist/agent-runners/hook-channel.d.mts +38 -0
- package/dist/agent-runners/hook-channel.d.mts.map +1 -0
- package/dist/agent-runners/hook-channel.mjs +55 -0
- package/dist/agent-runners/hook-channel.mjs.map +1 -0
- package/dist/agent-runners/hooks.cjs +107 -0
- package/dist/agent-runners/hooks.d.cts +41 -0
- package/dist/agent-runners/hooks.d.cts.map +1 -0
- package/dist/agent-runners/hooks.d.mts +41 -0
- package/dist/agent-runners/hooks.d.mts.map +1 -0
- package/dist/agent-runners/hooks.mjs +107 -0
- package/dist/agent-runners/hooks.mjs.map +1 -0
- package/dist/agent-runners/memory-afs.cjs +342 -0
- package/dist/agent-runners/memory-afs.d.cts +221 -0
- package/dist/agent-runners/memory-afs.d.cts.map +1 -0
- package/dist/agent-runners/memory-afs.d.mts +221 -0
- package/dist/agent-runners/memory-afs.d.mts.map +1 -0
- package/dist/agent-runners/memory-afs.mjs +326 -0
- package/dist/agent-runners/memory-afs.mjs.map +1 -0
- package/dist/agent-runners/memory-archive.cjs +263 -0
- package/dist/agent-runners/memory-archive.d.cts +47 -0
- package/dist/agent-runners/memory-archive.d.cts.map +1 -0
- package/dist/agent-runners/memory-archive.d.mts +47 -0
- package/dist/agent-runners/memory-archive.d.mts.map +1 -0
- package/dist/agent-runners/memory-archive.mjs +257 -0
- package/dist/agent-runners/memory-archive.mjs.map +1 -0
- package/dist/agent-runners/orchestrator-runner.cjs +302 -0
- package/dist/agent-runners/orchestrator-runner.d.cts +23 -0
- package/dist/agent-runners/orchestrator-runner.d.cts.map +1 -0
- package/dist/agent-runners/orchestrator-runner.d.mts +23 -0
- package/dist/agent-runners/orchestrator-runner.d.mts.map +1 -0
- package/dist/agent-runners/orchestrator-runner.mjs +303 -0
- package/dist/agent-runners/orchestrator-runner.mjs.map +1 -0
- package/dist/agent-runners/orchestrator-state.cjs +68 -0
- package/dist/agent-runners/orchestrator-state.d.cts +23 -0
- package/dist/agent-runners/orchestrator-state.d.cts.map +1 -0
- package/dist/agent-runners/orchestrator-state.d.mts +23 -0
- package/dist/agent-runners/orchestrator-state.d.mts.map +1 -0
- package/dist/agent-runners/orchestrator-state.mjs +65 -0
- package/dist/agent-runners/orchestrator-state.mjs.map +1 -0
- package/dist/agent-runners/retry.cjs +30 -0
- package/dist/agent-runners/retry.d.cts +13 -0
- package/dist/agent-runners/retry.d.cts.map +1 -0
- package/dist/agent-runners/retry.d.mts +13 -0
- package/dist/agent-runners/retry.d.mts.map +1 -0
- package/dist/agent-runners/retry.mjs +30 -0
- package/dist/agent-runners/retry.mjs.map +1 -0
- package/dist/agent-runners/scratchpad-afs.cjs +276 -0
- package/dist/agent-runners/scratchpad-afs.d.cts +103 -0
- package/dist/agent-runners/scratchpad-afs.d.cts.map +1 -0
- package/dist/agent-runners/scratchpad-afs.d.mts +103 -0
- package/dist/agent-runners/scratchpad-afs.d.mts.map +1 -0
- package/dist/agent-runners/scratchpad-afs.mjs +271 -0
- package/dist/agent-runners/scratchpad-afs.mjs.map +1 -0
- package/dist/agent-runners/stream-router.cjs +72 -0
- package/dist/agent-runners/stream-router.d.cts +22 -0
- package/dist/agent-runners/stream-router.d.cts.map +1 -0
- package/dist/agent-runners/stream-router.d.mts +22 -0
- package/dist/agent-runners/stream-router.d.mts.map +1 -0
- package/dist/agent-runners/stream-router.mjs +72 -0
- package/dist/agent-runners/stream-router.mjs.map +1 -0
- package/dist/agent-runners/system-prompt.cjs +35 -0
- package/dist/agent-runners/system-prompt.d.cts +17 -0
- package/dist/agent-runners/system-prompt.d.cts.map +1 -0
- package/dist/agent-runners/system-prompt.d.mts +17 -0
- package/dist/agent-runners/system-prompt.d.mts.map +1 -0
- package/dist/agent-runners/system-prompt.mjs +34 -0
- package/dist/agent-runners/system-prompt.mjs.map +1 -0
- package/dist/agent-runners/team-modes/aggregates.cjs +36 -0
- package/dist/agent-runners/team-modes/aggregates.mjs +35 -0
- package/dist/agent-runners/team-modes/aggregates.mjs.map +1 -0
- package/dist/agent-runners/team-modes/iterate.cjs +46 -0
- package/dist/agent-runners/team-modes/iterate.mjs +47 -0
- package/dist/agent-runners/team-modes/iterate.mjs.map +1 -0
- package/dist/agent-runners/team-modes/parallel.cjs +59 -0
- package/dist/agent-runners/team-modes/parallel.mjs +60 -0
- package/dist/agent-runners/team-modes/parallel.mjs.map +1 -0
- package/dist/agent-runners/team-modes/reflection.cjs +155 -0
- package/dist/agent-runners/team-modes/reflection.mjs +156 -0
- package/dist/agent-runners/team-modes/reflection.mjs.map +1 -0
- package/dist/agent-runners/team-modes/sequential.cjs +63 -0
- package/dist/agent-runners/team-modes/sequential.mjs +64 -0
- package/dist/agent-runners/team-modes/sequential.mjs.map +1 -0
- package/dist/agent-runners/team-modes/utils.cjs +39 -0
- package/dist/agent-runners/team-modes/utils.mjs +36 -0
- package/dist/agent-runners/team-modes/utils.mjs.map +1 -0
- package/dist/agent-runners/team-runner.cjs +277 -0
- package/dist/agent-runners/team-runner.d.cts +34 -0
- package/dist/agent-runners/team-runner.d.cts.map +1 -0
- package/dist/agent-runners/team-runner.d.mts +34 -0
- package/dist/agent-runners/team-runner.d.mts.map +1 -0
- package/dist/agent-runners/team-runner.mjs +278 -0
- package/dist/agent-runners/team-runner.mjs.map +1 -0
- package/dist/agent-runners/template-context.cjs +32 -0
- package/dist/agent-runners/template-context.d.cts +43 -0
- package/dist/agent-runners/template-context.d.cts.map +1 -0
- package/dist/agent-runners/template-context.d.mts +43 -0
- package/dist/agent-runners/template-context.d.mts.map +1 -0
- package/dist/agent-runners/template-context.mjs +33 -0
- package/dist/agent-runners/template-context.mjs.map +1 -0
- package/dist/index.cjs +123 -0
- package/dist/index.d.cts +29 -0
- package/dist/index.d.mts +29 -0
- package/dist/index.mjs +29 -0
- package/dist/program/agent-action.cjs +496 -0
- package/dist/program/agent-action.d.cts +42 -0
- package/dist/program/agent-action.d.cts.map +1 -0
- package/dist/program/agent-action.d.mts +42 -0
- package/dist/program/agent-action.d.mts.map +1 -0
- package/dist/program/agent-action.mjs +497 -0
- package/dist/program/agent-action.mjs.map +1 -0
- package/dist/program/agent-messages-tools.cjs +137 -0
- package/dist/program/agent-messages-tools.d.cts +59 -0
- package/dist/program/agent-messages-tools.d.cts.map +1 -0
- package/dist/program/agent-messages-tools.d.mts +59 -0
- package/dist/program/agent-messages-tools.d.mts.map +1 -0
- package/dist/program/agent-messages-tools.mjs +130 -0
- package/dist/program/agent-messages-tools.mjs.map +1 -0
- package/dist/program/agent-runner-registry.cjs +314 -0
- package/dist/program/agent-runner-registry.d.cts +52 -0
- package/dist/program/agent-runner-registry.d.cts.map +1 -0
- package/dist/program/agent-runner-registry.d.mts +52 -0
- package/dist/program/agent-runner-registry.d.mts.map +1 -0
- package/dist/program/agent-runner-registry.mjs +313 -0
- package/dist/program/agent-runner-registry.mjs.map +1 -0
- package/dist/program/agent-subscribe.cjs +72 -0
- package/dist/program/agent-subscribe.d.cts +18 -0
- package/dist/program/agent-subscribe.d.cts.map +1 -0
- package/dist/program/agent-subscribe.d.mts +18 -0
- package/dist/program/agent-subscribe.d.mts.map +1 -0
- package/dist/program/agent-subscribe.mjs +73 -0
- package/dist/program/agent-subscribe.mjs.map +1 -0
- package/dist/program/agent-tools.cjs +135 -0
- package/dist/program/agent-tools.d.cts +35 -0
- package/dist/program/agent-tools.d.cts.map +1 -0
- package/dist/program/agent-tools.d.mts +35 -0
- package/dist/program/agent-tools.d.mts.map +1 -0
- package/dist/program/agent-tools.mjs +136 -0
- package/dist/program/agent-tools.mjs.map +1 -0
- package/dist/program/manifest-nesting.cjs +57 -0
- package/dist/program/manifest-nesting.d.cts +13 -0
- package/dist/program/manifest-nesting.d.cts.map +1 -0
- package/dist/program/manifest-nesting.d.mts +13 -0
- package/dist/program/manifest-nesting.d.mts.map +1 -0
- package/dist/program/manifest-nesting.mjs +57 -0
- package/dist/program/manifest-nesting.mjs.map +1 -0
- package/dist/program/result-contract.cjs +55 -0
- package/dist/program/result-contract.d.cts +23 -0
- package/dist/program/result-contract.d.cts.map +1 -0
- package/dist/program/result-contract.d.mts +23 -0
- package/dist/program/result-contract.d.mts.map +1 -0
- package/dist/program/result-contract.mjs +51 -0
- package/dist/program/result-contract.mjs.map +1 -0
- package/dist/program/runner-error.cjs +71 -0
- package/dist/program/runner-error.d.cts +25 -0
- package/dist/program/runner-error.d.cts.map +1 -0
- package/dist/program/runner-error.d.mts +25 -0
- package/dist/program/runner-error.d.mts.map +1 -0
- package/dist/program/runner-error.mjs +72 -0
- package/dist/program/runner-error.mjs.map +1 -0
- package/dist/program/scoped-afs.cjs +538 -0
- package/dist/program/scoped-afs.d.cts +245 -0
- package/dist/program/scoped-afs.d.cts.map +1 -0
- package/dist/program/scoped-afs.d.mts +245 -0
- package/dist/program/scoped-afs.d.mts.map +1 -0
- package/dist/program/scoped-afs.mjs +531 -0
- package/dist/program/scoped-afs.mjs.map +1 -0
- package/dist/program/session-hierarchy.cjs +1 -0
- package/dist/program/session-hierarchy.d.cts +2 -0
- package/dist/program/session-hierarchy.d.mts +2 -0
- package/dist/program/session-hierarchy.mjs +3 -0
- package/dist/program/tool-discovery/ash-frontmatter.cjs +83 -0
- package/dist/program/tool-discovery/ash-frontmatter.d.cts +21 -0
- package/dist/program/tool-discovery/ash-frontmatter.d.cts.map +1 -0
- package/dist/program/tool-discovery/ash-frontmatter.d.mts +21 -0
- package/dist/program/tool-discovery/ash-frontmatter.d.mts.map +1 -0
- package/dist/program/tool-discovery/ash-frontmatter.mjs +84 -0
- package/dist/program/tool-discovery/ash-frontmatter.mjs.map +1 -0
- package/dist/program/tool-discovery/dot-path-resolver.cjs +60 -0
- package/dist/program/tool-discovery/dot-path-resolver.mjs +61 -0
- package/dist/program/tool-discovery/dot-path-resolver.mjs.map +1 -0
- package/dist/program/tool-discovery/skill-gate.cjs +36 -0
- package/dist/program/tool-discovery/skill-gate.d.cts +10 -0
- package/dist/program/tool-discovery/skill-gate.d.cts.map +1 -0
- package/dist/program/tool-discovery/skill-gate.d.mts +10 -0
- package/dist/program/tool-discovery/skill-gate.d.mts.map +1 -0
- package/dist/program/tool-discovery/skill-gate.mjs +35 -0
- package/dist/program/tool-discovery/skill-gate.mjs.map +1 -0
- package/dist/providers/basic/ash/dist/index.cjs +1809 -0
- package/dist/providers/basic/ash/dist/index.mjs +1807 -0
- package/dist/providers/basic/ash/dist/index.mjs.map +1 -0
- 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"}
|