@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,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"}
|