nova-terminal-assistant 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/nova.js +15 -7
- package/dist/agents/AgentOrchestrator.js +357 -0
- package/dist/agents/index.js +4 -0
- package/dist/audit/AuditLogger.js +356 -0
- package/{src/audit/index.ts → dist/audit/index.js} +0 -7
- package/dist/auth/AuthManager.js +119 -0
- package/dist/auth/index.js +1 -0
- package/dist/commands/SmartCompletion.js +376 -0
- package/dist/config/ConfigManager.js +1196 -0
- package/{src/config/index.ts → dist/config/index.js} +1 -1
- package/dist/context/ContextBuilder.js +131 -0
- package/dist/context/ContextCompressor.js +450 -0
- package/dist/context/LayeredMemoryManager.js +504 -0
- package/dist/context/MemoryDiscovery.js +145 -0
- package/{src/context/defaultSystemPrompt.ts → dist/context/defaultSystemPrompt.js} +8 -20
- package/dist/context/index.js +4 -0
- package/dist/extensions/SkillGenerator.js +322 -0
- package/dist/extensions/SkillInstaller.js +215 -0
- package/dist/extensions/SkillRegistry.js +262 -0
- package/dist/extensions/SkillValidator.js +448 -0
- package/{src/extensions/index.ts → dist/extensions/index.js} +0 -8
- package/{src/index.ts → dist/index.js} +4 -5
- package/dist/mcp/McpManager.js +493 -0
- package/dist/model/ModelClient.js +162 -0
- package/dist/model/ModelConnectionTester.js +310 -0
- package/dist/model/ModelValidator.js +293 -0
- package/{src/model/index.ts → dist/model/index.js} +0 -2
- package/dist/model/providers/AnthropicProvider.js +257 -0
- package/dist/model/providers/CodingPlanProvider.js +160 -0
- package/dist/model/providers/OllamaCloudProvider.js +322 -0
- package/dist/model/providers/OllamaManager.js +143 -0
- package/dist/model/providers/OllamaProvider.js +55 -0
- package/dist/model/providers/OpenAICompatibleProvider.js +271 -0
- package/{src/model/providers/OpenAIProvider.ts → dist/model/providers/OpenAIProvider.js} +18 -29
- package/dist/model/providers/index.js +6 -0
- package/dist/model/types.js +11 -0
- package/dist/security/ApprovalManager.js +121 -0
- package/dist/security/FileFilter.js +110 -0
- package/dist/security/HookExecutor.js +141 -0
- package/dist/security/SandboxExecutor.js +344 -0
- package/{src/security/index.ts → dist/security/index.js} +0 -3
- package/dist/session/AgentLoop.js +366 -0
- package/dist/session/SessionManager.js +389 -0
- package/{src/session/index.ts → dist/session/index.js} +2 -3
- package/dist/startup/IFlowRepl.js +177 -0
- package/dist/startup/InkBasedRepl.js +858 -0
- package/dist/startup/InteractiveRepl.js +2498 -0
- package/dist/startup/NovaApp.js +1694 -0
- package/{src/startup/index.ts → dist/startup/index.js} +3 -4
- package/dist/startup/parseArgs.js +261 -0
- package/dist/telemetry/Telemetry.js +72 -0
- package/dist/telemetry/TelemetryService.js +409 -0
- package/dist/telemetry/index.js +2 -0
- package/{src/test-modules.ts → dist/test-modules.js} +23 -27
- package/dist/testing/AutoFixer.js +261 -0
- package/dist/testing/ErrorAnalyzer.js +406 -0
- package/dist/testing/TestRunner.js +204 -0
- package/dist/testing/agent-cli-tests.js +492 -0
- package/{src/testing/index.ts → dist/testing/index.js} +7 -11
- package/dist/tools/ToolRegistry.js +207 -0
- package/dist/tools/impl/EditFileTool.js +75 -0
- package/dist/tools/impl/ListDirectoryTool.js +119 -0
- package/dist/tools/impl/MemoryTool.js +79 -0
- package/dist/tools/impl/ReadFileTool.js +47 -0
- package/dist/tools/impl/SearchContentTool.js +64 -0
- package/dist/tools/impl/SearchFileTool.js +47 -0
- package/dist/tools/impl/ShellTool.js +91 -0
- package/dist/tools/impl/TaskTool.js +171 -0
- package/dist/tools/impl/TodoTool.js +101 -0
- package/dist/tools/impl/WebFetchTool.js +76 -0
- package/dist/tools/impl/WebSearchTool.js +66 -0
- package/dist/tools/impl/WriteFileTool.js +40 -0
- package/{src/tools/impl/index.ts → dist/tools/impl/index.js} +0 -1
- package/{src/tools/index.ts → dist/tools/index.js} +6 -7
- package/dist/tools/schemas/execution.js +41 -0
- package/dist/tools/schemas/file.js +115 -0
- package/{src/tools/schemas/index.ts → dist/tools/schemas/index.js} +10 -11
- package/dist/tools/schemas/memory.js +50 -0
- package/dist/tools/schemas/orchestration.js +43 -0
- package/dist/tools/schemas/search.js +109 -0
- package/dist/tools/schemas/todo.js +31 -0
- package/dist/tools/schemas/web.js +84 -0
- package/dist/types/config.js +4 -0
- package/dist/types/errors.js +171 -0
- package/{src/types/index.ts → dist/types/index.js} +7 -8
- package/dist/types/session.js +15 -0
- package/dist/types/tools.js +25 -0
- package/dist/ui/IFlowDropdown.js +360 -0
- package/dist/ui/ModernReplUI.js +206 -0
- package/dist/ui/SimpleSelector2.js +177 -0
- package/dist/ui/components/ConfirmDialog.js +146 -0
- package/dist/ui/components/ErrorPanel.js +328 -0
- package/dist/ui/components/InkAppRunner.js +37 -0
- package/dist/ui/components/InkComponents.js +318 -0
- package/dist/ui/components/NovaInkApp.js +219 -0
- package/dist/ui/components/ProgressBar.js +134 -0
- package/dist/ui/components/ProgressIndicator.js +234 -0
- package/dist/ui/components/QuickActions.js +327 -0
- package/dist/ui/components/SimpleErrorPanel.js +192 -0
- package/dist/ui/components/StatusBar.js +154 -0
- package/dist/ui/components/ThinkingBlockRenderer.js +334 -0
- package/{src/ui/components/index.ts → dist/ui/components/index.js} +1 -17
- package/dist/ui/ink-prototype.js +239 -0
- package/dist/utils/CheckpointManager.js +254 -0
- package/dist/utils/CliUI.js +291 -0
- package/dist/utils/CompletionHelper.js +278 -0
- package/dist/utils/EnhancedCompleter.js +427 -0
- package/dist/utils/ErrorEnhancer.js +349 -0
- package/dist/utils/Logger.js +76 -0
- package/dist/utils/OutputFormatter.js +144 -0
- package/dist/utils/RetryManager.js +347 -0
- package/dist/utils/TokenCounter.js +337 -0
- package/dist/utils/VectorMemoryStore.js +319 -0
- package/dist/utils/helpers.js +76 -0
- package/{src/utils/index.ts → dist/utils/index.js} +0 -2
- package/package.json +28 -45
- package/bin/nova +0 -38
- package/src/agents/AgentOrchestrator.ts +0 -515
- package/src/agents/index.ts +0 -17
- package/src/audit/AuditLogger.ts +0 -509
- package/src/auth/AuthManager.d.ts.map +0 -1
- package/src/auth/AuthManager.ts +0 -138
- package/src/auth/index.d.ts.map +0 -1
- package/src/auth/index.ts +0 -2
- package/src/commands/SmartCompletion.ts +0 -458
- package/src/config/ConfigManager.d.ts.map +0 -1
- package/src/config/ConfigManager.test.ts +0 -183
- package/src/config/ConfigManager.ts +0 -1219
- package/src/config/index.d.ts.map +0 -1
- package/src/context/ContextBuilder.d.ts.map +0 -1
- package/src/context/ContextBuilder.ts +0 -171
- package/src/context/ContextCompressor.d.ts.map +0 -1
- package/src/context/ContextCompressor.ts +0 -642
- package/src/context/LayeredMemoryManager.ts +0 -657
- package/src/context/MemoryDiscovery.d.ts.map +0 -1
- package/src/context/MemoryDiscovery.ts +0 -175
- package/src/context/defaultSystemPrompt.d.ts.map +0 -1
- package/src/context/index.d.ts.map +0 -1
- package/src/context/index.ts +0 -22
- package/src/extensions/SkillGenerator.ts +0 -421
- package/src/extensions/SkillInstaller.d.ts.map +0 -1
- package/src/extensions/SkillInstaller.ts +0 -257
- package/src/extensions/SkillRegistry.d.ts.map +0 -1
- package/src/extensions/SkillRegistry.ts +0 -361
- package/src/extensions/SkillValidator.ts +0 -525
- package/src/index.d.ts.map +0 -1
- package/src/mcp/McpManager.d.ts.map +0 -1
- package/src/mcp/McpManager.ts +0 -632
- package/src/mcp/index.d.ts.map +0 -1
- package/src/model/ModelClient.d.ts.map +0 -1
- package/src/model/ModelClient.ts +0 -217
- package/src/model/ModelConnectionTester.ts +0 -363
- package/src/model/ModelValidator.ts +0 -348
- package/src/model/index.d.ts.map +0 -1
- package/src/model/providers/AnthropicProvider.d.ts.map +0 -1
- package/src/model/providers/AnthropicProvider.ts +0 -279
- package/src/model/providers/CodingPlanProvider.d.ts.map +0 -1
- package/src/model/providers/CodingPlanProvider.ts +0 -210
- package/src/model/providers/OllamaCloudProvider.d.ts.map +0 -1
- package/src/model/providers/OllamaCloudProvider.ts +0 -405
- package/src/model/providers/OllamaManager.d.ts.map +0 -1
- package/src/model/providers/OllamaManager.ts +0 -201
- package/src/model/providers/OllamaProvider.d.ts.map +0 -1
- package/src/model/providers/OllamaProvider.ts +0 -73
- package/src/model/providers/OpenAICompatibleProvider.d.ts.map +0 -1
- package/src/model/providers/OpenAICompatibleProvider.ts +0 -327
- package/src/model/providers/OpenAIProvider.d.ts.map +0 -1
- package/src/model/providers/index.d.ts.map +0 -1
- package/src/model/providers/index.ts +0 -12
- package/src/model/types.d.ts.map +0 -1
- package/src/model/types.ts +0 -77
- package/src/security/ApprovalManager.d.ts.map +0 -1
- package/src/security/ApprovalManager.ts +0 -174
- package/src/security/FileFilter.d.ts.map +0 -1
- package/src/security/FileFilter.ts +0 -141
- package/src/security/HookExecutor.d.ts.map +0 -1
- package/src/security/HookExecutor.ts +0 -178
- package/src/security/SandboxExecutor.ts +0 -447
- package/src/security/index.d.ts.map +0 -1
- package/src/session/AgentLoop.d.ts.map +0 -1
- package/src/session/AgentLoop.ts +0 -501
- package/src/session/SessionManager.d.ts.map +0 -1
- package/src/session/SessionManager.test.ts +0 -183
- package/src/session/SessionManager.ts +0 -460
- package/src/session/index.d.ts.map +0 -1
- package/src/startup/IFlowRepl.ts +0 -212
- package/src/startup/InkBasedRepl.ts +0 -1056
- package/src/startup/InteractiveRepl.ts +0 -2833
- package/src/startup/NovaApp.ts +0 -1861
- package/src/startup/parseArgs.ts +0 -293
- package/src/telemetry/Telemetry.d.ts.map +0 -1
- package/src/telemetry/Telemetry.ts +0 -90
- package/src/telemetry/TelemetryService.ts +0 -531
- package/src/telemetry/index.d.ts.map +0 -1
- package/src/telemetry/index.ts +0 -12
- package/src/testing/AutoFixer.ts +0 -385
- package/src/testing/ErrorAnalyzer.ts +0 -499
- package/src/testing/TestRunner.ts +0 -265
- package/src/testing/agent-cli-tests.ts +0 -538
- package/src/tools/ToolRegistry.d.ts.map +0 -1
- package/src/tools/ToolRegistry.test.ts +0 -206
- package/src/tools/ToolRegistry.ts +0 -260
- package/src/tools/impl/EditFileTool.d.ts.map +0 -1
- package/src/tools/impl/EditFileTool.ts +0 -97
- package/src/tools/impl/ListDirectoryTool.d.ts.map +0 -1
- package/src/tools/impl/ListDirectoryTool.ts +0 -142
- package/src/tools/impl/MemoryTool.d.ts.map +0 -1
- package/src/tools/impl/MemoryTool.ts +0 -102
- package/src/tools/impl/ReadFileTool.d.ts.map +0 -1
- package/src/tools/impl/ReadFileTool.ts +0 -58
- package/src/tools/impl/SearchContentTool.d.ts.map +0 -1
- package/src/tools/impl/SearchContentTool.ts +0 -94
- package/src/tools/impl/SearchFileTool.d.ts.map +0 -1
- package/src/tools/impl/SearchFileTool.ts +0 -61
- package/src/tools/impl/ShellTool.d.ts.map +0 -1
- package/src/tools/impl/ShellTool.ts +0 -118
- package/src/tools/impl/TaskTool.d.ts.map +0 -1
- package/src/tools/impl/TaskTool.ts +0 -207
- package/src/tools/impl/TodoTool.d.ts.map +0 -1
- package/src/tools/impl/TodoTool.ts +0 -122
- package/src/tools/impl/WebFetchTool.d.ts.map +0 -1
- package/src/tools/impl/WebFetchTool.ts +0 -103
- package/src/tools/impl/WebSearchTool.d.ts.map +0 -1
- package/src/tools/impl/WebSearchTool.ts +0 -89
- package/src/tools/impl/WriteFileTool.d.ts.map +0 -1
- package/src/tools/impl/WriteFileTool.ts +0 -49
- package/src/tools/impl/index.d.ts.map +0 -1
- package/src/tools/index.d.ts.map +0 -1
- package/src/tools/schemas/execution.d.ts.map +0 -1
- package/src/tools/schemas/execution.ts +0 -42
- package/src/tools/schemas/file.d.ts.map +0 -1
- package/src/tools/schemas/file.ts +0 -119
- package/src/tools/schemas/index.d.ts.map +0 -1
- package/src/tools/schemas/memory.d.ts.map +0 -1
- package/src/tools/schemas/memory.ts +0 -52
- package/src/tools/schemas/orchestration.d.ts.map +0 -1
- package/src/tools/schemas/orchestration.ts +0 -44
- package/src/tools/schemas/search.d.ts.map +0 -1
- package/src/tools/schemas/search.ts +0 -112
- package/src/tools/schemas/todo.d.ts.map +0 -1
- package/src/tools/schemas/todo.ts +0 -32
- package/src/tools/schemas/web.d.ts.map +0 -1
- package/src/tools/schemas/web.ts +0 -86
- package/src/types/config.d.ts.map +0 -1
- package/src/types/config.ts +0 -200
- package/src/types/errors.d.ts.map +0 -1
- package/src/types/errors.ts +0 -204
- package/src/types/index.d.ts.map +0 -1
- package/src/types/session.d.ts.map +0 -1
- package/src/types/session.ts +0 -216
- package/src/types/tools.d.ts.map +0 -1
- package/src/types/tools.ts +0 -157
- package/src/ui/IFlowDropdown.ts +0 -425
- package/src/ui/ModernReplUI.ts +0 -276
- package/src/ui/SimpleSelector2.ts +0 -215
- package/src/ui/components/ConfirmDialog.ts +0 -176
- package/src/ui/components/ErrorPanel.ts +0 -364
- package/src/ui/components/InkAppRunner.tsx +0 -67
- package/src/ui/components/InkComponents.tsx +0 -613
- package/src/ui/components/NovaInkApp.tsx +0 -312
- package/src/ui/components/ProgressBar.ts +0 -177
- package/src/ui/components/ProgressIndicator.ts +0 -298
- package/src/ui/components/QuickActions.ts +0 -396
- package/src/ui/components/SimpleErrorPanel.ts +0 -231
- package/src/ui/components/StatusBar.ts +0 -194
- package/src/ui/components/ThinkingBlockRenderer.ts +0 -401
- package/src/ui/ink-prototype.tsx +0 -347
- package/src/utils/CheckpointManager.d.ts.map +0 -1
- package/src/utils/CheckpointManager.ts +0 -327
- package/src/utils/CliUI.ts +0 -336
- package/src/utils/CompletionHelper.ts +0 -388
- package/src/utils/EnhancedCompleter.test.ts +0 -226
- package/src/utils/EnhancedCompleter.ts +0 -513
- package/src/utils/ErrorEnhancer.ts +0 -429
- package/src/utils/Logger.d.ts.map +0 -1
- package/src/utils/Logger.ts +0 -98
- package/src/utils/OutputFormatter.ts +0 -193
- package/src/utils/RetryManager.ts +0 -471
- package/src/utils/TokenCounter.d.ts.map +0 -1
- package/src/utils/TokenCounter.ts +0 -414
- package/src/utils/VectorMemoryStore.ts +0 -440
- package/src/utils/helpers.d.ts.map +0 -1
- package/src/utils/helpers.ts +0 -89
- package/src/utils/index.d.ts.map +0 -1
- /package/{src/mcp/index.ts → dist/mcp/index.js} +0 -0
package/bin/nova.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
7
9
|
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const appPath = join(__dirname, '..', 'dist', 'startup', 'NovaApp.js');
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
|
|
13
|
+
// 直接运行编译后的 JavaScript
|
|
14
|
+
spawn(process.execPath, [appPath, ...args], {
|
|
15
|
+
stdio: 'inherit',
|
|
16
|
+
env: { ...process.env }
|
|
17
|
+
}).on('error', (err) => {
|
|
18
|
+
console.error('Failed to start nova:', err.message);
|
|
19
|
+
process.exit(1);
|
|
12
20
|
});
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// AgentOrchestrator - Multi-agent coordination system
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { createLogger } from '../utils/Logger.js';
|
|
5
|
+
import { generateId } from '../utils/helpers.js';
|
|
6
|
+
const logger = createLogger('AgentOrchestrator');
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Agent Definitions
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Built-in agent configurations
|
|
12
|
+
*/
|
|
13
|
+
const BUILTIN_AGENTS = {
|
|
14
|
+
coordinator: {
|
|
15
|
+
id: 'coordinator',
|
|
16
|
+
role: 'coordinator',
|
|
17
|
+
name: 'Coordinator Agent',
|
|
18
|
+
description: 'Orchestrates tasks and coordinates other agents',
|
|
19
|
+
systemPrompt: `You are the Coordinator Agent. Your role is to:
|
|
20
|
+
- Analyze complex tasks and break them into subtasks
|
|
21
|
+
- Assign subtasks to appropriate specialized agents
|
|
22
|
+
- Monitor progress and handle dependencies
|
|
23
|
+
- Aggregate results and provide unified responses
|
|
24
|
+
|
|
25
|
+
Always think step-by-step and maintain clear communication with other agents.`,
|
|
26
|
+
tools: ['read_file', 'list_directory', 'search_content'],
|
|
27
|
+
contextBudget: 8000,
|
|
28
|
+
},
|
|
29
|
+
coder: {
|
|
30
|
+
id: 'coder',
|
|
31
|
+
role: 'coder',
|
|
32
|
+
name: 'Coder Agent',
|
|
33
|
+
description: 'Writes and modifies code',
|
|
34
|
+
systemPrompt: `You are the Coder Agent. Your role is to:
|
|
35
|
+
- Write clean, efficient, and well-documented code
|
|
36
|
+
- Follow project coding conventions
|
|
37
|
+
- Implement features and fix bugs
|
|
38
|
+
- Ensure code is testable and maintainable
|
|
39
|
+
|
|
40
|
+
Always consider edge cases and error handling. Write code incrementally and verify changes.`,
|
|
41
|
+
tools: ['read_file', 'write_file', 'edit_file', 'search_content', 'execute_command'],
|
|
42
|
+
contextBudget: 16000,
|
|
43
|
+
modelPreferences: { temperature: 0.2 },
|
|
44
|
+
},
|
|
45
|
+
tester: {
|
|
46
|
+
id: 'tester',
|
|
47
|
+
role: 'tester',
|
|
48
|
+
name: 'Tester Agent',
|
|
49
|
+
description: 'Writes and runs tests, analyzes failures',
|
|
50
|
+
systemPrompt: `You are the Tester Agent. Your role is to:
|
|
51
|
+
- Write comprehensive unit and integration tests
|
|
52
|
+
- Run tests and analyze failures
|
|
53
|
+
- Identify edge cases and boundary conditions
|
|
54
|
+
- Suggest improvements to test coverage
|
|
55
|
+
|
|
56
|
+
Focus on meaningful tests that verify behavior, not just coverage numbers.`,
|
|
57
|
+
tools: ['read_file', 'write_file', 'edit_file', 'execute_command', 'search_content'],
|
|
58
|
+
contextBudget: 12000,
|
|
59
|
+
},
|
|
60
|
+
reviewer: {
|
|
61
|
+
id: 'reviewer',
|
|
62
|
+
role: 'reviewer',
|
|
63
|
+
name: 'Code Reviewer Agent',
|
|
64
|
+
description: 'Reviews code for quality, security, and best practices',
|
|
65
|
+
systemPrompt: `You are the Code Reviewer Agent. Your role is to:
|
|
66
|
+
- Review code for correctness and quality
|
|
67
|
+
- Identify potential bugs and security issues
|
|
68
|
+
- Check adherence to coding standards
|
|
69
|
+
- Suggest improvements and optimizations
|
|
70
|
+
|
|
71
|
+
Be thorough but constructive. Focus on actionable feedback.`,
|
|
72
|
+
tools: ['read_file', 'search_content', 'list_directory'],
|
|
73
|
+
contextBudget: 12000,
|
|
74
|
+
},
|
|
75
|
+
architect: {
|
|
76
|
+
id: 'architect',
|
|
77
|
+
role: 'architect',
|
|
78
|
+
name: 'Architect Agent',
|
|
79
|
+
description: 'Designs system architecture and makes high-level decisions',
|
|
80
|
+
systemPrompt: `You are the Architect Agent. Your role is to:
|
|
81
|
+
- Design system architecture and component interactions
|
|
82
|
+
- Make technology and design decisions
|
|
83
|
+
- Identify potential scalability and maintainability issues
|
|
84
|
+
- Create technical documentation and diagrams
|
|
85
|
+
|
|
86
|
+
Think at a high level while remaining practical.`,
|
|
87
|
+
tools: ['read_file', 'list_directory', 'search_content', 'write_file'],
|
|
88
|
+
contextBudget: 16000,
|
|
89
|
+
},
|
|
90
|
+
'doc-writer': {
|
|
91
|
+
id: 'doc-writer',
|
|
92
|
+
role: 'doc-writer',
|
|
93
|
+
name: 'Documentation Agent',
|
|
94
|
+
description: 'Writes and updates documentation',
|
|
95
|
+
systemPrompt: `You are the Documentation Agent. Your role is to:
|
|
96
|
+
- Write clear and comprehensive documentation
|
|
97
|
+
- Update existing documentation to reflect changes
|
|
98
|
+
- Create API documentation and usage examples
|
|
99
|
+
- Maintain consistency in documentation style
|
|
100
|
+
|
|
101
|
+
Focus on clarity and completeness. Include examples where helpful.`,
|
|
102
|
+
tools: ['read_file', 'write_file', 'edit_file', 'search_content'],
|
|
103
|
+
contextBudget: 8000,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
// ============================================================================
|
|
107
|
+
// AgentOrchestrator
|
|
108
|
+
// ============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* Multi-agent orchestrator for complex task coordination
|
|
111
|
+
*/
|
|
112
|
+
export class AgentOrchestrator {
|
|
113
|
+
agents = new Map();
|
|
114
|
+
state;
|
|
115
|
+
callbacks = {};
|
|
116
|
+
constructor(sessionId) {
|
|
117
|
+
// Register built-in agents
|
|
118
|
+
for (const [role, config] of Object.entries(BUILTIN_AGENTS)) {
|
|
119
|
+
this.agents.set(role, config);
|
|
120
|
+
}
|
|
121
|
+
// Initialize state
|
|
122
|
+
this.state = {
|
|
123
|
+
sessionId,
|
|
124
|
+
tasks: new Map(),
|
|
125
|
+
results: new Map(),
|
|
126
|
+
activeAgents: new Set(),
|
|
127
|
+
completedTasks: new Set(),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// -----------------------------------------------------------------------
|
|
131
|
+
// Configuration
|
|
132
|
+
// -----------------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Register a custom agent
|
|
135
|
+
*/
|
|
136
|
+
registerAgent(config) {
|
|
137
|
+
this.agents.set(config.role, config);
|
|
138
|
+
logger.info(`Registered agent: ${config.name} (${config.role})`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Set callbacks for monitoring
|
|
142
|
+
*/
|
|
143
|
+
setCallbacks(callbacks) {
|
|
144
|
+
this.callbacks = { ...this.callbacks, ...callbacks };
|
|
145
|
+
}
|
|
146
|
+
// -----------------------------------------------------------------------
|
|
147
|
+
// Task Management
|
|
148
|
+
// -----------------------------------------------------------------------
|
|
149
|
+
/**
|
|
150
|
+
* Create a new task
|
|
151
|
+
*/
|
|
152
|
+
createTask(description, type, options = {}) {
|
|
153
|
+
const task = {
|
|
154
|
+
id: generateId(),
|
|
155
|
+
description,
|
|
156
|
+
type,
|
|
157
|
+
priority: options.priority ?? 'medium',
|
|
158
|
+
dependencies: options.dependencies ?? [],
|
|
159
|
+
input: options.input ?? {},
|
|
160
|
+
assignedAgent: options.assignedAgent,
|
|
161
|
+
};
|
|
162
|
+
this.state.tasks.set(task.id, task);
|
|
163
|
+
logger.debug(`Created task: ${task.id}`, { type, description });
|
|
164
|
+
return task;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get tasks ready to execute (dependencies satisfied)
|
|
168
|
+
*/
|
|
169
|
+
getReadyTasks() {
|
|
170
|
+
const ready = [];
|
|
171
|
+
for (const [id, task] of this.state.tasks) {
|
|
172
|
+
// Skip completed tasks
|
|
173
|
+
if (this.state.completedTasks.has(id))
|
|
174
|
+
continue;
|
|
175
|
+
// Check dependencies
|
|
176
|
+
const depsMet = task.dependencies.every(depId => this.state.completedTasks.has(depId));
|
|
177
|
+
if (depsMet) {
|
|
178
|
+
ready.push(task);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return ready;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Select best agent for a task
|
|
185
|
+
*/
|
|
186
|
+
selectAgent(task) {
|
|
187
|
+
// If agent is explicitly assigned, use it
|
|
188
|
+
if (task.assignedAgent && this.agents.has(task.assignedAgent)) {
|
|
189
|
+
return this.agents.get(task.assignedAgent);
|
|
190
|
+
}
|
|
191
|
+
// Auto-select based on task type
|
|
192
|
+
const roleMap = {
|
|
193
|
+
code: 'coder',
|
|
194
|
+
test: 'tester',
|
|
195
|
+
review: 'reviewer',
|
|
196
|
+
design: 'architect',
|
|
197
|
+
doc: 'doc-writer',
|
|
198
|
+
analysis: 'coordinator',
|
|
199
|
+
};
|
|
200
|
+
const role = roleMap[task.type];
|
|
201
|
+
return this.agents.get(role) ?? null;
|
|
202
|
+
}
|
|
203
|
+
// -----------------------------------------------------------------------
|
|
204
|
+
// Execution
|
|
205
|
+
// -----------------------------------------------------------------------
|
|
206
|
+
/**
|
|
207
|
+
* Execute a single task
|
|
208
|
+
*/
|
|
209
|
+
async executeTask(task, executeFn) {
|
|
210
|
+
const agent = this.selectAgent(task);
|
|
211
|
+
if (!agent) {
|
|
212
|
+
return {
|
|
213
|
+
taskId: task.id,
|
|
214
|
+
agentId: 'none',
|
|
215
|
+
status: 'failed',
|
|
216
|
+
output: { summary: 'No suitable agent found for task' },
|
|
217
|
+
metrics: { tokensUsed: 0, duration: 0, toolCalls: 0 },
|
|
218
|
+
error: 'No suitable agent found',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
this.state.activeAgents.add(agent.id);
|
|
222
|
+
this.callbacks.onTaskStart?.(task, agent);
|
|
223
|
+
const startTime = Date.now();
|
|
224
|
+
try {
|
|
225
|
+
const result = await executeFn(agent, task);
|
|
226
|
+
result.metrics.duration = Date.now() - startTime;
|
|
227
|
+
this.state.results.set(task.id, result);
|
|
228
|
+
this.state.completedTasks.add(task.id);
|
|
229
|
+
this.callbacks.onTaskComplete?.(result);
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const result = {
|
|
234
|
+
taskId: task.id,
|
|
235
|
+
agentId: agent.id,
|
|
236
|
+
status: 'failed',
|
|
237
|
+
output: { summary: 'Execution failed' },
|
|
238
|
+
metrics: {
|
|
239
|
+
tokensUsed: 0,
|
|
240
|
+
duration: Date.now() - startTime,
|
|
241
|
+
toolCalls: 0,
|
|
242
|
+
},
|
|
243
|
+
error: error instanceof Error ? error.message : String(error),
|
|
244
|
+
};
|
|
245
|
+
this.state.results.set(task.id, result);
|
|
246
|
+
this.callbacks.onTaskComplete?.(result);
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
this.state.activeAgents.delete(agent.id);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Execute all pending tasks
|
|
255
|
+
*/
|
|
256
|
+
async executeAll(executeFn, options = {}) {
|
|
257
|
+
const { parallel = false, maxConcurrent = 3 } = options;
|
|
258
|
+
const results = [];
|
|
259
|
+
while (true) {
|
|
260
|
+
const readyTasks = this.getReadyTasks();
|
|
261
|
+
if (readyTasks.length === 0) {
|
|
262
|
+
// Check if there are pending tasks with unmet dependencies
|
|
263
|
+
const pending = Array.from(this.state.tasks.values())
|
|
264
|
+
.filter(t => !this.state.completedTasks.has(t.id));
|
|
265
|
+
if (pending.length > 0) {
|
|
266
|
+
logger.warn('Deadlock detected: tasks with unmet dependencies', {
|
|
267
|
+
pending: pending.map(t => t.id)
|
|
268
|
+
});
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
// All tasks completed
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
if (parallel) {
|
|
275
|
+
// Execute up to maxConcurrent tasks in parallel
|
|
276
|
+
const batch = readyTasks.slice(0, maxConcurrent);
|
|
277
|
+
const batchResults = await Promise.all(batch.map(task => this.executeTask(task, executeFn)));
|
|
278
|
+
results.push(...batchResults);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
// Execute sequentially
|
|
282
|
+
for (const task of readyTasks) {
|
|
283
|
+
const result = await this.executeTask(task, executeFn);
|
|
284
|
+
results.push(result);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return results;
|
|
289
|
+
}
|
|
290
|
+
// -----------------------------------------------------------------------
|
|
291
|
+
// State Management
|
|
292
|
+
// -----------------------------------------------------------------------
|
|
293
|
+
/**
|
|
294
|
+
* Get orchestrator state
|
|
295
|
+
*/
|
|
296
|
+
getState() {
|
|
297
|
+
return {
|
|
298
|
+
...this.state,
|
|
299
|
+
tasks: new Map(this.state.tasks),
|
|
300
|
+
results: new Map(this.state.results),
|
|
301
|
+
activeAgents: new Set(this.state.activeAgents),
|
|
302
|
+
completedTasks: new Set(this.state.completedTasks),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get result for a task
|
|
307
|
+
*/
|
|
308
|
+
getResult(taskId) {
|
|
309
|
+
return this.state.results.get(taskId);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get all results
|
|
313
|
+
*/
|
|
314
|
+
getAllResults() {
|
|
315
|
+
return Array.from(this.state.results.values());
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get execution summary
|
|
319
|
+
*/
|
|
320
|
+
getSummary() {
|
|
321
|
+
const results = Array.from(this.state.results.values());
|
|
322
|
+
return {
|
|
323
|
+
totalTasks: this.state.tasks.size,
|
|
324
|
+
completed: results.filter(r => r.status !== 'failed').length,
|
|
325
|
+
failed: results.filter(r => r.status === 'failed').length,
|
|
326
|
+
totalTokens: results.reduce((sum, r) => sum + r.metrics.tokensUsed, 0),
|
|
327
|
+
totalDuration: results.reduce((sum, r) => sum + r.metrics.duration, 0),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Reset orchestrator state
|
|
332
|
+
*/
|
|
333
|
+
reset() {
|
|
334
|
+
this.state = {
|
|
335
|
+
sessionId: this.state.sessionId,
|
|
336
|
+
tasks: new Map(),
|
|
337
|
+
results: new Map(),
|
|
338
|
+
activeAgents: new Set(),
|
|
339
|
+
completedTasks: new Set(),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// ============================================================================
|
|
344
|
+
// Factory function
|
|
345
|
+
// ============================================================================
|
|
346
|
+
/**
|
|
347
|
+
* Create an agent orchestrator
|
|
348
|
+
*/
|
|
349
|
+
export function createAgentOrchestrator(sessionId) {
|
|
350
|
+
return new AgentOrchestrator(sessionId);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Get built-in agent configurations
|
|
354
|
+
*/
|
|
355
|
+
export function getBuiltinAgents() {
|
|
356
|
+
return { ...BUILTIN_AGENTS };
|
|
357
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Agents Module - Multi-agent orchestration system
|
|
3
|
+
// ============================================================================
|
|
4
|
+
export { AgentOrchestrator, createAgentOrchestrator, getBuiltinAgents } from './AgentOrchestrator.js';
|