snow-flow 2.0.2 → 2.0.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 (173) hide show
  1. package/{.claude/mcp-config.json → .mcp.json} +13 -12
  2. package/.releaserc.json +47 -0
  3. package/README.md +6 -0
  4. package/package.json +1 -1
  5. package/.claude/claude-settings.json +0 -15
  6. package/.claude/commands/analysis/README.md +0 -9
  7. package/.claude/commands/automation/README.md +0 -9
  8. package/.claude/commands/github/README.md +0 -11
  9. package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
  10. package/.claude/commands/hooks/README.md +0 -11
  11. package/.claude/commands/monitoring/README.md +0 -9
  12. package/.claude/commands/optimization/README.md +0 -9
  13. package/.claude/commands/training/README.md +0 -9
  14. package/.claude/commands/workflows/README.md +0 -9
  15. package/.claude/config.json +0 -36
  16. package/.claude/helpers/github-setup.sh +0 -28
  17. package/.claude/helpers/quick-start.sh +0 -19
  18. package/.claude/helpers/setup-mcp.sh +0 -18
  19. package/.claude/settings.json +0 -114
  20. package/.claude/settings.local.json +0 -33
  21. package/.claude-flow/metrics/agent-metrics.json +0 -1
  22. package/.claude-flow/metrics/performance.json +0 -9
  23. package/.claude-flow/metrics/system-metrics.json +0 -15986
  24. package/.claude-flow/metrics/task-metrics.json +0 -10
  25. package/.roo/README.md +0 -402
  26. package/.roo/mcp-list.txt +0 -257
  27. package/.roo/mcp.json +0 -32
  28. package/.roo/workflows/basic-tdd.json +0 -32
  29. package/.roomodes +0 -201
  30. package/CLAUDE.md +0 -393
  31. package/bin/snow-flow.js +0 -3
  32. package/dist/cli.js.bak +0 -2052
  33. package/dist/config/snow-flow-config.d.ts +0 -1492
  34. package/dist/config/snow-flow-config.js +0 -938
  35. package/scripts/create-env.js +0 -91
  36. package/scripts/postinstall.js +0 -30
  37. package/scripts/register-mcp-servers.js +0 -210
  38. package/scripts/reset-mcp-servers.js +0 -246
  39. package/scripts/setup-mcp.js +0 -106
  40. package/scripts/update-version.js +0 -31
  41. package/src/agents/README.md +0 -192
  42. package/src/agents/base-agent.ts +0 -251
  43. package/src/agents/coordinator.ts +0 -971
  44. package/src/agents/index.ts +0 -18
  45. package/src/agents/queen-403-handler.ts +0 -230
  46. package/src/agents/queen-agent.ts +0 -1399
  47. package/src/agents/script-writer-agent.ts +0 -769
  48. package/src/agents/security-agent.ts +0 -726
  49. package/src/agents/widget-creator-agent.ts +0 -568
  50. package/src/api/error-handling.ts +0 -1758
  51. package/src/api/natural-language-mapper.ts +0 -630
  52. package/src/api/performance-optimizer.ts +0 -891
  53. package/src/api/transaction-manager.ts +0 -754
  54. package/src/cli/deploy-artifact.ts +0 -304
  55. package/src/cli/snow-flow-cli-integration.ts +0 -434
  56. package/src/cli.ts +0 -4455
  57. package/src/cli.ts.bak +0 -5616
  58. package/src/compliance/advanced-compliance-system.ts +0 -1268
  59. package/src/compliance/index.ts +0 -19
  60. package/src/config/snow-flow-config.ts +0 -1019
  61. package/src/documentation/index.ts +0 -16
  62. package/src/documentation/self-documenting-system.ts +0 -1421
  63. package/src/dynamic-version.ts +0 -44
  64. package/src/healing/index.ts +0 -20
  65. package/src/healing/self-healing-system.ts +0 -1435
  66. package/src/health/README.md +0 -161
  67. package/src/health/system-health.ts +0 -995
  68. package/src/index.ts +0 -60
  69. package/src/intelligence/acl-analyzer.ts +0 -377
  70. package/src/intelligence/auto-resolution-engine.ts +0 -643
  71. package/src/intelligence/gap-analysis-engine.ts +0 -488
  72. package/src/intelligence/manual-instructions-generator.ts +0 -744
  73. package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
  74. package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
  75. package/src/intelligence/performance-recommendations-engine.ts +0 -1223
  76. package/src/intelligence/requirements-analyzer.ts +0 -1148
  77. package/src/intelligence/task-analyzer.ts +0 -628
  78. package/src/managers/scope-manager.ts +0 -555
  79. package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
  80. package/src/mcp/base-mcp-server.ts +0 -660
  81. package/src/mcp/http-transport-wrapper.ts +0 -426
  82. package/src/mcp/service-discovery-client.ts +0 -312
  83. package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
  84. package/src/mcp/servicenow-automation-mcp.ts +0 -838
  85. package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
  86. package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
  87. package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
  88. package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
  89. package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
  90. package/src/mcp/servicenow-integration-mcp.ts +0 -819
  91. package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
  92. package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
  93. package/src/mcp/servicenow-mcp-server.ts +0 -728
  94. package/src/mcp/servicenow-memory-mcp.ts +0 -474
  95. package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
  96. package/src/mcp/servicenow-operations-mcp.ts +0 -3384
  97. package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
  98. package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
  99. package/src/mcp/servicenow-progressive-indexer.ts +0 -370
  100. package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
  101. package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
  102. package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
  103. package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
  104. package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
  105. package/src/mcp/servicenow-update-set-mcp.ts +0 -811
  106. package/src/mcp/shared/agent-context-provider.ts +0 -365
  107. package/src/mcp/shared/base-mcp-server.ts +0 -2463
  108. package/src/mcp/shared/mcp-memory-manager.ts +0 -540
  109. package/src/mcp/shared/mcp-resource-manager.ts +0 -367
  110. package/src/mcp/snow-flow-mcp.ts +0 -911
  111. package/src/mcp/start-all-mcp-servers.ts +0 -102
  112. package/src/mcp/start-servicenow-mcp.ts +0 -67
  113. package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
  114. package/src/monitoring/performance-tracker.ts +0 -777
  115. package/src/optimization/cost-optimization-engine.ts +0 -1125
  116. package/src/optimization/index.ts +0 -10
  117. package/src/queen/README.md +0 -403
  118. package/src/queen/agent-factory.ts +0 -574
  119. package/src/queen/index.ts +0 -94
  120. package/src/queen/mcp-execution-bridge.ts +0 -681
  121. package/src/queen/neural-learning.ts +0 -319
  122. package/src/queen/parallel-agent-engine.ts +0 -848
  123. package/src/queen/queen-memory-system.ts +0 -490
  124. package/src/queen/queen-memory.ts +0 -456
  125. package/src/queen/servicenow-queen.ts +0 -1029
  126. package/src/queen/types.ts +0 -87
  127. package/src/rollback/smart-rollback-system.ts +0 -866
  128. package/src/schemas/deployment.schema.json +0 -58
  129. package/src/schemas/flow.schema.json +0 -79
  130. package/src/schemas/widget.schema.json +0 -72
  131. package/src/snow-flow-system.ts +0 -541
  132. package/src/sparc/sparc-help.ts +0 -49
  133. package/src/sparc/team-sparc.ts +0 -88
  134. package/src/strategies/global-scope-strategy.ts +0 -736
  135. package/src/templates/base/application.template.json +0 -45
  136. package/src/templates/base/business_rule.template.json +0 -33
  137. package/src/templates/base/script_include.template.json +0 -18
  138. package/src/templates/base/table.template.json +0 -64
  139. package/src/templates/base/widget.template.json +0 -25
  140. package/src/templates/patterns/composite.incident-management.template.json +0 -140
  141. package/src/templates/patterns/widget.dashboard.template.json +0 -238
  142. package/src/templates/patterns/widget.datatable.template.json +0 -292
  143. package/src/testing/integration-test-suite.ts +0 -1276
  144. package/src/types/index.ts +0 -183
  145. package/src/types/neo4j-driver.d.ts +0 -23
  146. package/src/types/servicenow.types.ts +0 -307
  147. package/src/types/snow-flow.types.ts +0 -186
  148. package/src/types/todo.types.ts +0 -70
  149. package/src/utils/action-type-cache.ts +0 -286
  150. package/src/utils/agent-detector.ts +0 -573
  151. package/src/utils/artifact-tracker.ts +0 -379
  152. package/src/utils/dependency-detector.ts +0 -233
  153. package/src/utils/deployment-metadata-handler.ts +0 -518
  154. package/src/utils/error-recovery.ts +0 -680
  155. package/src/utils/logger.ts +0 -60
  156. package/src/utils/mcp-auth-middleware.ts +0 -262
  157. package/src/utils/mcp-config-manager.ts +0 -270
  158. package/src/utils/mcp-server-manager.ts +0 -446
  159. package/src/utils/mcp-tool-registry.ts +0 -298
  160. package/src/utils/migrate-snow-flow.ts +0 -98
  161. package/src/utils/oauth-html-templates.ts +0 -188
  162. package/src/utils/scope-utils.ts +0 -443
  163. package/src/utils/servicenow-client.ts +0 -3321
  164. package/src/utils/servicenow-id-generator.ts +0 -181
  165. package/src/utils/snow-memory-manager.ts +0 -605
  166. package/src/utils/snow-oauth.ts +0 -797
  167. package/src/utils/template-engine.ts +0 -463
  168. package/src/utils/theme-manager.ts +0 -295
  169. package/src/utils/unified-auth-store.ts +0 -222
  170. package/src/utils/update-set-importer.ts +0 -422
  171. package/src/utils/update-set-xml-packager.ts +0 -371
  172. package/src/utils/widget-template-generator.ts +0 -1744
  173. package/src/version.ts +0 -1950
@@ -1,1399 +0,0 @@
1
- /**
2
- * Queen Agent Core with Enhanced 403 Error Handling
3
- * Master coordinator that analyzes objectives and spawns specialized agents
4
- * Works through Claude Code interface using TodoWrite for task coordination
5
- * Now with intelligent 403 error handling using Gap Analysis Engine
6
- */
7
-
8
- import { EventEmitter } from 'eventemitter3';
9
- import { TodoItem, TodoStatus } from '../types/todo.types';
10
- import { ServiceNowTask, Agent, AgentType, TaskAnalysis, DeploymentPattern } from '../queen/types';
11
- import { QueenMemorySystem } from '../queen/queen-memory';
12
- import { AgentCoordinator } from './coordinator';
13
- import { ParallelAgentEngine, ParallelizationOpportunity } from '../queen/parallel-agent-engine';
14
- import { Queen403Handler } from './queen-403-handler';
15
- import { Logger } from '../utils/logger';
16
- import * as crypto from 'crypto';
17
-
18
- export interface QueenAgentConfig {
19
- memoryPath?: string;
20
- maxConcurrentAgents?: number;
21
- debugMode?: boolean;
22
- autoSpawn?: boolean;
23
- claudeCodeInterface?: boolean;
24
- mcpTools?: any; // MCP tools for Gap Analysis
25
- }
26
-
27
- export interface QueenObjective {
28
- id: string;
29
- description: string;
30
- priority?: 'low' | 'medium' | 'high' | 'critical';
31
- constraints?: string[];
32
- metadata?: Record<string, any>;
33
- }
34
-
35
- export interface TodoCoordination {
36
- objectiveId: string;
37
- todos: TodoItem[];
38
- agentAssignments: Map<string, string>; // todoId -> agentId
39
- dependencies: Map<string, string[]>; // todoId -> [dependencyIds]
40
- }
41
-
42
- export class QueenAgent extends EventEmitter {
43
- private memory: QueenMemorySystem;
44
- private coordinator: AgentCoordinator;
45
- private parallelEngine: ParallelAgentEngine;
46
- private handler403: Queen403Handler;
47
- private config: Required<QueenAgentConfig>;
48
- private activeObjectives: Map<string, QueenObjective>;
49
- private todoCoordinations: Map<string, TodoCoordination>;
50
- private activeAgents: Map<string, Agent>;
51
- private logger: Logger;
52
-
53
- constructor(config: QueenAgentConfig = {}) {
54
- super();
55
-
56
- this.config = {
57
- memoryPath: config.memoryPath,
58
- maxConcurrentAgents: config.maxConcurrentAgents || 8,
59
- debugMode: config.debugMode || false,
60
- autoSpawn: config.autoSpawn !== false,
61
- claudeCodeInterface: config.claudeCodeInterface !== false,
62
- mcpTools: config.mcpTools || {}
63
- };
64
-
65
- // Initialize logger first
66
- this.logger = new Logger('QueenAgent');
67
-
68
- // Initialize core systems
69
- this.memory = new QueenMemorySystem(this.config.memoryPath);
70
- this.coordinator = new AgentCoordinator(this.memory);
71
- this.parallelEngine = new ParallelAgentEngine(this.memory);
72
- this.handler403 = new Queen403Handler(this.logger, this.config.mcpTools);
73
- this.activeObjectives = new Map();
74
- this.todoCoordinations = new Map();
75
- this.activeAgents = new Map();
76
-
77
- this.setupEventHandlers();
78
-
79
- if (this.config.debugMode) {
80
- console.log('👑 Queen Agent initialized with Claude Code interface and 403 handling');
81
- }
82
- }
83
-
84
- /**
85
- * Update MCP tools configuration (useful when tools become available later)
86
- */
87
- updateMCPTools(mcpTools: any): void {
88
- this.config.mcpTools = mcpTools;
89
- this.handler403 = new Queen403Handler(this.logger, mcpTools);
90
- }
91
-
92
- /**
93
- * Analyze objective and create coordinated execution plan
94
- */
95
- async analyzeObjective(objective: string | QueenObjective): Promise<TaskAnalysis> {
96
- const queenObjective = typeof objective === 'string'
97
- ? { id: this.generateId('obj'), description: objective }
98
- : objective;
99
-
100
- this.activeObjectives.set(queenObjective.id, queenObjective);
101
- this.emit('objective:analyzing', queenObjective);
102
-
103
- try {
104
- // Analyze objective using memory patterns and neural learning
105
- const _analysis = await this.performObjectiveAnalysis(queenObjective);
106
-
107
- // Store _analysis in memory for coordination
108
- await this.memory.store(`analysis_${queenObjective.id}`, {
109
- objective: queenObjective,
110
- _analysis,
111
- timestamp: new Date().toISOString()
112
- });
113
-
114
- // Create TodoWrite coordination structure
115
- const todoCoordination = await this.createTodoCoordination(queenObjective, _analysis);
116
- this.todoCoordinations.set(queenObjective.id, todoCoordination);
117
-
118
- this.emit('objective:analyzed', { objective: queenObjective, _analysis, todos: todoCoordination.todos });
119
-
120
- return _analysis;
121
-
122
- } catch (error) {
123
- this.emit('objective:error', { objective: queenObjective, error });
124
- throw error;
125
- }
126
- }
127
-
128
- /**
129
- * Handle deployment error with intelligent 403 detection and resolution
130
- */
131
- async handleDeploymentError(error: any, context: {
132
- objectiveId: string;
133
- agentId?: string;
134
- operation: string;
135
- artifactType?: string;
136
- tableName?: string;
137
- }): Promise<boolean> {
138
- // Check if it's a 403 permission error
139
- if (this.is403Error(error)) {
140
- console.log('🚨 Queen Agent: Detected 403 permission error - activating intelligent _analysis');
141
-
142
- const objective = this.activeObjectives.get(context.objectiveId);
143
- if (!objective) {
144
- console.error('No objective found for error context');
145
- return false;
146
- }
147
-
148
- // Use 403 handler with Gap Analysis
149
- const result = await this.handler403.handle403Error({
150
- error,
151
- operation: context.operation,
152
- tableName: context.tableName,
153
- artifactType: context.artifactType,
154
- objective: objective.description
155
- });
156
-
157
- // Update todos based on analysis
158
- if (result.nextSteps.length > 0) {
159
- await this.updateTodosWithPermissionFixes(context.objectiveId, result);
160
- }
161
-
162
- // If automatic fixes were applied, return true to retry
163
- if (result.resolved) {
164
- console.log('✅ Queen Agent: Automatic fixes applied - suggesting retry');
165
- this.emit('permission:auto-fixed', { context, result });
166
- return true;
167
- }
168
-
169
- // Emit event for manual intervention needed
170
- this.emit('permission:manual-required', { context, result });
171
- return false;
172
- }
173
-
174
- return false;
175
- }
176
-
177
- /**
178
- * Check if error is a 403 permission error
179
- */
180
- private is403Error(error: any): boolean {
181
- const errorStr = error?.toString() || '';
182
- const errorMsg = error?.message || '';
183
- const statusCode = error?.status || error?.statusCode || error?.response?.status;
184
-
185
- return statusCode === 403 ||
186
- errorStr.includes('403') ||
187
- errorMsg.includes('403') ||
188
- errorMsg.includes('permission') ||
189
- errorMsg.includes('access denied') ||
190
- errorMsg.includes('insufficient privileges');
191
- }
192
-
193
- /**
194
- * Update todos with permission fix steps
195
- */
196
- private async updateTodosWithPermissionFixes(
197
- objectiveId: string,
198
- permissionResult: any
199
- ): Promise<void> {
200
- const todoCoordination = this.todoCoordinations.get(objectiveId);
201
- if (!todoCoordination) return;
202
-
203
- // Add new todos for permission fixes
204
- const newTodos: TodoItem[] = [];
205
-
206
- // Add retry todo if automatic fixes were applied
207
- if (permissionResult.resolved) {
208
- newTodos.push({
209
- id: this.generateId('todo'),
210
- content: '🔄 Retry deployment after automatic permission fixes',
211
- status: 'pending',
212
- priority: 'high'
213
- });
214
- }
215
-
216
- // Add manual action todos
217
- permissionResult.nextSteps.forEach((step: string) => {
218
- newTodos.push({
219
- id: this.generateId('todo'),
220
- content: step,
221
- status: 'pending',
222
- priority: 'high'
223
- });
224
- });
225
-
226
- // Insert new todos at the beginning of pending todos
227
- const pendingIndex = todoCoordination.todos.findIndex(t => t.status === 'pending');
228
- if (pendingIndex >= 0) {
229
- todoCoordination.todos.splice(pendingIndex, 0, ...newTodos);
230
- } else {
231
- todoCoordination.todos.push(...newTodos);
232
- }
233
-
234
- // Emit update event
235
- this.emit('todos:updated', { objectiveId, todos: todoCoordination.todos });
236
- }
237
-
238
- /**
239
- * Spawn agents based on objective requirements with intelligent parallelization
240
- */
241
- async spawnAgents(objectiveId: string): Promise<Agent[]> {
242
- const todoCoordination = this.todoCoordinations.get(objectiveId);
243
- if (!todoCoordination) {
244
- throw new Error(`No todo coordination found for objective: ${objectiveId}`);
245
- }
246
-
247
- const _analysis = await this.memory.get(`analysis_${objectiveId}`) as { _analysis: TaskAnalysis };
248
- if (!_analysis) {
249
- throw new Error(`No _analysis found for objective: ${objectiveId}`);
250
- }
251
-
252
- console.log('🧠 Queen Agent: Analyzing parallelization opportunities...');
253
-
254
- // 🚀 NEW: Detect parallelization opportunities
255
- const opportunities = await this.parallelEngine.detectParallelizationOpportunities(
256
- todoCoordination.todos,
257
- _analysis._analysis.type,
258
- Array.from(this.activeAgents.values())
259
- );
260
-
261
- if (opportunities.length > 0) {
262
- console.log(`🎯 Found ${opportunities.length} parallelization opportunities!`);
263
- return await this.spawnParallelAgents(objectiveId, todoCoordination, opportunities);
264
- } else {
265
- console.log('📋 No parallelization opportunities found, using sequential approach');
266
- return await this.spawnSequentialAgents(objectiveId, todoCoordination, _analysis._analysis);
267
- }
268
- }
269
-
270
- /**
271
- * 🚀 NEW: Spawn parallel agents based on opportunities
272
- */
273
- private async spawnParallelAgents(
274
- objectiveId: string,
275
- todoCoordination: TodoCoordination,
276
- opportunities: ParallelizationOpportunity[]
277
- ): Promise<Agent[]> {
278
- console.log('🚀 Queen Agent: Spawning parallel agent teams...');
279
-
280
- // Create execution plan
281
- const executionPlan = await this.parallelEngine.createExecutionPlan(
282
- opportunities,
283
- todoCoordination.todos,
284
- this.config.maxConcurrentAgents
285
- );
286
-
287
- // Execute the plan and get spawned agents
288
- const result = await this.parallelEngine.executeParallelPlan(
289
- executionPlan,
290
- async (type: AgentType, specialization?: string) => {
291
- return await this.spawnSpecializedAgent(type, objectiveId, specialization);
292
- }
293
- );
294
-
295
- console.log(`✅ Spawned ${result.spawnedAgents.length} specialized agents in parallel`);
296
- console.log(`⚡ Estimated speedup: ${result.executionDetails.estimatedSpeedup}`);
297
-
298
- return result.spawnedAgents;
299
- }
300
-
301
- /**
302
- * Fallback to sequential agent spawning
303
- */
304
- private async spawnSequentialAgents(
305
- objectiveId: string,
306
- todoCoordination: TodoCoordination,
307
- _analysis: TaskAnalysis
308
- ): Promise<Agent[]> {
309
- const agents: Agent[] = [];
310
- const requiredAgentTypes = new Set(_analysis.requiredAgents);
311
-
312
- // Spawn agents for each required type
313
- for (const agentType of requiredAgentTypes) {
314
- const agent = await this.spawnSpecializedAgent(agentType, objectiveId);
315
- agents.push(agent);
316
- }
317
-
318
- return agents;
319
- }
320
-
321
- /**
322
- * Spawn a specialized agent with optional specialization
323
- */
324
- private async spawnSpecializedAgent(
325
- type: AgentType,
326
- objectiveId: string,
327
- specialization?: string
328
- ): Promise<Agent> {
329
- const agentId = this.generateId('agent');
330
-
331
- const agent: Agent = {
332
- id: agentId,
333
- type,
334
- status: 'active',
335
- objectiveId,
336
- specialization,
337
- startTime: Date.now(),
338
- capabilities: [],
339
- mcpTools: []
340
- };
341
-
342
- this.activeAgents.set(agentId, agent);
343
-
344
- // Store agent info in memory for coordination
345
- await this.memory.store(`agent_${agentId}`, {
346
- agent,
347
- objective: this.activeObjectives.get(objectiveId),
348
- assignedTodos: [],
349
- status: 'initializing'
350
- });
351
-
352
- this.emit('agent:spawned', agent);
353
-
354
- // Assign todos to agent based on capabilities
355
- await this.assignTodosToAgent(agent, objectiveId);
356
-
357
- return agent;
358
- }
359
-
360
- /**
361
- * Analyze objective to determine requirements
362
- */
363
- private async performObjectiveAnalysis(objective: QueenObjective): Promise<TaskAnalysis> {
364
- const description = objective.description.toLowerCase();
365
-
366
- // Determine task type
367
- let type: ServiceNowTask['type'] = 'unknown';
368
- let requiredAgents: AgentType[] = [];
369
- let estimatedComplexity = 5;
370
- let suggestedPattern: DeploymentPattern = {
371
- taskType: 'standard',
372
- successRate: 0.8,
373
- agentSequence: [],
374
- mcpSequence: [],
375
- avgDuration: 300,
376
- lastUsed: new Date()
377
- };
378
- const dependencies: string[] = [];
379
-
380
- // Portal page detection - check for specific page keywords
381
- if ((description.includes('portal') && description.includes('page')) ||
382
- description.includes('portal page') ||
383
- (description.includes('widget') && description.includes('page')) ||
384
- (description.includes('widget') && description.includes('plaats')) ||
385
- (description.includes('widget') && description.includes('add')) ||
386
- description.includes('service portal page')) {
387
- type = 'portal_page';
388
- requiredAgents = ['widget-creator', 'page-designer', 'script-writer', 'tester'];
389
- if (description.includes('dashboard') || description.includes('multi')) {
390
- estimatedComplexity = 8;
391
- requiredAgents.push('ui-ux-specialist');
392
- }
393
- }
394
- // Widget development detection (only if not portal page)
395
- else if (description.includes('widget') || description.includes('ui component')) {
396
- type = 'widget';
397
- requiredAgents = ['widget-creator', 'script-writer', 'tester'];
398
- if (description.includes('complex') || description.includes('interactive')) {
399
- estimatedComplexity = 8;
400
- requiredAgents.push('ui-ux-specialist');
401
- }
402
- }
403
-
404
- // Flow development detection
405
- else if (description.includes('flow') || description.includes('workflow') || description.includes('automation')) {
406
- type = 'flow';
407
- requiredAgents = ['flow-builder', 'integration-specialist', 'tester'];
408
- if (description.includes('approval')) {
409
- requiredAgents.push('approval-specialist');
410
- dependencies.push('user_management', 'notification_system');
411
- }
412
- }
413
-
414
- // Application development
415
- else if (description.includes('application') || description.includes('app') || description.includes('complete solution')) {
416
- type = 'application';
417
- requiredAgents = ['app-architect', 'widget-creator', 'flow-builder', 'script-writer', 'tester'];
418
- estimatedComplexity = 10;
419
- suggestedPattern = {
420
- taskType: 'modular',
421
- successRate: 0.8,
422
- agentSequence: requiredAgents,
423
- mcpSequence: [],
424
- avgDuration: 900,
425
- lastUsed: new Date()
426
- };
427
- }
428
-
429
- // Script development
430
- else if (description.includes('script') || description.includes('business rule') || description.includes('api')) {
431
- type = 'script';
432
- requiredAgents = ['script-writer', 'tester'];
433
- if (description.includes('integration')) {
434
- requiredAgents.push('integration-specialist');
435
- }
436
- }
437
-
438
- // Integration development
439
- else if (description.includes('integration') || description.includes('connect') || description.includes('external')) {
440
- type = 'integration';
441
- requiredAgents = ['integration-specialist', 'script-writer', 'tester'];
442
- dependencies.push('authentication', 'data_transformation');
443
- }
444
-
445
- // Add security agent if mentioned
446
- if (description.includes('secure') || description.includes('security') || description.includes('permission')) {
447
- requiredAgents.push('security-specialist');
448
- }
449
-
450
- return {
451
- type,
452
- complexity: estimatedComplexity.toString(),
453
- requiredAgents: [...new Set(requiredAgents)], // Remove duplicates
454
- estimatedComplexity: Math.min(10, Math.max(1, estimatedComplexity)),
455
- suggestedPattern,
456
- dependencies
457
- };
458
- }
459
-
460
- /**
461
- * Create todo coordination structure for Claude Code interface
462
- */
463
- private async createTodoCoordination(
464
- objective: QueenObjective,
465
- _analysis: TaskAnalysis
466
- ): Promise<TodoCoordination> {
467
- const todos = this.generateTodosForObjective(objective, _analysis);
468
-
469
- const coordination: TodoCoordination = {
470
- objectiveId: objective.id,
471
- todos,
472
- agentAssignments: new Map(),
473
- dependencies: this.analyzeTodoDependencies(todos)
474
- };
475
-
476
- // Store coordination info in memory
477
- await this.memory.store(`coordination_${objective.id}`, coordination);
478
-
479
- return coordination;
480
- }
481
-
482
- /**
483
- * Generate todos based on objective type
484
- */
485
- private generateTodosForObjective(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
486
- const baseTodos: TodoItem[] = [
487
- {
488
- id: this.generateId('todo'),
489
- content: `Initialize swarm memory session for: ${objective.description}`,
490
- status: 'pending',
491
- priority: 'high'
492
- },
493
- {
494
- id: this.generateId('todo'),
495
- content: 'Validate ServiceNow authentication and permissions',
496
- status: 'pending',
497
- priority: 'high'
498
- },
499
- {
500
- id: this.generateId('todo'),
501
- content: 'Check for existing similar artifacts',
502
- status: 'pending',
503
- priority: 'medium'
504
- },
505
- {
506
- id: this.generateId('todo'),
507
- content: 'Create Update Set for tracking changes',
508
- status: 'pending',
509
- priority: 'high'
510
- }
511
- ];
512
-
513
- // Add type-specific todos
514
- switch (_analysis.type) {
515
- case 'widget':
516
- baseTodos.push(...this.createWidgetTodos(objective, _analysis));
517
- break;
518
- case 'portal_page':
519
- baseTodos.push(...this.createPortalPageTodos(objective, _analysis));
520
- break;
521
- case 'flow':
522
- baseTodos.push(...this.createFlowTodos(objective, _analysis));
523
- break;
524
- case 'application':
525
- baseTodos.push(...this.createApplicationTodos(objective, _analysis));
526
- break;
527
- case 'script':
528
- baseTodos.push(...this.createScriptTodos(objective, _analysis));
529
- break;
530
- case 'integration':
531
- baseTodos.push(...this.createIntegrationTodos(objective, _analysis));
532
- break;
533
- default:
534
- baseTodos.push(...this.createGenericTodos(objective, _analysis));
535
- }
536
-
537
- // Add final todos
538
- baseTodos.push(
539
- {
540
- id: this.generateId('todo'),
541
- content: 'Validate solution completeness',
542
- status: 'pending',
543
- priority: 'high'
544
- },
545
- {
546
- id: this.generateId('todo'),
547
- content: 'Generate documentation and handoff materials',
548
- status: 'pending',
549
- priority: 'medium'
550
- }
551
- );
552
-
553
- return baseTodos;
554
- }
555
-
556
- /**
557
- * Create widget-specific todos
558
- */
559
- private createWidgetTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
560
- // 🚀 ENHANCED: More specific todos to trigger parallel agent specialization
561
- const todos: TodoItem[] = [
562
- {
563
- id: this.generateId('todo'),
564
- content: `Analyze portal requirements and user experience design: ${objective.description}`,
565
- status: 'pending',
566
- priority: 'high'
567
- },
568
- {
569
- id: this.generateId('todo'),
570
- content: 'Create widget HTML structure with responsive design and accessibility features',
571
- status: 'pending',
572
- priority: 'high'
573
- },
574
- {
575
- id: this.generateId('todo'),
576
- content: 'Develop server-side script for backend data processing and API integration',
577
- status: 'pending',
578
- priority: 'high'
579
- },
580
- {
581
- id: this.generateId('todo'),
582
- content: 'Build client-side controller with interactive features and event handling',
583
- status: 'pending',
584
- priority: 'high'
585
- },
586
- {
587
- id: this.generateId('todo'),
588
- content: 'Style widget with CSS including responsive design and theme compliance',
589
- status: 'pending',
590
- priority: 'high'
591
- },
592
- {
593
- id: this.generateId('todo'),
594
- content: 'Implement performance optimization and caching strategies',
595
- status: 'pending',
596
- priority: 'medium'
597
- },
598
- {
599
- id: this.generateId('todo'),
600
- content: 'Test widget functionality including cross-browser and mobile testing',
601
- status: 'pending',
602
- priority: 'high'
603
- },
604
- {
605
- id: this.generateId('todo'),
606
- content: 'Ensure security best practices and vulnerability scanning',
607
- status: 'pending',
608
- priority: 'high'
609
- }
610
- ];
611
-
612
- return todos;
613
- }
614
-
615
- /**
616
- * Create portal page-specific todos
617
- */
618
- private createPortalPageTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
619
- const todos: TodoItem[] = [
620
- {
621
- id: this.generateId('todo'),
622
- content: `Analyze portal page requirements: ${objective.description}`,
623
- status: 'pending',
624
- priority: 'high'
625
- },
626
- {
627
- id: this.generateId('todo'),
628
- content: 'Create or identify widget to be placed on the page',
629
- status: 'pending',
630
- priority: 'high'
631
- },
632
- {
633
- id: this.generateId('todo'),
634
- content: 'Design portal page layout (single column, multi-column, or with sidebar)',
635
- status: 'pending',
636
- priority: 'high'
637
- },
638
- {
639
- id: this.generateId('todo'),
640
- content: 'Determine target portal (Service Portal or Employee Service Center)',
641
- status: 'pending',
642
- priority: 'medium'
643
- },
644
- {
645
- id: this.generateId('todo'),
646
- content: 'Create portal page with proper page ID and title',
647
- status: 'pending',
648
- priority: 'high'
649
- },
650
- {
651
- id: this.generateId('todo'),
652
- content: 'Configure page structure (containers, rows, columns)',
653
- status: 'pending',
654
- priority: 'high'
655
- },
656
- {
657
- id: this.generateId('todo'),
658
- content: 'Place widget instance on the portal page with proper sizing',
659
- status: 'pending',
660
- priority: 'high'
661
- },
662
- {
663
- id: this.generateId('todo'),
664
- content: 'Apply custom CSS styling for page layout and responsiveness',
665
- status: 'pending',
666
- priority: 'medium'
667
- },
668
- {
669
- id: this.generateId('todo'),
670
- content: 'Configure page permissions and accessibility settings',
671
- status: 'pending',
672
- priority: 'medium'
673
- },
674
- {
675
- id: this.generateId('todo'),
676
- content: 'Test portal page across different devices and browsers',
677
- status: 'pending',
678
- priority: 'high'
679
- },
680
- {
681
- id: this.generateId('todo'),
682
- content: 'Add page to portal navigation menu if needed',
683
- status: 'pending',
684
- priority: 'low'
685
- }
686
- ];
687
-
688
- return todos;
689
- }
690
-
691
- /**
692
- * Create flow-specific todos
693
- */
694
- private createFlowTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
695
- const todos: TodoItem[] = [
696
- {
697
- id: this.generateId('todo'),
698
- content: `Analyze flow requirements: ${objective.description}`,
699
- status: 'pending',
700
- priority: 'high'
701
- },
702
- {
703
- id: this.generateId('todo'),
704
- content: 'Design flow trigger conditions and events',
705
- status: 'pending',
706
- priority: 'high'
707
- },
708
- {
709
- id: this.generateId('todo'),
710
- content: 'Map out flow steps and decision points',
711
- status: 'pending',
712
- priority: 'high'
713
- },
714
- {
715
- id: this.generateId('todo'),
716
- content: 'Configure flow actions and integrations',
717
- status: 'pending',
718
- priority: 'medium'
719
- },
720
- {
721
- id: this.generateId('todo'),
722
- content: 'Set up data transformations and variables',
723
- status: 'pending',
724
- priority: 'medium'
725
- },
726
- {
727
- id: this.generateId('todo'),
728
- content: 'Create flow using natural language API',
729
- status: 'pending',
730
- priority: 'high'
731
- },
732
- {
733
- id: this.generateId('todo'),
734
- content: 'Test flow with mock data scenarios',
735
- status: 'pending',
736
- priority: 'high'
737
- }
738
- ];
739
-
740
- return todos;
741
- }
742
-
743
- /**
744
- * Create application-specific todos
745
- */
746
- private createApplicationTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
747
- const todos: TodoItem[] = [
748
- {
749
- id: this.generateId('todo'),
750
- content: `Design application architecture: ${objective.description}`,
751
- status: 'pending',
752
- priority: 'high'
753
- },
754
- {
755
- id: this.generateId('todo'),
756
- content: 'Create application scope and structure',
757
- status: 'pending',
758
- priority: 'high'
759
- },
760
- {
761
- id: this.generateId('todo'),
762
- content: 'Design data model and tables',
763
- status: 'pending',
764
- priority: 'high'
765
- },
766
- {
767
- id: this.generateId('todo'),
768
- content: 'Create UI components and widgets',
769
- status: 'pending',
770
- priority: 'high'
771
- },
772
- {
773
- id: this.generateId('todo'),
774
- content: 'Implement business logic and workflows',
775
- status: 'pending',
776
- priority: 'high'
777
- },
778
- {
779
- id: this.generateId('todo'),
780
- content: 'Configure security and access controls',
781
- status: 'pending',
782
- priority: 'high'
783
- },
784
- {
785
- id: this.generateId('todo'),
786
- content: 'Create integration points',
787
- status: 'pending',
788
- priority: 'medium'
789
- },
790
- {
791
- id: this.generateId('todo'),
792
- content: 'Test application end-to-end',
793
- status: 'pending',
794
- priority: 'high'
795
- }
796
- ];
797
-
798
- return todos;
799
- }
800
-
801
- /**
802
- * Create script-specific todos
803
- */
804
- private createScriptTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
805
- const todos: TodoItem[] = [
806
- {
807
- id: this.generateId('todo'),
808
- content: `Analyze script requirements: ${objective.description}`,
809
- status: 'pending',
810
- priority: 'high'
811
- },
812
- {
813
- id: this.generateId('todo'),
814
- content: 'Design script logic and error handling',
815
- status: 'pending',
816
- priority: 'high'
817
- },
818
- {
819
- id: this.generateId('todo'),
820
- content: 'Implement core functionality',
821
- status: 'pending',
822
- priority: 'high'
823
- },
824
- {
825
- id: this.generateId('todo'),
826
- content: 'Add logging and debugging capabilities',
827
- status: 'pending',
828
- priority: 'medium'
829
- },
830
- {
831
- id: this.generateId('todo'),
832
- content: 'Optimize performance',
833
- status: 'pending',
834
- priority: 'medium'
835
- },
836
- {
837
- id: this.generateId('todo'),
838
- content: 'Create unit tests',
839
- status: 'pending',
840
- priority: 'high'
841
- },
842
- {
843
- id: this.generateId('todo'),
844
- content: 'Deploy and validate in ServiceNow',
845
- status: 'pending',
846
- priority: 'high'
847
- }
848
- ];
849
-
850
- return todos;
851
- }
852
-
853
- /**
854
- * Create integration-specific todos
855
- */
856
- private createIntegrationTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
857
- const todos: TodoItem[] = [
858
- {
859
- id: this.generateId('todo'),
860
- content: `Analyze integration requirements: ${objective.description}`,
861
- status: 'pending',
862
- priority: 'high'
863
- },
864
- {
865
- id: this.generateId('todo'),
866
- content: 'Identify external systems and APIs',
867
- status: 'pending',
868
- priority: 'high'
869
- },
870
- {
871
- id: this.generateId('todo'),
872
- content: 'Design data mapping and transformation',
873
- status: 'pending',
874
- priority: 'high'
875
- },
876
- {
877
- id: this.generateId('todo'),
878
- content: 'Configure authentication and security',
879
- status: 'pending',
880
- priority: 'high'
881
- },
882
- {
883
- id: this.generateId('todo'),
884
- content: 'Create REST/SOAP message configurations',
885
- status: 'pending',
886
- priority: 'medium'
887
- },
888
- {
889
- id: this.generateId('todo'),
890
- content: 'Implement error handling and retry logic',
891
- status: 'pending',
892
- priority: 'medium'
893
- },
894
- {
895
- id: this.generateId('todo'),
896
- content: 'Test integration with mock endpoints',
897
- status: 'pending',
898
- priority: 'high'
899
- },
900
- {
901
- id: this.generateId('todo'),
902
- content: 'Deploy and monitor integration',
903
- status: 'pending',
904
- priority: 'high'
905
- }
906
- ];
907
-
908
- return todos;
909
- }
910
-
911
- /**
912
- * Create generic todos for unknown task types
913
- */
914
- private createGenericTodos(objective: QueenObjective, _analysis: TaskAnalysis): TodoItem[] {
915
- const todos: TodoItem[] = [
916
- {
917
- id: this.generateId('todo'),
918
- content: `Analyze requirements: ${objective.description}`,
919
- status: 'pending',
920
- priority: 'high'
921
- },
922
- {
923
- id: this.generateId('todo'),
924
- content: 'Research existing ServiceNow capabilities',
925
- status: 'pending',
926
- priority: 'high'
927
- },
928
- {
929
- id: this.generateId('todo'),
930
- content: 'Design solution architecture',
931
- status: 'pending',
932
- priority: 'high'
933
- },
934
- {
935
- id: this.generateId('todo'),
936
- content: 'Implement core functionality',
937
- status: 'pending',
938
- priority: 'high'
939
- },
940
- {
941
- id: this.generateId('todo'),
942
- content: 'Create necessary configurations',
943
- status: 'pending',
944
- priority: 'medium'
945
- },
946
- {
947
- id: this.generateId('todo'),
948
- content: 'Test solution thoroughly',
949
- status: 'pending',
950
- priority: 'high'
951
- },
952
- {
953
- id: this.generateId('todo'),
954
- content: 'Deploy to ServiceNow',
955
- status: 'pending',
956
- priority: 'high'
957
- },
958
- {
959
- id: this.generateId('todo'),
960
- content: 'Monitor and validate deployment',
961
- status: 'pending',
962
- priority: 'medium'
963
- }
964
- ];
965
-
966
- return todos;
967
- }
968
-
969
- /**
970
- * Analyze todo dependencies
971
- */
972
- private analyzeTodoDependencies(todos: TodoItem[]): Map<string, string[]> {
973
- const dependencies = new Map<string, string[]>();
974
-
975
- // Simple dependency _analysis - each todo depends on all previous high priority todos
976
- const highPriorityTodos = todos.filter(t => t.priority === 'high');
977
-
978
- highPriorityTodos.forEach((todo, index) => {
979
- if (index > 0) {
980
- const prevHighPriorityIds = highPriorityTodos
981
- .slice(0, index)
982
- .map(t => t.id);
983
- dependencies.set(todo.id, prevHighPriorityIds);
984
- }
985
- });
986
-
987
- return dependencies;
988
- }
989
-
990
- /**
991
- * Assign todos to agent based on capabilities
992
- */
993
- private async assignTodosToAgent(agent: Agent, objectiveId: string): Promise<void> {
994
- const todoCoordination = this.todoCoordinations.get(objectiveId);
995
- if (!todoCoordination) return;
996
-
997
- const unassignedTodos = todoCoordination.todos.filter(todo =>
998
- !Array.from(todoCoordination.agentAssignments.values()).includes(todo.id) &&
999
- todo.status === 'pending'
1000
- );
1001
-
1002
- // Assign todos based on agent type and specialization
1003
- const assignableTodos = unassignedTodos.filter(todo =>
1004
- this.canAgentHandleTodo(agent, todo)
1005
- );
1006
-
1007
- for (const todo of assignableTodos) {
1008
- todoCoordination.agentAssignments.set(todo.id, agent.id);
1009
-
1010
- // Update agent's assigned todos in memory
1011
- const agentData = await this.memory.get(`agent_${agent.id}`) as any;
1012
- if (agentData) {
1013
- agentData.assignedTodos.push(todo.id);
1014
- await this.memory.store(`agent_${agent.id}`, agentData);
1015
- }
1016
- }
1017
-
1018
- this.emit('todos:assigned', { agent, todos: assignableTodos });
1019
- }
1020
-
1021
- /**
1022
- * Check if agent can handle specific todo
1023
- */
1024
- private canAgentHandleTodo(agent: Agent, todo: TodoItem): boolean {
1025
- const todoContent = todo.content.toLowerCase();
1026
-
1027
- switch (agent.type) {
1028
- case 'widget-creator':
1029
- return todoContent.includes('widget') ||
1030
- todoContent.includes('html') ||
1031
- todoContent.includes('portal') ||
1032
- todoContent.includes('ui');
1033
-
1034
- case 'css-specialist':
1035
- return todoContent.includes('style') ||
1036
- todoContent.includes('css') ||
1037
- todoContent.includes('responsive') ||
1038
- todoContent.includes('theme');
1039
-
1040
- case 'backend-specialist':
1041
- return todoContent.includes('server') ||
1042
- todoContent.includes('backend') ||
1043
- todoContent.includes('data') ||
1044
- todoContent.includes('api');
1045
-
1046
- case 'frontend-specialist':
1047
- return todoContent.includes('client') ||
1048
- todoContent.includes('controller') ||
1049
- todoContent.includes('interactive') ||
1050
- todoContent.includes('event');
1051
-
1052
- case 'flow-builder':
1053
- return todoContent.includes('flow') ||
1054
- todoContent.includes('workflow') ||
1055
- todoContent.includes('trigger') ||
1056
- todoContent.includes('action');
1057
-
1058
- case 'script-writer':
1059
- return todoContent.includes('script') ||
1060
- todoContent.includes('logic') ||
1061
- todoContent.includes('function');
1062
-
1063
- case 'integration-specialist':
1064
- return todoContent.includes('integration') ||
1065
- todoContent.includes('external') ||
1066
- todoContent.includes('api') ||
1067
- todoContent.includes('rest');
1068
-
1069
- case 'tester':
1070
- return todoContent.includes('test') ||
1071
- todoContent.includes('validate') ||
1072
- todoContent.includes('verify');
1073
-
1074
- case 'security-specialist':
1075
- return todoContent.includes('security') ||
1076
- todoContent.includes('permission') ||
1077
- todoContent.includes('access') ||
1078
- todoContent.includes('vulnerability');
1079
-
1080
- case 'performance-specialist':
1081
- return todoContent.includes('performance') ||
1082
- todoContent.includes('optimization') ||
1083
- todoContent.includes('caching');
1084
-
1085
- case 'ui-ux-specialist':
1086
- return todoContent.includes('user experience') ||
1087
- todoContent.includes('design') ||
1088
- todoContent.includes('ux');
1089
-
1090
- case 'page-designer':
1091
- return todoContent.includes('portal page') ||
1092
- todoContent.includes('page layout') ||
1093
- todoContent.includes('page structure') ||
1094
- todoContent.includes('place widget') ||
1095
- todoContent.includes('configure page') ||
1096
- todoContent.includes('containers') ||
1097
- todoContent.includes('rows') ||
1098
- todoContent.includes('columns') ||
1099
- todoContent.includes('page permissions') ||
1100
- todoContent.includes('portal navigation');
1101
-
1102
- default:
1103
- // Generic agents can handle setup and coordination tasks
1104
- return todoContent.includes('initialize') ||
1105
- todoContent.includes('validate') ||
1106
- todoContent.includes('create update set') ||
1107
- todoContent.includes('documentation');
1108
- }
1109
- }
1110
-
1111
- /**
1112
- * Monitor agent progress through todo updates
1113
- */
1114
- async monitorProgress(objectiveId: string): Promise<{
1115
- overall: number;
1116
- byAgent: Map<string, number>;
1117
- blockingIssues: string[];
1118
- estimatedCompletion: Date;
1119
- }> {
1120
- const todoCoordination = this.todoCoordinations.get(objectiveId);
1121
- if (!todoCoordination) {
1122
- throw new Error(`No todo coordination found for objective: ${objectiveId}`);
1123
- }
1124
-
1125
- // Calculate progress from todos
1126
- const completedTodos = todoCoordination.todos.filter(t => t.status === 'completed').length;
1127
- const totalTodos = todoCoordination.todos.length;
1128
- const overallProgress = totalTodos > 0 ? (completedTodos / totalTodos) * 100 : 0;
1129
-
1130
- // Calculate per-agent progress
1131
- const byAgent = new Map<string, number>();
1132
- for (const [todoId, agentId] of todoCoordination.agentAssignments) {
1133
- const agentTodos = Array.from(todoCoordination.agentAssignments.entries())
1134
- .filter(([_, aid]) => aid === agentId);
1135
- const agentCompleted = agentTodos.filter(([tid, _]) =>
1136
- todoCoordination.todos.find(t => t.id === tid)?.status === 'completed'
1137
- ).length;
1138
- const agentProgress = agentTodos.length > 0 ? (agentCompleted / agentTodos.length) * 100 : 0;
1139
- byAgent.set(agentId, agentProgress);
1140
- }
1141
-
1142
- // Identify blocking issues
1143
- const blockingIssues = await this.identifyBlockingIssues(todoCoordination);
1144
-
1145
- // Estimate completion based on current velocity
1146
- const estimatedCompletion = this.estimateCompletion(todoCoordination, overallProgress);
1147
-
1148
- // Store progress in memory
1149
- await this.memory.store(`progress_${objectiveId}`, {
1150
- overall: overallProgress,
1151
- byAgent: Object.fromEntries(byAgent),
1152
- blockingIssues,
1153
- estimatedCompletion: estimatedCompletion.toISOString(),
1154
- timestamp: new Date().toISOString()
1155
- });
1156
-
1157
- this.emit('progress:updated', { objectiveId, overall: overallProgress, byAgent, blockingIssues });
1158
-
1159
- return {
1160
- overall: overallProgress,
1161
- byAgent,
1162
- blockingIssues,
1163
- estimatedCompletion
1164
- };
1165
- }
1166
-
1167
- /**
1168
- * Make memory-driven decisions based on past patterns
1169
- */
1170
- async makeDecision(context: {
1171
- objective: string;
1172
- currentState: any;
1173
- options: string[];
1174
- }): Promise<{
1175
- decision: string;
1176
- confidence: number;
1177
- reasoning: string;
1178
- }> {
1179
- // Query memory for similar past decisions
1180
- const similarPatterns = await this.memory.findSimilarPatterns(context.objective);
1181
-
1182
- // Analyze success rates of past decisions
1183
- const successRates = new Map<string, number>();
1184
- for (const option of context.options) {
1185
- const pastOutcomes = similarPatterns.filter(p => p.decision === option);
1186
- const successRate = pastOutcomes.length > 0
1187
- ? pastOutcomes.filter(p => p.outcome === 'success').length / pastOutcomes.length
1188
- : 0.5; // Default to 50% if no history
1189
- successRates.set(option, successRate);
1190
- }
1191
-
1192
- // Choose option with highest success rate
1193
- let bestOption = context.options[0];
1194
- let highestRate = 0;
1195
-
1196
- for (const [option, rate] of successRates) {
1197
- if (rate > highestRate) {
1198
- highestRate = rate;
1199
- bestOption = option;
1200
- }
1201
- }
1202
-
1203
- const confidence = highestRate > 0.7 ? 0.9 : highestRate > 0.5 ? 0.7 : 0.5;
1204
-
1205
- const decision = {
1206
- decision: bestOption,
1207
- confidence,
1208
- reasoning: `Based on ${similarPatterns.length} similar past scenarios, "${bestOption}" has a ${(highestRate * 100).toFixed(0)}% success rate.`
1209
- };
1210
-
1211
- // Store decision for future learning
1212
- await this.memory.storeDecision('decision', {
1213
- context,
1214
- decision: decision.decision,
1215
- confidence: decision.confidence,
1216
- timestamp: new Date().toISOString()
1217
- });
1218
-
1219
- this.emit('decision:made', decision);
1220
-
1221
- return decision;
1222
- }
1223
-
1224
- /**
1225
- * Setup event handlers for coordination
1226
- */
1227
- private setupEventHandlers(): void {
1228
- // Handle agent lifecycle events
1229
- this.coordinator.on('agent:ready', async (data) => {
1230
- console.log(`✅ Agent ${data.agentId} ready for tasks`);
1231
- await this.assignTodosToAgent(
1232
- this.activeAgents.get(data.agentId)!,
1233
- data.objectiveId
1234
- );
1235
- });
1236
-
1237
- this.coordinator.on('agent:completed', async (data) => {
1238
- console.log(`✅ Agent ${data.agentId} completed all tasks`);
1239
- this.activeAgents.delete(data.agentId);
1240
-
1241
- // Check if we need to spawn more agents
1242
- if (this.config.autoSpawn) {
1243
- await this.checkAndSpawnAgents(data.objectiveId);
1244
- }
1245
- });
1246
-
1247
- this.coordinator.on('agent:error', async (data) => {
1248
- console.error(`❌ Agent ${data.agentId} encountered error:`, data.error);
1249
-
1250
- // Handle 403 errors specifically
1251
- if (this.is403Error(data.error)) {
1252
- const handled = await this.handleDeploymentError(data.error, {
1253
- objectiveId: data.objectiveId,
1254
- agentId: data.agentId,
1255
- operation: 'deployment',
1256
- artifactType: data.artifactType
1257
- });
1258
-
1259
- if (handled) {
1260
- // Retry the agent's task
1261
- this.emit('agent:retry', data);
1262
- }
1263
- }
1264
- });
1265
- }
1266
-
1267
- /**
1268
- * Check if more agents need to be spawned
1269
- */
1270
- private async checkAndSpawnAgents(objectiveId: string): Promise<void> {
1271
- const todoCoordination = this.todoCoordinations.get(objectiveId);
1272
- if (!todoCoordination) return;
1273
-
1274
- const unassignedTodos = todoCoordination.todos.filter(todo =>
1275
- !Array.from(todoCoordination.agentAssignments.values()).includes(todo.id) &&
1276
- todo.status === 'pending'
1277
- );
1278
-
1279
- if (unassignedTodos.length > 0 && this.activeAgents.size < this.config.maxConcurrentAgents) {
1280
- // Spawn additional agents if needed
1281
- await this.spawnAgents(objectiveId);
1282
- }
1283
- }
1284
-
1285
- /**
1286
- * Handle coordination errors
1287
- */
1288
- private async handleCoordinationError(error: any, context: any): Promise<void> {
1289
- console.error('❌ Coordination error:', error);
1290
-
1291
- // Store error in memory for learning - using store method
1292
- await this.memory.store('error', {
1293
- error: error.message || error,
1294
- context,
1295
- timestamp: new Date().toISOString(),
1296
- recovery: null
1297
- });
1298
-
1299
- this.emit('coordination:error', { error, context });
1300
- }
1301
-
1302
- /**
1303
- * Identify blocking issues from todos
1304
- */
1305
- private async identifyBlockingIssues(todoCoordination: TodoCoordination): Promise<string[]> {
1306
- const issues: string[] = [];
1307
-
1308
- // Check for failed todos
1309
- const failedTodos = todoCoordination.todos.filter(t => t.status === 'failed' as TodoStatus);
1310
- if (failedTodos.length > 0) {
1311
- issues.push(`${failedTodos.length} failed tasks blocking progress`);
1312
- }
1313
-
1314
- // Check for stuck in-progress todos (older than 10 minutes)
1315
- const stuckTodos = todoCoordination.todos.filter(t => {
1316
- if (t.status !== 'in_progress') return false;
1317
- const todoData = this.memory.get(`todo_${t.id}`) as any;
1318
- if (!todoData || !todoData.startTime) return false;
1319
- return Date.now() - todoData.startTime > 10 * 60 * 1000; // 10 minutes
1320
- });
1321
-
1322
- if (stuckTodos.length > 0) {
1323
- issues.push(`${stuckTodos.length} tasks stuck in progress`);
1324
- }
1325
-
1326
- // Check for dependency bottlenecks
1327
- const pendingWithDeps = todoCoordination.todos.filter(t =>
1328
- t.status === 'pending' &&
1329
- todoCoordination.dependencies.has(t.id)
1330
- );
1331
-
1332
- for (const todo of pendingWithDeps) {
1333
- const deps = todoCoordination.dependencies.get(todo.id) || [];
1334
- const incompleteDeps = deps.filter(depId => {
1335
- const depTodo = todoCoordination.todos.find(t => t.id === depId);
1336
- return depTodo && depTodo.status !== 'completed';
1337
- });
1338
-
1339
- if (incompleteDeps.length === deps.length) {
1340
- issues.push(`Task "${todo.content}" blocked by dependencies`);
1341
- }
1342
- }
1343
-
1344
- return issues;
1345
- }
1346
-
1347
- /**
1348
- * Estimate completion time based on current progress
1349
- */
1350
- private estimateCompletion(todoCoordination: TodoCoordination, currentProgress: number): Date {
1351
- if (currentProgress === 0) {
1352
- return new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours if no progress
1353
- }
1354
-
1355
- const completedTodos = todoCoordination.todos.filter(t => t.status === 'completed').length;
1356
- const startTime = this.activeObjectives.get(todoCoordination.objectiveId)?.metadata?.startTime || Date.now();
1357
- const elapsedTime = Date.now() - startTime;
1358
-
1359
- const averageTimePerTodo = elapsedTime / completedTodos;
1360
- const remainingTodos = todoCoordination.todos.filter(t => t.status !== 'completed').length;
1361
- const estimatedRemainingTime = averageTimePerTodo * remainingTodos;
1362
-
1363
- return new Date(Date.now() + estimatedRemainingTime);
1364
- }
1365
-
1366
- /**
1367
- * Generate unique ID for entities
1368
- */
1369
- private generateId(prefix: string): string {
1370
- return `${prefix}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
1371
- }
1372
-
1373
- /**
1374
- * Shutdown queen agent gracefully
1375
- */
1376
- async shutdown(): Promise<void> {
1377
- console.log('👑 Queen Agent shutting down...');
1378
-
1379
- // Save current state
1380
- for (const [objectiveId, objective] of this.activeObjectives) {
1381
- await this.memory.store(`objective_state_${objectiveId}`, {
1382
- objective,
1383
- todoCoordination: this.todoCoordinations.get(objectiveId),
1384
- activeAgents: Array.from(this.activeAgents.values()).filter(a => a.objectiveId === objectiveId),
1385
- timestamp: new Date().toISOString()
1386
- });
1387
- }
1388
-
1389
- // Notify all active agents
1390
- for (const agent of this.activeAgents.values()) {
1391
- this.emit('agent:shutdown', agent);
1392
- }
1393
-
1394
- await this.memory.close();
1395
- this.removeAllListeners();
1396
-
1397
- console.log('✅ Queen Agent shutdown complete');
1398
- }
1399
- }