@jungjaehoon/mama-os 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +41 -7
  2. package/dist/api/graph-api.js +1 -1
  3. package/dist/api/graph-api.js.map +1 -1
  4. package/dist/cli/config/config-manager.d.ts.map +1 -1
  5. package/dist/cli/config/config-manager.js +60 -15
  6. package/dist/cli/config/config-manager.js.map +1 -1
  7. package/dist/cli/config/types.d.ts +16 -4
  8. package/dist/cli/config/types.d.ts.map +1 -1
  9. package/dist/cli/config/types.js.map +1 -1
  10. package/dist/gateways/slack.d.ts.map +1 -1
  11. package/dist/gateways/slack.js +0 -10
  12. package/dist/gateways/slack.js.map +1 -1
  13. package/dist/multi-agent/agent-process-manager.d.ts +3 -1
  14. package/dist/multi-agent/agent-process-manager.d.ts.map +1 -1
  15. package/dist/multi-agent/agent-process-manager.js +21 -12
  16. package/dist/multi-agent/agent-process-manager.js.map +1 -1
  17. package/dist/multi-agent/background-task-manager.d.ts +2 -2
  18. package/dist/multi-agent/background-task-manager.js +2 -2
  19. package/dist/multi-agent/council-engine.d.ts +60 -0
  20. package/dist/multi-agent/council-engine.d.ts.map +1 -0
  21. package/dist/multi-agent/council-engine.js +284 -0
  22. package/dist/multi-agent/council-engine.js.map +1 -0
  23. package/dist/multi-agent/multi-agent-base.d.ts +17 -9
  24. package/dist/multi-agent/multi-agent-base.d.ts.map +1 -1
  25. package/dist/multi-agent/multi-agent-base.js +109 -30
  26. package/dist/multi-agent/multi-agent-base.js.map +1 -1
  27. package/dist/multi-agent/multi-agent-discord.d.ts +3 -35
  28. package/dist/multi-agent/multi-agent-discord.d.ts.map +1 -1
  29. package/dist/multi-agent/multi-agent-discord.js +57 -300
  30. package/dist/multi-agent/multi-agent-discord.js.map +1 -1
  31. package/dist/multi-agent/multi-agent-slack.d.ts +0 -25
  32. package/dist/multi-agent/multi-agent-slack.d.ts.map +1 -1
  33. package/dist/multi-agent/multi-agent-slack.js +95 -234
  34. package/dist/multi-agent/multi-agent-slack.js.map +1 -1
  35. package/dist/multi-agent/shared-context.d.ts.map +1 -1
  36. package/dist/multi-agent/shared-context.js +4 -4
  37. package/dist/multi-agent/shared-context.js.map +1 -1
  38. package/dist/multi-agent/system-reminder.d.ts +1 -1
  39. package/dist/multi-agent/system-reminder.js +1 -1
  40. package/dist/multi-agent/types.d.ts +11 -15
  41. package/dist/multi-agent/types.d.ts.map +1 -1
  42. package/dist/multi-agent/types.js +1 -3
  43. package/dist/multi-agent/types.js.map +1 -1
  44. package/dist/multi-agent/ultrawork-state.d.ts +57 -0
  45. package/dist/multi-agent/ultrawork-state.d.ts.map +1 -0
  46. package/dist/multi-agent/ultrawork-state.js +191 -0
  47. package/dist/multi-agent/ultrawork-state.js.map +1 -0
  48. package/dist/multi-agent/ultrawork.d.ts +37 -19
  49. package/dist/multi-agent/ultrawork.d.ts.map +1 -1
  50. package/dist/multi-agent/ultrawork.js +587 -41
  51. package/dist/multi-agent/ultrawork.js.map +1 -1
  52. package/dist/multi-agent/workflow-engine.d.ts.map +1 -1
  53. package/dist/multi-agent/workflow-engine.js +39 -14
  54. package/dist/multi-agent/workflow-engine.js.map +1 -1
  55. package/dist/multi-agent/workflow-types.d.ts +69 -0
  56. package/dist/multi-agent/workflow-types.d.ts.map +1 -1
  57. package/dist/onboarding/complete-autonomous-prompt.d.ts +1 -1
  58. package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -1
  59. package/dist/onboarding/complete-autonomous-prompt.js +27 -10
  60. package/dist/onboarding/complete-autonomous-prompt.js.map +1 -1
  61. package/dist/onboarding/phase-7-integrations.d.ts.map +1 -1
  62. package/dist/onboarding/phase-7-integrations.js +23 -3
  63. package/dist/onboarding/phase-7-integrations.js.map +1 -1
  64. package/dist/onboarding/phase-9-finalization.d.ts.map +1 -1
  65. package/dist/onboarding/phase-9-finalization.js +33 -0
  66. package/dist/onboarding/phase-9-finalization.js.map +1 -1
  67. package/package.json +1 -1
  68. package/templates/personas/architect.md +70 -0
  69. package/templates/personas/conductor.md +302 -0
  70. package/templates/personas/developer.md +20 -7
  71. package/templates/personas/pm.md +49 -33
  72. package/templates/personas/reviewer.md +18 -5
  73. package/dist/multi-agent/pr-review-poller.d.ts +0 -197
  74. package/dist/multi-agent/pr-review-poller.d.ts.map +0 -1
  75. package/dist/multi-agent/pr-review-poller.js +0 -972
  76. package/dist/multi-agent/pr-review-poller.js.map +0 -1
  77. package/templates/personas/sisyphus-builtin-en.md +0 -161
  78. 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 type { WorkflowProgressEvent } from './workflow-types.js';
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 | null;
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 | null;
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.
@@ -186,6 +182,18 @@ export declare abstract class MultiAgentHandlerBase {
186
182
  result: string;
187
183
  directMessage: string;
188
184
  } | null>;
185
+ /**
186
+ * Get council engine instance
187
+ */
188
+ getCouncilEngine(): CouncilEngine;
189
+ /**
190
+ * Check if a Conductor response contains a council_plan and execute it.
191
+ * Returns the council result or null if no plan was found.
192
+ */
193
+ tryExecuteCouncil(conductorResponse: string, channelId: string, source: 'discord' | 'slack', onProgress?: (event: CouncilProgressEvent) => void): Promise<{
194
+ result: string;
195
+ directMessage: string;
196
+ } | null>;
189
197
  /**
190
198
  * Format ephemeral agent response with workflow prefix
191
199
  */
@@ -1 +1 @@
1
- {"version":3,"file":"multi-agent-base.d.ts","sourceRoot":"","sources":["../../src/multi-agent/multi-agent-base.ts"],"names":[],"mappings":"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"}
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 = null;
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
- // Initialize workflow engine if enabled
65
- if (config.workflow?.enabled) {
66
- this.workflowEngine = new workflow_engine_js_1.WorkflowEngine(config.workflow);
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,10 +356,10 @@ class MultiAgentHandlerBase {
364
356
  }
365
357
  const plan = this.workflowEngine.parseWorkflowPlan(conductorResponse);
366
358
  if (!plan) {
367
- const hasBlock = /```workflow_plan/i.test(conductorResponse);
368
- if (hasBlock) {
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;
@@ -380,14 +372,13 @@ class MultiAgentHandlerBase {
380
372
  }
381
373
  // Extract non-plan content as Conductor's direct message
382
374
  const directMessage = this.workflowEngine.extractNonPlanContent(conductorResponse);
383
- // Collect ephemeral agent IDs for cleanup
384
- const ephemeralAgentIds = plan.steps.map((s) => s.agent.id);
385
- // Register progress listener
386
- const progressHandler = onProgress
387
- ? (event) => onProgress(event)
388
- : undefined;
375
+ // Collect ephemeral agent definitions for cleanup
376
+ const ephemeralAgents = plan.steps.map((s) => s.agent);
377
+ let progressHandler;
389
378
  try {
390
- // Register progress listener inside try block to ensure cleanup in finally
379
+ progressHandler = onProgress
380
+ ? (event) => onProgress(event)
381
+ : undefined;
391
382
  if (progressHandler) {
392
383
  this.workflowEngine.on('progress', progressHandler);
393
384
  }
@@ -399,6 +390,12 @@ class MultiAgentHandlerBase {
399
390
  const executeStep = async (agent, prompt, timeoutMs) => {
400
391
  let process = null;
401
392
  let timer;
393
+ const clearStepTimeout = () => {
394
+ if (timer) {
395
+ clearTimeout(timer);
396
+ timer = undefined;
397
+ }
398
+ };
402
399
  try {
403
400
  process = await this.processManager.getProcess(source, channelId, agent.id);
404
401
  const result = await Promise.race([
@@ -407,14 +404,12 @@ class MultiAgentHandlerBase {
407
404
  timer = setTimeout(() => reject(new Error(`Step timeout (${timeoutMs}ms)`)), timeoutMs);
408
405
  }),
409
406
  ]);
410
- if (timer)
411
- clearTimeout(timer);
407
+ clearStepTimeout();
412
408
  const cleaned = await this.executeTextToolCalls(result.response);
413
409
  return cleaned;
414
410
  }
415
411
  finally {
416
- if (timer)
417
- clearTimeout(timer);
412
+ clearStepTimeout();
418
413
  if (process) {
419
414
  this.processManager.releaseProcess(agent.id, process);
420
415
  }
@@ -425,12 +420,97 @@ class MultiAgentHandlerBase {
425
420
  }
426
421
  finally {
427
422
  // Cleanup: unregister ephemeral agents and remove progress listener
428
- this.processManager.unregisterEphemeralAgents(ephemeralAgentIds);
423
+ this.processManager.unregisterEphemeralAgents(ephemeralAgents);
429
424
  if (progressHandler) {
430
425
  this.workflowEngine.off('progress', progressHandler);
431
426
  }
432
427
  }
433
428
  }
429
+ /**
430
+ * Get council engine instance
431
+ */
432
+ getCouncilEngine() {
433
+ return this.councilEngine;
434
+ }
435
+ /**
436
+ * Check if a Conductor response contains a council_plan and execute it.
437
+ * Returns the council result or null if no plan was found.
438
+ */
439
+ async tryExecuteCouncil(conductorResponse, channelId, source, onProgress) {
440
+ if (!this.councilEngine?.isEnabled()) {
441
+ return null;
442
+ }
443
+ const plan = this.councilEngine.parseCouncilPlan(conductorResponse);
444
+ if (!plan) {
445
+ return null;
446
+ }
447
+ const enabledAgents = this.orchestrator.getEnabledAgents();
448
+ const availableIds = enabledAgents.map((a) => a.id);
449
+ const validationError = this.councilEngine.validatePlan(plan, availableIds);
450
+ if (validationError) {
451
+ this.logger.warn(`[Council] Plan validation failed: ${validationError}`);
452
+ return null;
453
+ }
454
+ this.logger.info(`[Council] Parsed plan: "${plan.name}" topic="${plan.topic}" agents=[${plan.agents.join(',')}] rounds=${plan.rounds}`);
455
+ const directMessage = this.councilEngine.extractNonPlanContent(conductorResponse);
456
+ // Build agent display name map
457
+ const agentDisplayNames = new Map();
458
+ for (const agent of enabledAgents) {
459
+ agentDisplayNames.set(agent.id, agent.display_name);
460
+ }
461
+ let progressHandler;
462
+ try {
463
+ progressHandler = onProgress ? (event) => onProgress(event) : undefined;
464
+ if (progressHandler) {
465
+ this.councilEngine.on('progress', progressHandler);
466
+ }
467
+ // Build step executor using existing named agents
468
+ const executeStep = async (agentId, prompt, timeoutMs) => {
469
+ let process = null;
470
+ let timer;
471
+ const clearStepTimeout = () => {
472
+ if (timer) {
473
+ clearTimeout(timer);
474
+ timer = undefined;
475
+ }
476
+ };
477
+ try {
478
+ process = await this.processManager.getProcess(source, channelId, agentId);
479
+ const result = await Promise.race([
480
+ process.sendMessage(prompt),
481
+ new Promise((_, reject) => {
482
+ timer = setTimeout(() => reject(new Error(`Council agent timeout (${timeoutMs}ms)`)), timeoutMs);
483
+ }),
484
+ ]);
485
+ clearStepTimeout();
486
+ const cleaned = await this.executeTextToolCalls(result.response);
487
+ return cleaned;
488
+ }
489
+ finally {
490
+ clearStepTimeout();
491
+ if (process) {
492
+ this.processManager.releaseProcess(agentId, process);
493
+ }
494
+ }
495
+ };
496
+ const { result, execution } = await this.councilEngine.execute(plan, executeStep, agentDisplayNames);
497
+ // Record council round results into SharedContext for future agent reference
498
+ for (const round of execution.rounds) {
499
+ if (round.status === 'success' && round.response) {
500
+ const agent = enabledAgents.find((a) => a.id === round.agentId);
501
+ if (agent) {
502
+ this.sharedContext.recordAgentMessage(channelId, agent, `[Council: ${plan.name}] ${round.response}`);
503
+ }
504
+ }
505
+ }
506
+ return { result, directMessage };
507
+ }
508
+ finally {
509
+ if (progressHandler) {
510
+ this.councilEngine.off('progress', progressHandler);
511
+ }
512
+ }
513
+ }
434
514
  /**
435
515
  * Format ephemeral agent response with workflow prefix
436
516
  */
@@ -449,7 +529,6 @@ class MultiAgentHandlerBase {
449
529
  async stopAll() {
450
530
  this.backgroundTaskManager.destroy();
451
531
  this.processManager.stopAll();
452
- this.prReviewPoller.stopAll();
453
532
  await this.platformCleanup();
454
533
  }
455
534
  }