@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.
Files changed (139) hide show
  1. package/README.md +41 -7
  2. package/dist/agent/agent-loop.d.ts.map +1 -1
  3. package/dist/agent/agent-loop.js +2 -3
  4. package/dist/agent/agent-loop.js.map +1 -1
  5. package/dist/agent/claude-cli-wrapper.d.ts +4 -4
  6. package/dist/agent/claude-cli-wrapper.d.ts.map +1 -1
  7. package/dist/agent/claude-cli-wrapper.js +17 -5
  8. package/dist/agent/claude-cli-wrapper.js.map +1 -1
  9. package/dist/agent/claude-client.js +3 -3
  10. package/dist/agent/claude-client.js.map +1 -1
  11. package/dist/agent/codex-mcp-process.d.ts +10 -0
  12. package/dist/agent/codex-mcp-process.d.ts.map +1 -1
  13. package/dist/agent/codex-mcp-process.js +226 -58
  14. package/dist/agent/codex-mcp-process.js.map +1 -1
  15. package/dist/agent/gateway-tool-executor.d.ts +15 -1
  16. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  17. package/dist/agent/gateway-tool-executor.js +37 -3
  18. package/dist/agent/gateway-tool-executor.js.map +1 -1
  19. package/dist/agent/gateway-tools.md +1 -0
  20. package/dist/agent/persistent-cli-process.d.ts +2 -0
  21. package/dist/agent/persistent-cli-process.d.ts.map +1 -1
  22. package/dist/agent/persistent-cli-process.js +15 -0
  23. package/dist/agent/persistent-cli-process.js.map +1 -1
  24. package/dist/agent/types.d.ts +3 -3
  25. package/dist/agent/types.d.ts.map +1 -1
  26. package/dist/agent/types.js.map +1 -1
  27. package/dist/api/graph-api.d.ts.map +1 -1
  28. package/dist/api/graph-api.js +31 -5
  29. package/dist/api/graph-api.js.map +1 -1
  30. package/dist/cli/commands/start.d.ts.map +1 -1
  31. package/dist/cli/commands/start.js +91 -6
  32. package/dist/cli/commands/start.js.map +1 -1
  33. package/dist/cli/commands/stop.d.ts +7 -1
  34. package/dist/cli/commands/stop.d.ts.map +1 -1
  35. package/dist/cli/commands/stop.js +49 -0
  36. package/dist/cli/commands/stop.js.map +1 -1
  37. package/dist/cli/config/config-manager.d.ts.map +1 -1
  38. package/dist/cli/config/config-manager.js +60 -15
  39. package/dist/cli/config/config-manager.js.map +1 -1
  40. package/dist/cli/config/types.d.ts +19 -5
  41. package/dist/cli/config/types.d.ts.map +1 -1
  42. package/dist/cli/config/types.js +3 -3
  43. package/dist/cli/config/types.js.map +1 -1
  44. package/dist/gateways/image-analyzer.js +1 -1
  45. package/dist/gateways/image-analyzer.js.map +1 -1
  46. package/dist/gateways/slack.d.ts.map +1 -1
  47. package/dist/gateways/slack.js +8 -19
  48. package/dist/gateways/slack.js.map +1 -1
  49. package/dist/multi-agent/agent-process-manager.d.ts +15 -1
  50. package/dist/multi-agent/agent-process-manager.d.ts.map +1 -1
  51. package/dist/multi-agent/agent-process-manager.js +121 -22
  52. package/dist/multi-agent/agent-process-manager.js.map +1 -1
  53. package/dist/multi-agent/background-task-manager.d.ts +2 -2
  54. package/dist/multi-agent/background-task-manager.js +2 -2
  55. package/dist/multi-agent/bmad-templates.d.ts +67 -0
  56. package/dist/multi-agent/bmad-templates.d.ts.map +1 -0
  57. package/dist/multi-agent/bmad-templates.js +248 -0
  58. package/dist/multi-agent/bmad-templates.js.map +1 -0
  59. package/dist/multi-agent/council-engine.d.ts +60 -0
  60. package/dist/multi-agent/council-engine.d.ts.map +1 -0
  61. package/dist/multi-agent/council-engine.js +284 -0
  62. package/dist/multi-agent/council-engine.js.map +1 -0
  63. package/dist/multi-agent/multi-agent-base.d.ts +18 -9
  64. package/dist/multi-agent/multi-agent-base.d.ts.map +1 -1
  65. package/dist/multi-agent/multi-agent-base.js +116 -33
  66. package/dist/multi-agent/multi-agent-base.js.map +1 -1
  67. package/dist/multi-agent/multi-agent-discord.d.ts +3 -35
  68. package/dist/multi-agent/multi-agent-discord.d.ts.map +1 -1
  69. package/dist/multi-agent/multi-agent-discord.js +81 -302
  70. package/dist/multi-agent/multi-agent-discord.js.map +1 -1
  71. package/dist/multi-agent/multi-agent-slack.d.ts +2 -25
  72. package/dist/multi-agent/multi-agent-slack.d.ts.map +1 -1
  73. package/dist/multi-agent/multi-agent-slack.js +173 -253
  74. package/dist/multi-agent/multi-agent-slack.js.map +1 -1
  75. package/dist/multi-agent/runtime-process.d.ts +3 -0
  76. package/dist/multi-agent/runtime-process.d.ts.map +1 -1
  77. package/dist/multi-agent/runtime-process.js +4 -0
  78. package/dist/multi-agent/runtime-process.js.map +1 -1
  79. package/dist/multi-agent/shared-context.d.ts.map +1 -1
  80. package/dist/multi-agent/shared-context.js +4 -4
  81. package/dist/multi-agent/shared-context.js.map +1 -1
  82. package/dist/multi-agent/system-reminder.d.ts +1 -1
  83. package/dist/multi-agent/system-reminder.js +1 -1
  84. package/dist/multi-agent/types.d.ts +31 -15
  85. package/dist/multi-agent/types.d.ts.map +1 -1
  86. package/dist/multi-agent/types.js +1 -3
  87. package/dist/multi-agent/types.js.map +1 -1
  88. package/dist/multi-agent/ultrawork-state.d.ts +57 -0
  89. package/dist/multi-agent/ultrawork-state.d.ts.map +1 -0
  90. package/dist/multi-agent/ultrawork-state.js +191 -0
  91. package/dist/multi-agent/ultrawork-state.js.map +1 -0
  92. package/dist/multi-agent/ultrawork.d.ts +37 -19
  93. package/dist/multi-agent/ultrawork.d.ts.map +1 -1
  94. package/dist/multi-agent/ultrawork.js +587 -41
  95. package/dist/multi-agent/ultrawork.js.map +1 -1
  96. package/dist/multi-agent/workflow-engine.d.ts +7 -0
  97. package/dist/multi-agent/workflow-engine.d.ts.map +1 -1
  98. package/dist/multi-agent/workflow-engine.js +238 -33
  99. package/dist/multi-agent/workflow-engine.js.map +1 -1
  100. package/dist/multi-agent/workflow-types.d.ts +74 -1
  101. package/dist/multi-agent/workflow-types.d.ts.map +1 -1
  102. package/dist/onboarding/complete-autonomous-prompt.d.ts +1 -1
  103. package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -1
  104. package/dist/onboarding/complete-autonomous-prompt.js +27 -10
  105. package/dist/onboarding/complete-autonomous-prompt.js.map +1 -1
  106. package/dist/onboarding/phase-7-integrations.d.ts.map +1 -1
  107. package/dist/onboarding/phase-7-integrations.js +23 -3
  108. package/dist/onboarding/phase-7-integrations.js.map +1 -1
  109. package/dist/onboarding/phase-9-finalization.d.ts.map +1 -1
  110. package/dist/onboarding/phase-9-finalization.js +33 -0
  111. package/dist/onboarding/phase-9-finalization.js.map +1 -1
  112. package/dist/setup/setup-prompt.d.ts +1 -1
  113. package/dist/setup/setup-prompt.d.ts.map +1 -1
  114. package/dist/setup/setup-prompt.js +1 -1
  115. package/package.json +1 -1
  116. package/public/viewer/js/modules/settings.js +110 -15
  117. package/public/viewer/js/utils/format.js +10 -7
  118. package/public/viewer/src/modules/settings.ts +133 -16
  119. package/public/viewer/src/utils/api.ts +2 -1
  120. package/public/viewer/src/utils/format.ts +10 -7
  121. package/public/viewer/viewer.html +1 -0
  122. package/templates/bmad/LICENSE +28 -0
  123. package/templates/bmad/architecture.md +343 -0
  124. package/templates/bmad/bmm-workflow-status.template.yaml +66 -0
  125. package/templates/bmad/prd.md +198 -0
  126. package/templates/bmad/product-brief.md +149 -0
  127. package/templates/bmad/sprint-status.template.yaml +35 -0
  128. package/templates/bmad/tech-spec.md +151 -0
  129. package/templates/personas/architect.md +70 -0
  130. package/templates/personas/conductor.md +373 -0
  131. package/templates/personas/developer.md +20 -7
  132. package/templates/personas/pm.md +49 -33
  133. package/templates/personas/reviewer.md +18 -5
  134. package/dist/multi-agent/pr-review-poller.d.ts +0 -197
  135. package/dist/multi-agent/pr-review-poller.d.ts.map +0 -1
  136. package/dist/multi-agent/pr-review-poller.js +0 -972
  137. package/dist/multi-agent/pr-review-poller.js.map +0 -1
  138. package/templates/personas/sisyphus-builtin-en.md +0 -161
  139. 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.
@@ -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":"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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,30 +356,28 @@ 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;
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 null;
372
+ return { result: '', directMessage, failed: validationError };
380
373
  }
381
- // Extract non-plan content as Conductor's direct message
382
- 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;
374
+ // Collect ephemeral agent definitions for cleanup
375
+ const ephemeralAgents = plan.steps.map((s) => s.agent);
376
+ let progressHandler;
389
377
  try {
390
- // Register progress listener inside try block to ensure cleanup in finally
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
- if (timer)
411
- clearTimeout(timer);
406
+ clearStepTimeout();
412
407
  const cleaned = await this.executeTextToolCalls(result.response);
413
408
  return cleaned;
414
409
  }
415
410
  finally {
416
- if (timer)
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(ephemeralAgentIds);
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
  }