@jungjaehoon/mama-os 0.9.2 → 0.9.4
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/README.md +41 -7
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +2 -3
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/claude-cli-wrapper.d.ts +4 -4
- package/dist/agent/claude-cli-wrapper.d.ts.map +1 -1
- package/dist/agent/claude-cli-wrapper.js +17 -5
- package/dist/agent/claude-cli-wrapper.js.map +1 -1
- package/dist/agent/claude-client.js +3 -3
- package/dist/agent/claude-client.js.map +1 -1
- package/dist/agent/codex-mcp-process.d.ts +10 -0
- package/dist/agent/codex-mcp-process.d.ts.map +1 -1
- package/dist/agent/codex-mcp-process.js +226 -58
- package/dist/agent/codex-mcp-process.js.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts +15 -1
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +37 -3
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +1 -0
- package/dist/agent/persistent-cli-process.d.ts +2 -0
- package/dist/agent/persistent-cli-process.d.ts.map +1 -1
- package/dist/agent/persistent-cli-process.js +15 -0
- package/dist/agent/persistent-cli-process.js.map +1 -1
- package/dist/agent/types.d.ts +3 -3
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/graph-api.d.ts.map +1 -1
- package/dist/api/graph-api.js +31 -5
- package/dist/api/graph-api.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +91 -6
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +7 -1
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +49 -0
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/config/config-manager.d.ts.map +1 -1
- package/dist/cli/config/config-manager.js +60 -15
- package/dist/cli/config/config-manager.js.map +1 -1
- package/dist/cli/config/types.d.ts +19 -5
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +3 -3
- package/dist/cli/config/types.js.map +1 -1
- package/dist/gateways/image-analyzer.js +1 -1
- package/dist/gateways/image-analyzer.js.map +1 -1
- package/dist/gateways/slack.d.ts.map +1 -1
- package/dist/gateways/slack.js +8 -19
- package/dist/gateways/slack.js.map +1 -1
- package/dist/multi-agent/agent-process-manager.d.ts +15 -1
- package/dist/multi-agent/agent-process-manager.d.ts.map +1 -1
- package/dist/multi-agent/agent-process-manager.js +121 -22
- package/dist/multi-agent/agent-process-manager.js.map +1 -1
- package/dist/multi-agent/background-task-manager.d.ts +2 -2
- package/dist/multi-agent/background-task-manager.js +2 -2
- package/dist/multi-agent/bmad-templates.d.ts +67 -0
- package/dist/multi-agent/bmad-templates.d.ts.map +1 -0
- package/dist/multi-agent/bmad-templates.js +248 -0
- package/dist/multi-agent/bmad-templates.js.map +1 -0
- package/dist/multi-agent/council-engine.d.ts +60 -0
- package/dist/multi-agent/council-engine.d.ts.map +1 -0
- package/dist/multi-agent/council-engine.js +284 -0
- package/dist/multi-agent/council-engine.js.map +1 -0
- package/dist/multi-agent/multi-agent-base.d.ts +18 -9
- package/dist/multi-agent/multi-agent-base.d.ts.map +1 -1
- package/dist/multi-agent/multi-agent-base.js +116 -33
- package/dist/multi-agent/multi-agent-base.js.map +1 -1
- package/dist/multi-agent/multi-agent-discord.d.ts +3 -35
- package/dist/multi-agent/multi-agent-discord.d.ts.map +1 -1
- package/dist/multi-agent/multi-agent-discord.js +81 -302
- package/dist/multi-agent/multi-agent-discord.js.map +1 -1
- package/dist/multi-agent/multi-agent-slack.d.ts +2 -25
- package/dist/multi-agent/multi-agent-slack.d.ts.map +1 -1
- package/dist/multi-agent/multi-agent-slack.js +173 -253
- package/dist/multi-agent/multi-agent-slack.js.map +1 -1
- package/dist/multi-agent/runtime-process.d.ts +3 -0
- package/dist/multi-agent/runtime-process.d.ts.map +1 -1
- package/dist/multi-agent/runtime-process.js +4 -0
- package/dist/multi-agent/runtime-process.js.map +1 -1
- package/dist/multi-agent/shared-context.d.ts.map +1 -1
- package/dist/multi-agent/shared-context.js +4 -4
- package/dist/multi-agent/shared-context.js.map +1 -1
- package/dist/multi-agent/system-reminder.d.ts +1 -1
- package/dist/multi-agent/system-reminder.js +1 -1
- package/dist/multi-agent/types.d.ts +31 -15
- package/dist/multi-agent/types.d.ts.map +1 -1
- package/dist/multi-agent/types.js +1 -3
- package/dist/multi-agent/types.js.map +1 -1
- package/dist/multi-agent/ultrawork-state.d.ts +57 -0
- package/dist/multi-agent/ultrawork-state.d.ts.map +1 -0
- package/dist/multi-agent/ultrawork-state.js +191 -0
- package/dist/multi-agent/ultrawork-state.js.map +1 -0
- package/dist/multi-agent/ultrawork.d.ts +37 -19
- package/dist/multi-agent/ultrawork.d.ts.map +1 -1
- package/dist/multi-agent/ultrawork.js +587 -41
- package/dist/multi-agent/ultrawork.js.map +1 -1
- package/dist/multi-agent/workflow-engine.d.ts +7 -0
- package/dist/multi-agent/workflow-engine.d.ts.map +1 -1
- package/dist/multi-agent/workflow-engine.js +238 -33
- package/dist/multi-agent/workflow-engine.js.map +1 -1
- package/dist/multi-agent/workflow-types.d.ts +74 -1
- package/dist/multi-agent/workflow-types.d.ts.map +1 -1
- package/dist/onboarding/complete-autonomous-prompt.d.ts +1 -1
- package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -1
- package/dist/onboarding/complete-autonomous-prompt.js +27 -10
- package/dist/onboarding/complete-autonomous-prompt.js.map +1 -1
- package/dist/onboarding/phase-7-integrations.d.ts.map +1 -1
- package/dist/onboarding/phase-7-integrations.js +23 -3
- package/dist/onboarding/phase-7-integrations.js.map +1 -1
- package/dist/onboarding/phase-9-finalization.d.ts.map +1 -1
- package/dist/onboarding/phase-9-finalization.js +33 -0
- package/dist/onboarding/phase-9-finalization.js.map +1 -1
- package/dist/setup/setup-prompt.d.ts +1 -1
- package/dist/setup/setup-prompt.d.ts.map +1 -1
- package/dist/setup/setup-prompt.js +1 -1
- package/package.json +1 -1
- package/public/viewer/js/modules/settings.js +110 -15
- package/public/viewer/js/utils/format.js +10 -7
- package/public/viewer/src/modules/settings.ts +133 -16
- package/public/viewer/src/utils/api.ts +2 -1
- package/public/viewer/src/utils/format.ts +10 -7
- package/public/viewer/viewer.html +1 -0
- package/templates/bmad/LICENSE +28 -0
- package/templates/bmad/architecture.md +343 -0
- package/templates/bmad/bmm-workflow-status.template.yaml +66 -0
- package/templates/bmad/prd.md +198 -0
- package/templates/bmad/product-brief.md +149 -0
- package/templates/bmad/sprint-status.template.yaml +35 -0
- package/templates/bmad/tech-spec.md +151 -0
- package/templates/personas/architect.md +70 -0
- package/templates/personas/conductor.md +373 -0
- package/templates/personas/developer.md +20 -7
- package/templates/personas/pm.md +49 -33
- package/templates/personas/reviewer.md +18 -5
- package/dist/multi-agent/pr-review-poller.d.ts +0 -197
- package/dist/multi-agent/pr-review-poller.d.ts.map +0 -1
- package/dist/multi-agent/pr-review-poller.js +0 -972
- package/dist/multi-agent/pr-review-poller.js.map +0 -1
- package/templates/personas/sisyphus-builtin-en.md +0 -161
- package/templates/personas/sisyphus.md +0 -218
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Council Engine
|
|
4
|
+
*
|
|
5
|
+
* Parses council_plan blocks from Conductor responses,
|
|
6
|
+
* validates agent availability, and executes multi-round
|
|
7
|
+
* discussions among existing named agents.
|
|
8
|
+
*
|
|
9
|
+
* Unlike WorkflowEngine (ephemeral agents, DAG execution),
|
|
10
|
+
* CouncilEngine reuses existing agents and runs sequential rounds
|
|
11
|
+
* with full history accumulation.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.CouncilEngine = void 0;
|
|
15
|
+
const events_1 = require("events");
|
|
16
|
+
const crypto_1 = require("crypto");
|
|
17
|
+
const DEFAULT_MAX_ROUNDS = 5;
|
|
18
|
+
const DEFAULT_MAX_DURATION_MS = 10 * 60 * 1000; // 10 minutes
|
|
19
|
+
const DEFAULT_ROUND_TIMEOUT_MS = 2 * 60 * 1000; // 2 minutes per agent per round
|
|
20
|
+
/**
|
|
21
|
+
* CouncilEngine
|
|
22
|
+
*
|
|
23
|
+
* Events:
|
|
24
|
+
* - 'progress': CouncilProgressEvent
|
|
25
|
+
*/
|
|
26
|
+
class CouncilEngine extends events_1.EventEmitter {
|
|
27
|
+
config;
|
|
28
|
+
activeExecutions = new Map();
|
|
29
|
+
constructor(config) {
|
|
30
|
+
super();
|
|
31
|
+
this.config = config;
|
|
32
|
+
}
|
|
33
|
+
isEnabled() {
|
|
34
|
+
return this.config.enabled;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse a council_plan JSON block from Conductor's response.
|
|
38
|
+
*/
|
|
39
|
+
parseCouncilPlan(response) {
|
|
40
|
+
const match = response.match(/```council_plan\s*\n([\s\S]*?)\n```/);
|
|
41
|
+
if (!match) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const plan = JSON.parse(match[1].trim());
|
|
46
|
+
if (typeof plan.name !== 'string' ||
|
|
47
|
+
!plan.name.trim() ||
|
|
48
|
+
typeof plan.topic !== 'string' ||
|
|
49
|
+
!plan.topic.trim() ||
|
|
50
|
+
!Array.isArray(plan.agents) ||
|
|
51
|
+
plan.agents.length === 0 ||
|
|
52
|
+
typeof plan.rounds !== 'number' ||
|
|
53
|
+
plan.rounds < 1) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// Validate agent IDs are strings
|
|
57
|
+
if (!plan.agents.every((a) => typeof a === 'string' && a.trim().length > 0)) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return plan;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extract text content outside the council_plan block.
|
|
68
|
+
*/
|
|
69
|
+
extractNonPlanContent(response) {
|
|
70
|
+
return response.replace(/```council_plan\s*\n[\s\S]*?\n```/, '').trim();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate plan against available agents and config limits.
|
|
74
|
+
* Returns error message or null if valid.
|
|
75
|
+
*/
|
|
76
|
+
validatePlan(plan, availableAgentIds) {
|
|
77
|
+
const maxRounds = this.config.max_rounds ?? DEFAULT_MAX_ROUNDS;
|
|
78
|
+
if (plan.rounds > maxRounds) {
|
|
79
|
+
return `Too many rounds (${plan.rounds}), max is ${maxRounds}`;
|
|
80
|
+
}
|
|
81
|
+
if (plan.rounds < 1) {
|
|
82
|
+
return 'Rounds must be at least 1';
|
|
83
|
+
}
|
|
84
|
+
const available = new Set(availableAgentIds);
|
|
85
|
+
const missing = plan.agents.filter((id) => !available.has(id));
|
|
86
|
+
if (missing.length > 0) {
|
|
87
|
+
return `Unknown agent(s): ${missing.join(', ')}`;
|
|
88
|
+
}
|
|
89
|
+
if (plan.agents.length < 2) {
|
|
90
|
+
return 'Council requires at least 2 agents';
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Execute a council discussion plan.
|
|
96
|
+
*/
|
|
97
|
+
async execute(plan, executeStep, agentDisplayNames) {
|
|
98
|
+
const executionId = (0, crypto_1.randomUUID)();
|
|
99
|
+
const executionState = { cancelled: false };
|
|
100
|
+
this.activeExecutions.set(executionId, executionState);
|
|
101
|
+
const maxDuration = plan.timeout_ms ?? this.config.max_duration_ms ?? DEFAULT_MAX_DURATION_MS;
|
|
102
|
+
const execution = {
|
|
103
|
+
id: executionId,
|
|
104
|
+
planName: plan.name,
|
|
105
|
+
topic: plan.topic,
|
|
106
|
+
startedAt: Date.now(),
|
|
107
|
+
status: 'running',
|
|
108
|
+
rounds: [],
|
|
109
|
+
};
|
|
110
|
+
const allResults = [];
|
|
111
|
+
const globalTimeout = setTimeout(() => {
|
|
112
|
+
executionState.cancelled = true;
|
|
113
|
+
}, maxDuration);
|
|
114
|
+
try {
|
|
115
|
+
for (let round = 1; round <= plan.rounds; round++) {
|
|
116
|
+
if (executionState.cancelled) {
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
for (const agentId of plan.agents) {
|
|
120
|
+
if (executionState.cancelled) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
const displayName = agentDisplayNames.get(agentId) ?? agentId;
|
|
124
|
+
this.emitProgress({
|
|
125
|
+
type: 'council-round-started',
|
|
126
|
+
executionId,
|
|
127
|
+
round,
|
|
128
|
+
agentId,
|
|
129
|
+
agentDisplayName: displayName,
|
|
130
|
+
});
|
|
131
|
+
const prompt = this.buildRoundPrompt(plan.topic, allResults, round, agentId, displayName);
|
|
132
|
+
const start = Date.now();
|
|
133
|
+
try {
|
|
134
|
+
const response = await executeStep(agentId, prompt, DEFAULT_ROUND_TIMEOUT_MS);
|
|
135
|
+
const duration_ms = Date.now() - start;
|
|
136
|
+
const roundResult = {
|
|
137
|
+
round,
|
|
138
|
+
agentId,
|
|
139
|
+
agentDisplayName: displayName,
|
|
140
|
+
response,
|
|
141
|
+
duration_ms,
|
|
142
|
+
status: 'success',
|
|
143
|
+
};
|
|
144
|
+
allResults.push(roundResult);
|
|
145
|
+
execution.rounds.push(roundResult);
|
|
146
|
+
this.emitProgress({
|
|
147
|
+
type: 'council-round-completed',
|
|
148
|
+
executionId,
|
|
149
|
+
round,
|
|
150
|
+
agentId,
|
|
151
|
+
agentDisplayName: displayName,
|
|
152
|
+
response: response.substring(0, 500),
|
|
153
|
+
duration_ms,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const duration_ms = Date.now() - start;
|
|
158
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
159
|
+
const roundResult = {
|
|
160
|
+
round,
|
|
161
|
+
agentId,
|
|
162
|
+
agentDisplayName: displayName,
|
|
163
|
+
response: '',
|
|
164
|
+
duration_ms,
|
|
165
|
+
status: errorMsg.includes('timeout') ? 'timeout' : 'failed',
|
|
166
|
+
error: errorMsg,
|
|
167
|
+
};
|
|
168
|
+
allResults.push(roundResult);
|
|
169
|
+
execution.rounds.push(roundResult);
|
|
170
|
+
this.emitProgress({
|
|
171
|
+
type: 'council-round-failed',
|
|
172
|
+
executionId,
|
|
173
|
+
round,
|
|
174
|
+
agentId,
|
|
175
|
+
agentDisplayName: displayName,
|
|
176
|
+
error: errorMsg,
|
|
177
|
+
duration_ms,
|
|
178
|
+
});
|
|
179
|
+
// Council continues even if an agent fails
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (executionState.cancelled && execution.status === 'running') {
|
|
184
|
+
execution.status = 'cancelled';
|
|
185
|
+
}
|
|
186
|
+
else if (execution.status === 'running') {
|
|
187
|
+
execution.status = 'completed';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
clearTimeout(globalTimeout);
|
|
192
|
+
this.activeExecutions.delete(executionId);
|
|
193
|
+
}
|
|
194
|
+
execution.completedAt = Date.now();
|
|
195
|
+
const result = this.buildFinalResult(plan, execution);
|
|
196
|
+
this.emitProgress({
|
|
197
|
+
type: 'council-completed',
|
|
198
|
+
executionId,
|
|
199
|
+
summary: result,
|
|
200
|
+
duration_ms: execution.completedAt - execution.startedAt,
|
|
201
|
+
});
|
|
202
|
+
return { result, execution };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Cancel a running council execution.
|
|
206
|
+
*/
|
|
207
|
+
cancel(executionId) {
|
|
208
|
+
const state = this.activeExecutions.get(executionId);
|
|
209
|
+
if (state) {
|
|
210
|
+
state.cancelled = true;
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Build prompt for a specific round + agent, including all previous responses.
|
|
217
|
+
*/
|
|
218
|
+
buildRoundPrompt(topic, previousResults, currentRound, currentAgentId, currentDisplayName) {
|
|
219
|
+
const parts = [];
|
|
220
|
+
parts.push(`## Council Discussion: ${topic}`);
|
|
221
|
+
parts.push(`You are **${currentDisplayName}** participating in Round ${currentRound} of a council discussion.`);
|
|
222
|
+
parts.push(`Topic: ${topic}`);
|
|
223
|
+
parts.push('');
|
|
224
|
+
if (previousResults.length > 0) {
|
|
225
|
+
parts.push('### Previous Responses');
|
|
226
|
+
for (const r of previousResults) {
|
|
227
|
+
if (r.status === 'success') {
|
|
228
|
+
const marker = r.agentId === currentAgentId ? ' (you)' : '';
|
|
229
|
+
parts.push(`**${r.agentDisplayName}${marker}** (Round ${r.round}):`);
|
|
230
|
+
parts.push(r.response);
|
|
231
|
+
parts.push('');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
parts.push(`### Your Turn (Round ${currentRound})`);
|
|
236
|
+
if (currentRound === 1) {
|
|
237
|
+
parts.push('Share your perspective on the topic. Be specific and provide reasoning.');
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
parts.push('Consider what others have said, then share your updated perspective. You may agree, disagree, or build on previous points.');
|
|
241
|
+
}
|
|
242
|
+
return parts.join('\n');
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Build final combined result from all rounds.
|
|
246
|
+
*/
|
|
247
|
+
buildFinalResult(plan, execution) {
|
|
248
|
+
if (execution.status === 'cancelled') {
|
|
249
|
+
return `Council "${plan.name}" was cancelled.`;
|
|
250
|
+
}
|
|
251
|
+
const parts = [];
|
|
252
|
+
const totalMs = execution.completedAt
|
|
253
|
+
? execution.completedAt - execution.startedAt
|
|
254
|
+
: Date.now() - execution.startedAt;
|
|
255
|
+
const totalSec = Math.round(totalMs / 1000);
|
|
256
|
+
parts.push(`## Council: ${plan.name} (${totalSec}s)`);
|
|
257
|
+
parts.push(`**Topic:** ${plan.topic}`);
|
|
258
|
+
parts.push('');
|
|
259
|
+
// Group by round
|
|
260
|
+
for (let round = 1; round <= plan.rounds; round++) {
|
|
261
|
+
const roundResults = execution.rounds.filter((r) => r.round === round);
|
|
262
|
+
if (roundResults.length === 0) {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
parts.push(`### Round ${round}`);
|
|
266
|
+
for (const r of roundResults) {
|
|
267
|
+
if (r.status === 'success') {
|
|
268
|
+
parts.push(`**${r.agentDisplayName}:**`);
|
|
269
|
+
parts.push(r.response);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
parts.push(`**${r.agentDisplayName}:** ❌ ${r.status}: ${r.error}`);
|
|
273
|
+
}
|
|
274
|
+
parts.push('');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return parts.join('\n');
|
|
278
|
+
}
|
|
279
|
+
emitProgress(event) {
|
|
280
|
+
this.emit('progress', event);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
exports.CouncilEngine = CouncilEngine;
|
|
284
|
+
//# sourceMappingURL=council-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"council-engine.js","sourceRoot":"","sources":["../../src/multi-agent/council-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,11 @@ import { AgentMessageQueue } from './agent-message-queue.js';
|
|
|
15
15
|
import { BackgroundTaskManager } from './background-task-manager.js';
|
|
16
16
|
import { SystemReminderService } from './system-reminder.js';
|
|
17
17
|
import { DelegationManager } from './delegation-manager.js';
|
|
18
|
-
import { PRReviewPoller } from './pr-review-poller.js';
|
|
19
18
|
import { WorkTracker } from './work-tracker.js';
|
|
20
19
|
import type { GatewayToolExecutor } from '../agent/gateway-tool-executor.js';
|
|
21
20
|
import { WorkflowEngine } from './workflow-engine.js';
|
|
22
|
-
import
|
|
21
|
+
import { CouncilEngine } from './council-engine.js';
|
|
22
|
+
import type { WorkflowProgressEvent, CouncilProgressEvent } from './workflow-types.js';
|
|
23
23
|
/** Default timeout for agent responses (15 minutes -- must accommodate sub-agent spawns) */
|
|
24
24
|
export declare const AGENT_TIMEOUT_MS: number;
|
|
25
25
|
/**
|
|
@@ -72,13 +72,13 @@ export declare abstract class MultiAgentHandlerBase {
|
|
|
72
72
|
protected processManager: AgentProcessManager;
|
|
73
73
|
protected sharedContext: SharedContextManager;
|
|
74
74
|
protected messageQueue: AgentMessageQueue;
|
|
75
|
-
protected prReviewPoller: PRReviewPoller;
|
|
76
75
|
protected backgroundTaskManager: BackgroundTaskManager;
|
|
77
76
|
protected systemReminder: SystemReminderService;
|
|
78
77
|
protected delegationManager: DelegationManager;
|
|
79
78
|
protected workTracker: WorkTracker;
|
|
80
79
|
protected gatewayToolExecutor: GatewayToolExecutor | null;
|
|
81
|
-
protected workflowEngine: WorkflowEngine
|
|
80
|
+
protected workflowEngine: WorkflowEngine;
|
|
81
|
+
protected councilEngine: CouncilEngine;
|
|
82
82
|
/** Whether multi-bot mode is initialized */
|
|
83
83
|
protected multiBotInitialized: boolean;
|
|
84
84
|
/** Dedup map for delegation mentions with timestamps (prevents double processing) */
|
|
@@ -139,10 +139,6 @@ export declare abstract class MultiAgentHandlerBase {
|
|
|
139
139
|
getSharedContext(): SharedContextManager;
|
|
140
140
|
getBackgroundTaskManager(): BackgroundTaskManager;
|
|
141
141
|
getSystemReminder(): SystemReminderService;
|
|
142
|
-
/**
|
|
143
|
-
* Get PR Review Poller instance
|
|
144
|
-
*/
|
|
145
|
-
getPRReviewPoller(): PRReviewPoller;
|
|
146
142
|
/**
|
|
147
143
|
* Get work tracker instance
|
|
148
144
|
*/
|
|
@@ -177,7 +173,7 @@ export declare abstract class MultiAgentHandlerBase {
|
|
|
177
173
|
/**
|
|
178
174
|
* Get workflow engine instance
|
|
179
175
|
*/
|
|
180
|
-
getWorkflowEngine(): WorkflowEngine
|
|
176
|
+
getWorkflowEngine(): WorkflowEngine;
|
|
181
177
|
/**
|
|
182
178
|
* Check if a Conductor response contains a workflow plan and execute it.
|
|
183
179
|
* Returns the workflow result or null if no plan was found.
|
|
@@ -185,6 +181,19 @@ export declare abstract class MultiAgentHandlerBase {
|
|
|
185
181
|
tryExecuteWorkflow(conductorResponse: string, channelId: string, source: 'discord' | 'slack', onProgress?: (event: WorkflowProgressEvent) => void): Promise<{
|
|
186
182
|
result: string;
|
|
187
183
|
directMessage: string;
|
|
184
|
+
failed?: string;
|
|
185
|
+
} | null>;
|
|
186
|
+
/**
|
|
187
|
+
* Get council engine instance
|
|
188
|
+
*/
|
|
189
|
+
getCouncilEngine(): CouncilEngine;
|
|
190
|
+
/**
|
|
191
|
+
* Check if a Conductor response contains a council_plan and execute it.
|
|
192
|
+
* Returns the council result or null if no plan was found.
|
|
193
|
+
*/
|
|
194
|
+
tryExecuteCouncil(conductorResponse: string, channelId: string, source: 'discord' | 'slack', onProgress?: (event: CouncilProgressEvent) => void): Promise<{
|
|
195
|
+
result: string;
|
|
196
|
+
directMessage: string;
|
|
188
197
|
} | null>;
|
|
189
198
|
/**
|
|
190
199
|
* Format ephemeral agent response with workflow prefix
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-agent-base.d.ts","sourceRoot":"","sources":["../../src/multi-agent/multi-agent-base.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,wBAAwB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAA2B,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAuB,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"multi-agent-base.d.ts","sourceRoot":"","sources":["../../src/multi-agent/multi-agent-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,10 @@ const agent_message_queue_js_1 = require("./agent-message-queue.js");
|
|
|
16
16
|
const background_task_manager_js_1 = require("./background-task-manager.js");
|
|
17
17
|
const system_reminder_js_1 = require("./system-reminder.js");
|
|
18
18
|
const delegation_manager_js_1 = require("./delegation-manager.js");
|
|
19
|
-
const pr_review_poller_js_1 = require("./pr-review-poller.js");
|
|
20
19
|
const work_tracker_js_1 = require("./work-tracker.js");
|
|
21
20
|
const log_sanitizer_js_1 = require("../utils/log-sanitizer.js");
|
|
22
21
|
const workflow_engine_js_1 = require("./workflow-engine.js");
|
|
22
|
+
const council_engine_js_1 = require("./council-engine.js");
|
|
23
23
|
/** Default timeout for agent responses (15 minutes -- must accommodate sub-agent spawns) */
|
|
24
24
|
exports.AGENT_TIMEOUT_MS = 15 * 60 * 1000;
|
|
25
25
|
/**
|
|
@@ -38,13 +38,13 @@ class MultiAgentHandlerBase {
|
|
|
38
38
|
processManager;
|
|
39
39
|
sharedContext;
|
|
40
40
|
messageQueue;
|
|
41
|
-
prReviewPoller;
|
|
42
41
|
backgroundTaskManager;
|
|
43
42
|
systemReminder;
|
|
44
43
|
delegationManager;
|
|
45
44
|
workTracker;
|
|
46
45
|
gatewayToolExecutor = null;
|
|
47
|
-
workflowEngine
|
|
46
|
+
workflowEngine;
|
|
47
|
+
councilEngine;
|
|
48
48
|
/** Whether multi-bot mode is initialized */
|
|
49
49
|
multiBotInitialized = false;
|
|
50
50
|
/** Dedup map for delegation mentions with timestamps (prevents double processing) */
|
|
@@ -57,14 +57,12 @@ class MultiAgentHandlerBase {
|
|
|
57
57
|
this.processManager = new agent_process_manager_js_1.AgentProcessManager(config, processOptions, runtimeOptions);
|
|
58
58
|
this.sharedContext = (0, shared_context_js_1.getSharedContextManager)();
|
|
59
59
|
this.messageQueue = new agent_message_queue_js_1.AgentMessageQueue();
|
|
60
|
-
this.prReviewPoller = new pr_review_poller_js_1.PRReviewPoller();
|
|
61
60
|
const agentConfigs = Object.entries(config.agents).map(([id, cfg]) => ({ id, ...cfg }));
|
|
62
61
|
this.delegationManager = new delegation_manager_js_1.DelegationManager(agentConfigs);
|
|
63
62
|
this.workTracker = new work_tracker_js_1.WorkTracker();
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
63
|
+
// Always initialize workflow engine (enabled by default)
|
|
64
|
+
this.workflowEngine = new workflow_engine_js_1.WorkflowEngine(config.workflow ?? { enabled: true });
|
|
65
|
+
this.councilEngine = new council_engine_js_1.CouncilEngine(config.council ?? { enabled: true });
|
|
68
66
|
this.backgroundTaskManager = new background_task_manager_js_1.BackgroundTaskManager(async (agentId, prompt) => {
|
|
69
67
|
let process = null;
|
|
70
68
|
try {
|
|
@@ -260,12 +258,6 @@ class MultiAgentHandlerBase {
|
|
|
260
258
|
getSystemReminder() {
|
|
261
259
|
return this.systemReminder;
|
|
262
260
|
}
|
|
263
|
-
/**
|
|
264
|
-
* Get PR Review Poller instance
|
|
265
|
-
*/
|
|
266
|
-
getPRReviewPoller() {
|
|
267
|
-
return this.prReviewPoller;
|
|
268
|
-
}
|
|
269
261
|
/**
|
|
270
262
|
* Get work tracker instance
|
|
271
263
|
*/
|
|
@@ -364,30 +356,28 @@ class MultiAgentHandlerBase {
|
|
|
364
356
|
}
|
|
365
357
|
const plan = this.workflowEngine.parseWorkflowPlan(conductorResponse);
|
|
366
358
|
if (!plan) {
|
|
367
|
-
const
|
|
368
|
-
|
|
359
|
+
const workflowPlanFence = '```workflow_plan';
|
|
360
|
+
const blockIdx = conductorResponse.toLowerCase().indexOf(workflowPlanFence);
|
|
361
|
+
if (blockIdx !== -1) {
|
|
369
362
|
this.logger.warn('[Workflow] Found workflow_plan block but failed to parse it');
|
|
370
|
-
const blockIdx = conductorResponse.search(/```workflow_plan/i);
|
|
371
363
|
this.logger.warn('[Workflow] Response snippet:', conductorResponse.substring(Math.max(0, blockIdx), Math.max(0, blockIdx) + 500));
|
|
372
364
|
}
|
|
373
365
|
return null;
|
|
374
366
|
}
|
|
367
|
+
const directMessage = this.workflowEngine.extractNonPlanContent(conductorResponse);
|
|
375
368
|
this.logger.info(`[Workflow] Parsed plan: "${plan.name}" with ${plan.steps.length} steps: ${plan.steps.map((s) => `${s.id}(${s.agent.backend}/${s.agent.model})`).join(', ')}`);
|
|
376
369
|
const validationError = this.workflowEngine.validatePlan(plan);
|
|
377
370
|
if (validationError) {
|
|
378
371
|
this.logger.warn(`[Workflow] Plan validation failed: ${validationError}`);
|
|
379
|
-
return
|
|
372
|
+
return { result: '', directMessage, failed: validationError };
|
|
380
373
|
}
|
|
381
|
-
//
|
|
382
|
-
const
|
|
383
|
-
|
|
384
|
-
const ephemeralAgentIds = plan.steps.map((s) => s.agent.id);
|
|
385
|
-
// Register progress listener
|
|
386
|
-
const progressHandler = onProgress
|
|
387
|
-
? (event) => onProgress(event)
|
|
388
|
-
: undefined;
|
|
374
|
+
// Collect ephemeral agent definitions for cleanup
|
|
375
|
+
const ephemeralAgents = plan.steps.map((s) => s.agent);
|
|
376
|
+
let progressHandler;
|
|
389
377
|
try {
|
|
390
|
-
|
|
378
|
+
progressHandler = onProgress
|
|
379
|
+
? (event) => onProgress(event)
|
|
380
|
+
: undefined;
|
|
391
381
|
if (progressHandler) {
|
|
392
382
|
this.workflowEngine.on('progress', progressHandler);
|
|
393
383
|
}
|
|
@@ -399,6 +389,12 @@ class MultiAgentHandlerBase {
|
|
|
399
389
|
const executeStep = async (agent, prompt, timeoutMs) => {
|
|
400
390
|
let process = null;
|
|
401
391
|
let timer;
|
|
392
|
+
const clearStepTimeout = () => {
|
|
393
|
+
if (timer) {
|
|
394
|
+
clearTimeout(timer);
|
|
395
|
+
timer = undefined;
|
|
396
|
+
}
|
|
397
|
+
};
|
|
402
398
|
try {
|
|
403
399
|
process = await this.processManager.getProcess(source, channelId, agent.id);
|
|
404
400
|
const result = await Promise.race([
|
|
@@ -407,14 +403,12 @@ class MultiAgentHandlerBase {
|
|
|
407
403
|
timer = setTimeout(() => reject(new Error(`Step timeout (${timeoutMs}ms)`)), timeoutMs);
|
|
408
404
|
}),
|
|
409
405
|
]);
|
|
410
|
-
|
|
411
|
-
clearTimeout(timer);
|
|
406
|
+
clearStepTimeout();
|
|
412
407
|
const cleaned = await this.executeTextToolCalls(result.response);
|
|
413
408
|
return cleaned;
|
|
414
409
|
}
|
|
415
410
|
finally {
|
|
416
|
-
|
|
417
|
-
clearTimeout(timer);
|
|
411
|
+
clearStepTimeout();
|
|
418
412
|
if (process) {
|
|
419
413
|
this.processManager.releaseProcess(agent.id, process);
|
|
420
414
|
}
|
|
@@ -423,14 +417,104 @@ class MultiAgentHandlerBase {
|
|
|
423
417
|
const { result } = await this.workflowEngine.execute(plan, executeStep);
|
|
424
418
|
return { result, directMessage };
|
|
425
419
|
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
422
|
+
this.logger.error(`[Workflow] Execution failed: ${errMsg}`);
|
|
423
|
+
return { result: '', directMessage, failed: errMsg };
|
|
424
|
+
}
|
|
426
425
|
finally {
|
|
427
426
|
// Cleanup: unregister ephemeral agents and remove progress listener
|
|
428
|
-
this.processManager.unregisterEphemeralAgents(
|
|
427
|
+
this.processManager.unregisterEphemeralAgents(ephemeralAgents);
|
|
429
428
|
if (progressHandler) {
|
|
430
429
|
this.workflowEngine.off('progress', progressHandler);
|
|
431
430
|
}
|
|
432
431
|
}
|
|
433
432
|
}
|
|
433
|
+
/**
|
|
434
|
+
* Get council engine instance
|
|
435
|
+
*/
|
|
436
|
+
getCouncilEngine() {
|
|
437
|
+
return this.councilEngine;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Check if a Conductor response contains a council_plan and execute it.
|
|
441
|
+
* Returns the council result or null if no plan was found.
|
|
442
|
+
*/
|
|
443
|
+
async tryExecuteCouncil(conductorResponse, channelId, source, onProgress) {
|
|
444
|
+
if (!this.councilEngine?.isEnabled()) {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
const plan = this.councilEngine.parseCouncilPlan(conductorResponse);
|
|
448
|
+
if (!plan) {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
const enabledAgents = this.orchestrator.getEnabledAgents();
|
|
452
|
+
const availableIds = enabledAgents.map((a) => a.id);
|
|
453
|
+
const validationError = this.councilEngine.validatePlan(plan, availableIds);
|
|
454
|
+
if (validationError) {
|
|
455
|
+
this.logger.warn(`[Council] Plan validation failed: ${validationError}`);
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
this.logger.info(`[Council] Parsed plan: "${plan.name}" topic="${plan.topic}" agents=[${plan.agents.join(',')}] rounds=${plan.rounds}`);
|
|
459
|
+
const directMessage = this.councilEngine.extractNonPlanContent(conductorResponse);
|
|
460
|
+
// Build agent display name map
|
|
461
|
+
const agentDisplayNames = new Map();
|
|
462
|
+
for (const agent of enabledAgents) {
|
|
463
|
+
agentDisplayNames.set(agent.id, agent.display_name);
|
|
464
|
+
}
|
|
465
|
+
let progressHandler;
|
|
466
|
+
try {
|
|
467
|
+
progressHandler = onProgress ? (event) => onProgress(event) : undefined;
|
|
468
|
+
if (progressHandler) {
|
|
469
|
+
this.councilEngine.on('progress', progressHandler);
|
|
470
|
+
}
|
|
471
|
+
// Build step executor using existing named agents
|
|
472
|
+
const executeStep = async (agentId, prompt, timeoutMs) => {
|
|
473
|
+
let process = null;
|
|
474
|
+
let timer;
|
|
475
|
+
const clearStepTimeout = () => {
|
|
476
|
+
if (timer) {
|
|
477
|
+
clearTimeout(timer);
|
|
478
|
+
timer = undefined;
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
try {
|
|
482
|
+
process = await this.processManager.getProcess(source, channelId, agentId);
|
|
483
|
+
const result = await Promise.race([
|
|
484
|
+
process.sendMessage(prompt),
|
|
485
|
+
new Promise((_, reject) => {
|
|
486
|
+
timer = setTimeout(() => reject(new Error(`Council agent timeout (${timeoutMs}ms)`)), timeoutMs);
|
|
487
|
+
}),
|
|
488
|
+
]);
|
|
489
|
+
clearStepTimeout();
|
|
490
|
+
const cleaned = await this.executeTextToolCalls(result.response);
|
|
491
|
+
return cleaned;
|
|
492
|
+
}
|
|
493
|
+
finally {
|
|
494
|
+
clearStepTimeout();
|
|
495
|
+
if (process) {
|
|
496
|
+
this.processManager.releaseProcess(agentId, process);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
const { result, execution } = await this.councilEngine.execute(plan, executeStep, agentDisplayNames);
|
|
501
|
+
// Record council round results into SharedContext for future agent reference
|
|
502
|
+
for (const round of execution.rounds) {
|
|
503
|
+
if (round.status === 'success' && round.response) {
|
|
504
|
+
const agent = enabledAgents.find((a) => a.id === round.agentId);
|
|
505
|
+
if (agent) {
|
|
506
|
+
this.sharedContext.recordAgentMessage(channelId, agent, `[Council: ${plan.name}] ${round.response}`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return { result, directMessage };
|
|
511
|
+
}
|
|
512
|
+
finally {
|
|
513
|
+
if (progressHandler) {
|
|
514
|
+
this.councilEngine.off('progress', progressHandler);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
434
518
|
/**
|
|
435
519
|
* Format ephemeral agent response with workflow prefix
|
|
436
520
|
*/
|
|
@@ -449,7 +533,6 @@ class MultiAgentHandlerBase {
|
|
|
449
533
|
async stopAll() {
|
|
450
534
|
this.backgroundTaskManager.destroy();
|
|
451
535
|
this.processManager.stopAll();
|
|
452
|
-
this.prReviewPoller.stopAll();
|
|
453
536
|
await this.platformCleanup();
|
|
454
537
|
}
|
|
455
538
|
}
|