nova-terminal-assistant 0.1.6 → 0.2.1

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 (285) hide show
  1. package/bin/nova.js +7 -13
  2. package/dist/agents/AgentOrchestrator.js +357 -0
  3. package/dist/agents/index.js +4 -0
  4. package/dist/audit/AuditLogger.js +356 -0
  5. package/{src/audit/index.ts → dist/audit/index.js} +0 -7
  6. package/dist/auth/AuthManager.js +119 -0
  7. package/dist/auth/index.js +1 -0
  8. package/dist/commands/SmartCompletion.js +376 -0
  9. package/dist/config/ConfigManager.js +1196 -0
  10. package/{src/config/index.ts → dist/config/index.js} +1 -1
  11. package/dist/context/ContextBuilder.js +131 -0
  12. package/dist/context/ContextCompressor.js +450 -0
  13. package/dist/context/LayeredMemoryManager.js +504 -0
  14. package/dist/context/MemoryDiscovery.js +145 -0
  15. package/{src/context/defaultSystemPrompt.ts → dist/context/defaultSystemPrompt.js} +8 -20
  16. package/dist/context/index.js +4 -0
  17. package/dist/extensions/SkillGenerator.js +322 -0
  18. package/dist/extensions/SkillInstaller.js +215 -0
  19. package/dist/extensions/SkillRegistry.js +262 -0
  20. package/dist/extensions/SkillValidator.js +448 -0
  21. package/{src/extensions/index.ts → dist/extensions/index.js} +0 -8
  22. package/{src/index.ts → dist/index.js} +4 -5
  23. package/dist/mcp/McpManager.js +493 -0
  24. package/dist/model/ModelClient.js +162 -0
  25. package/dist/model/ModelConnectionTester.js +310 -0
  26. package/dist/model/ModelValidator.js +293 -0
  27. package/{src/model/index.ts → dist/model/index.js} +0 -2
  28. package/dist/model/providers/AnthropicProvider.js +257 -0
  29. package/dist/model/providers/CodingPlanProvider.js +160 -0
  30. package/dist/model/providers/OllamaCloudProvider.js +322 -0
  31. package/dist/model/providers/OllamaManager.js +143 -0
  32. package/dist/model/providers/OllamaProvider.js +55 -0
  33. package/dist/model/providers/OpenAICompatibleProvider.js +271 -0
  34. package/{src/model/providers/OpenAIProvider.ts → dist/model/providers/OpenAIProvider.js} +18 -29
  35. package/dist/model/providers/index.js +6 -0
  36. package/dist/model/types.js +11 -0
  37. package/dist/security/ApprovalManager.js +121 -0
  38. package/dist/security/FileFilter.js +110 -0
  39. package/dist/security/HookExecutor.js +141 -0
  40. package/dist/security/SandboxExecutor.js +344 -0
  41. package/{src/security/index.ts → dist/security/index.js} +0 -3
  42. package/dist/session/AgentLoop.js +366 -0
  43. package/dist/session/SessionManager.js +389 -0
  44. package/{src/session/index.ts → dist/session/index.js} +2 -3
  45. package/dist/startup/IFlowRepl.js +177 -0
  46. package/dist/startup/InkBasedRepl.js +858 -0
  47. package/dist/startup/InteractiveRepl.js +2498 -0
  48. package/dist/startup/NovaApp.js +1694 -0
  49. package/{src/startup/index.ts → dist/startup/index.js} +3 -4
  50. package/dist/startup/parseArgs.js +261 -0
  51. package/dist/telemetry/Telemetry.js +72 -0
  52. package/dist/telemetry/TelemetryService.js +409 -0
  53. package/dist/telemetry/index.js +2 -0
  54. package/{src/test-modules.ts → dist/test-modules.js} +23 -27
  55. package/dist/testing/AutoFixer.js +261 -0
  56. package/dist/testing/ErrorAnalyzer.js +406 -0
  57. package/dist/testing/TestRunner.js +204 -0
  58. package/dist/testing/agent-cli-tests.js +492 -0
  59. package/{src/testing/index.ts → dist/testing/index.js} +7 -11
  60. package/dist/tools/ToolRegistry.js +207 -0
  61. package/dist/tools/impl/EditFileTool.js +75 -0
  62. package/dist/tools/impl/ListDirectoryTool.js +119 -0
  63. package/dist/tools/impl/MemoryTool.js +79 -0
  64. package/dist/tools/impl/ReadFileTool.js +47 -0
  65. package/dist/tools/impl/SearchContentTool.js +64 -0
  66. package/dist/tools/impl/SearchFileTool.js +47 -0
  67. package/dist/tools/impl/ShellTool.js +91 -0
  68. package/dist/tools/impl/TaskTool.js +171 -0
  69. package/dist/tools/impl/TodoTool.js +101 -0
  70. package/dist/tools/impl/WebFetchTool.js +76 -0
  71. package/dist/tools/impl/WebSearchTool.js +66 -0
  72. package/dist/tools/impl/WriteFileTool.js +40 -0
  73. package/{src/tools/impl/index.ts → dist/tools/impl/index.js} +0 -1
  74. package/{src/tools/index.ts → dist/tools/index.js} +6 -7
  75. package/dist/tools/schemas/execution.js +41 -0
  76. package/dist/tools/schemas/file.js +115 -0
  77. package/{src/tools/schemas/index.ts → dist/tools/schemas/index.js} +10 -11
  78. package/dist/tools/schemas/memory.js +50 -0
  79. package/dist/tools/schemas/orchestration.js +43 -0
  80. package/dist/tools/schemas/search.js +109 -0
  81. package/dist/tools/schemas/todo.js +31 -0
  82. package/dist/tools/schemas/web.js +84 -0
  83. package/dist/types/config.js +4 -0
  84. package/dist/types/errors.js +171 -0
  85. package/{src/types/index.ts → dist/types/index.js} +7 -8
  86. package/dist/types/session.js +15 -0
  87. package/dist/types/tools.js +25 -0
  88. package/dist/ui/IFlowDropdown.js +360 -0
  89. package/dist/ui/ModernReplUI.js +206 -0
  90. package/dist/ui/SimpleSelector2.js +177 -0
  91. package/dist/ui/components/ConfirmDialog.js +146 -0
  92. package/dist/ui/components/ErrorPanel.js +328 -0
  93. package/dist/ui/components/InkAppRunner.js +37 -0
  94. package/dist/ui/components/InkComponents.js +318 -0
  95. package/dist/ui/components/NovaInkApp.js +219 -0
  96. package/dist/ui/components/ProgressBar.js +134 -0
  97. package/dist/ui/components/ProgressIndicator.js +234 -0
  98. package/dist/ui/components/QuickActions.js +327 -0
  99. package/dist/ui/components/SimpleErrorPanel.js +192 -0
  100. package/dist/ui/components/StatusBar.js +154 -0
  101. package/dist/ui/components/ThinkingBlockRenderer.js +334 -0
  102. package/{src/ui/components/index.ts → dist/ui/components/index.js} +1 -17
  103. package/dist/ui/ink-prototype.js +239 -0
  104. package/dist/utils/CheckpointManager.js +254 -0
  105. package/dist/utils/CliUI.js +291 -0
  106. package/dist/utils/CompletionHelper.js +278 -0
  107. package/dist/utils/EnhancedCompleter.js +427 -0
  108. package/dist/utils/ErrorEnhancer.js +349 -0
  109. package/dist/utils/Logger.js +76 -0
  110. package/dist/utils/OutputFormatter.js +144 -0
  111. package/dist/utils/RetryManager.js +347 -0
  112. package/dist/utils/TokenCounter.js +337 -0
  113. package/dist/utils/VectorMemoryStore.js +319 -0
  114. package/dist/utils/helpers.js +76 -0
  115. package/{src/utils/index.ts → dist/utils/index.js} +0 -2
  116. package/package.json +28 -45
  117. package/bin/nova +0 -38
  118. package/src/agents/AgentOrchestrator.ts +0 -515
  119. package/src/agents/index.ts +0 -17
  120. package/src/audit/AuditLogger.ts +0 -509
  121. package/src/auth/AuthManager.d.ts.map +0 -1
  122. package/src/auth/AuthManager.ts +0 -138
  123. package/src/auth/index.d.ts.map +0 -1
  124. package/src/auth/index.ts +0 -2
  125. package/src/commands/SmartCompletion.ts +0 -458
  126. package/src/config/ConfigManager.d.ts.map +0 -1
  127. package/src/config/ConfigManager.test.ts +0 -183
  128. package/src/config/ConfigManager.ts +0 -1219
  129. package/src/config/index.d.ts.map +0 -1
  130. package/src/context/ContextBuilder.d.ts.map +0 -1
  131. package/src/context/ContextBuilder.ts +0 -171
  132. package/src/context/ContextCompressor.d.ts.map +0 -1
  133. package/src/context/ContextCompressor.ts +0 -642
  134. package/src/context/LayeredMemoryManager.ts +0 -657
  135. package/src/context/MemoryDiscovery.d.ts.map +0 -1
  136. package/src/context/MemoryDiscovery.ts +0 -175
  137. package/src/context/defaultSystemPrompt.d.ts.map +0 -1
  138. package/src/context/index.d.ts.map +0 -1
  139. package/src/context/index.ts +0 -22
  140. package/src/extensions/SkillGenerator.ts +0 -421
  141. package/src/extensions/SkillInstaller.d.ts.map +0 -1
  142. package/src/extensions/SkillInstaller.ts +0 -257
  143. package/src/extensions/SkillRegistry.d.ts.map +0 -1
  144. package/src/extensions/SkillRegistry.ts +0 -361
  145. package/src/extensions/SkillValidator.ts +0 -525
  146. package/src/index.d.ts.map +0 -1
  147. package/src/mcp/McpManager.d.ts.map +0 -1
  148. package/src/mcp/McpManager.ts +0 -632
  149. package/src/mcp/index.d.ts.map +0 -1
  150. package/src/model/ModelClient.d.ts.map +0 -1
  151. package/src/model/ModelClient.ts +0 -217
  152. package/src/model/ModelConnectionTester.ts +0 -363
  153. package/src/model/ModelValidator.ts +0 -348
  154. package/src/model/index.d.ts.map +0 -1
  155. package/src/model/providers/AnthropicProvider.d.ts.map +0 -1
  156. package/src/model/providers/AnthropicProvider.ts +0 -279
  157. package/src/model/providers/CodingPlanProvider.d.ts.map +0 -1
  158. package/src/model/providers/CodingPlanProvider.ts +0 -210
  159. package/src/model/providers/OllamaCloudProvider.d.ts.map +0 -1
  160. package/src/model/providers/OllamaCloudProvider.ts +0 -405
  161. package/src/model/providers/OllamaManager.d.ts.map +0 -1
  162. package/src/model/providers/OllamaManager.ts +0 -201
  163. package/src/model/providers/OllamaProvider.d.ts.map +0 -1
  164. package/src/model/providers/OllamaProvider.ts +0 -73
  165. package/src/model/providers/OpenAICompatibleProvider.d.ts.map +0 -1
  166. package/src/model/providers/OpenAICompatibleProvider.ts +0 -327
  167. package/src/model/providers/OpenAIProvider.d.ts.map +0 -1
  168. package/src/model/providers/index.d.ts.map +0 -1
  169. package/src/model/providers/index.ts +0 -12
  170. package/src/model/types.d.ts.map +0 -1
  171. package/src/model/types.ts +0 -77
  172. package/src/security/ApprovalManager.d.ts.map +0 -1
  173. package/src/security/ApprovalManager.ts +0 -174
  174. package/src/security/FileFilter.d.ts.map +0 -1
  175. package/src/security/FileFilter.ts +0 -141
  176. package/src/security/HookExecutor.d.ts.map +0 -1
  177. package/src/security/HookExecutor.ts +0 -178
  178. package/src/security/SandboxExecutor.ts +0 -447
  179. package/src/security/index.d.ts.map +0 -1
  180. package/src/session/AgentLoop.d.ts.map +0 -1
  181. package/src/session/AgentLoop.ts +0 -501
  182. package/src/session/SessionManager.d.ts.map +0 -1
  183. package/src/session/SessionManager.test.ts +0 -183
  184. package/src/session/SessionManager.ts +0 -460
  185. package/src/session/index.d.ts.map +0 -1
  186. package/src/startup/IFlowRepl.ts +0 -212
  187. package/src/startup/InkBasedRepl.ts +0 -1056
  188. package/src/startup/InteractiveRepl.ts +0 -2833
  189. package/src/startup/NovaApp.ts +0 -1861
  190. package/src/startup/parseArgs.ts +0 -293
  191. package/src/telemetry/Telemetry.d.ts.map +0 -1
  192. package/src/telemetry/Telemetry.ts +0 -90
  193. package/src/telemetry/TelemetryService.ts +0 -531
  194. package/src/telemetry/index.d.ts.map +0 -1
  195. package/src/telemetry/index.ts +0 -12
  196. package/src/testing/AutoFixer.ts +0 -385
  197. package/src/testing/ErrorAnalyzer.ts +0 -499
  198. package/src/testing/TestRunner.ts +0 -265
  199. package/src/testing/agent-cli-tests.ts +0 -538
  200. package/src/tools/ToolRegistry.d.ts.map +0 -1
  201. package/src/tools/ToolRegistry.test.ts +0 -206
  202. package/src/tools/ToolRegistry.ts +0 -260
  203. package/src/tools/impl/EditFileTool.d.ts.map +0 -1
  204. package/src/tools/impl/EditFileTool.ts +0 -97
  205. package/src/tools/impl/ListDirectoryTool.d.ts.map +0 -1
  206. package/src/tools/impl/ListDirectoryTool.ts +0 -142
  207. package/src/tools/impl/MemoryTool.d.ts.map +0 -1
  208. package/src/tools/impl/MemoryTool.ts +0 -102
  209. package/src/tools/impl/ReadFileTool.d.ts.map +0 -1
  210. package/src/tools/impl/ReadFileTool.ts +0 -58
  211. package/src/tools/impl/SearchContentTool.d.ts.map +0 -1
  212. package/src/tools/impl/SearchContentTool.ts +0 -94
  213. package/src/tools/impl/SearchFileTool.d.ts.map +0 -1
  214. package/src/tools/impl/SearchFileTool.ts +0 -61
  215. package/src/tools/impl/ShellTool.d.ts.map +0 -1
  216. package/src/tools/impl/ShellTool.ts +0 -118
  217. package/src/tools/impl/TaskTool.d.ts.map +0 -1
  218. package/src/tools/impl/TaskTool.ts +0 -207
  219. package/src/tools/impl/TodoTool.d.ts.map +0 -1
  220. package/src/tools/impl/TodoTool.ts +0 -122
  221. package/src/tools/impl/WebFetchTool.d.ts.map +0 -1
  222. package/src/tools/impl/WebFetchTool.ts +0 -103
  223. package/src/tools/impl/WebSearchTool.d.ts.map +0 -1
  224. package/src/tools/impl/WebSearchTool.ts +0 -89
  225. package/src/tools/impl/WriteFileTool.d.ts.map +0 -1
  226. package/src/tools/impl/WriteFileTool.ts +0 -49
  227. package/src/tools/impl/index.d.ts.map +0 -1
  228. package/src/tools/index.d.ts.map +0 -1
  229. package/src/tools/schemas/execution.d.ts.map +0 -1
  230. package/src/tools/schemas/execution.ts +0 -42
  231. package/src/tools/schemas/file.d.ts.map +0 -1
  232. package/src/tools/schemas/file.ts +0 -119
  233. package/src/tools/schemas/index.d.ts.map +0 -1
  234. package/src/tools/schemas/memory.d.ts.map +0 -1
  235. package/src/tools/schemas/memory.ts +0 -52
  236. package/src/tools/schemas/orchestration.d.ts.map +0 -1
  237. package/src/tools/schemas/orchestration.ts +0 -44
  238. package/src/tools/schemas/search.d.ts.map +0 -1
  239. package/src/tools/schemas/search.ts +0 -112
  240. package/src/tools/schemas/todo.d.ts.map +0 -1
  241. package/src/tools/schemas/todo.ts +0 -32
  242. package/src/tools/schemas/web.d.ts.map +0 -1
  243. package/src/tools/schemas/web.ts +0 -86
  244. package/src/types/config.d.ts.map +0 -1
  245. package/src/types/config.ts +0 -200
  246. package/src/types/errors.d.ts.map +0 -1
  247. package/src/types/errors.ts +0 -204
  248. package/src/types/index.d.ts.map +0 -1
  249. package/src/types/session.d.ts.map +0 -1
  250. package/src/types/session.ts +0 -216
  251. package/src/types/tools.d.ts.map +0 -1
  252. package/src/types/tools.ts +0 -157
  253. package/src/ui/IFlowDropdown.ts +0 -425
  254. package/src/ui/ModernReplUI.ts +0 -276
  255. package/src/ui/SimpleSelector2.ts +0 -215
  256. package/src/ui/components/ConfirmDialog.ts +0 -176
  257. package/src/ui/components/ErrorPanel.ts +0 -364
  258. package/src/ui/components/InkAppRunner.tsx +0 -67
  259. package/src/ui/components/InkComponents.tsx +0 -613
  260. package/src/ui/components/NovaInkApp.tsx +0 -312
  261. package/src/ui/components/ProgressBar.ts +0 -177
  262. package/src/ui/components/ProgressIndicator.ts +0 -298
  263. package/src/ui/components/QuickActions.ts +0 -396
  264. package/src/ui/components/SimpleErrorPanel.ts +0 -231
  265. package/src/ui/components/StatusBar.ts +0 -194
  266. package/src/ui/components/ThinkingBlockRenderer.ts +0 -401
  267. package/src/ui/ink-prototype.tsx +0 -347
  268. package/src/utils/CheckpointManager.d.ts.map +0 -1
  269. package/src/utils/CheckpointManager.ts +0 -327
  270. package/src/utils/CliUI.ts +0 -336
  271. package/src/utils/CompletionHelper.ts +0 -388
  272. package/src/utils/EnhancedCompleter.test.ts +0 -226
  273. package/src/utils/EnhancedCompleter.ts +0 -513
  274. package/src/utils/ErrorEnhancer.ts +0 -429
  275. package/src/utils/Logger.d.ts.map +0 -1
  276. package/src/utils/Logger.ts +0 -98
  277. package/src/utils/OutputFormatter.ts +0 -193
  278. package/src/utils/RetryManager.ts +0 -471
  279. package/src/utils/TokenCounter.d.ts.map +0 -1
  280. package/src/utils/TokenCounter.ts +0 -414
  281. package/src/utils/VectorMemoryStore.ts +0 -440
  282. package/src/utils/helpers.d.ts.map +0 -1
  283. package/src/utils/helpers.ts +0 -89
  284. package/src/utils/index.d.ts.map +0 -1
  285. /package/{src/mcp/index.ts → dist/mcp/index.js} +0 -0
package/bin/nova.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+
2
3
  import { spawn } from 'child_process';
3
4
  import { fileURLToPath } from 'url';
4
5
  import { dirname, join } from 'path';
@@ -6,21 +7,14 @@ import { dirname, join } from 'path';
6
7
  const __filename = fileURLToPath(import.meta.url);
7
8
  const __dirname = dirname(__filename);
8
9
 
9
- // Use tsx to run the TypeScript entry point
10
- const tsxPath = join(__dirname, '../node_modules/tsx/dist/cli.mjs');
11
- const appPath = join(__dirname, '../src/startup/NovaApp.ts');
10
+ const appPath = join(__dirname, '..', 'dist', 'startup', 'NovaApp.js');
11
+ const args = process.argv.slice(2);
12
12
 
13
- // Use process.execPath for the node executable
14
- const child = spawn(process.execPath, [tsxPath, appPath, ...process.argv.slice(2)], {
13
+ // 直接运行编译后的 JavaScript
14
+ spawn(process.execPath, [appPath, ...args], {
15
15
  stdio: 'inherit',
16
- env: process.env
17
- });
18
-
19
- child.on('close', (code) => {
20
- process.exit(code || 0);
21
- });
22
-
23
- child.on('error', (err) => {
16
+ env: { ...process.env }
17
+ }).on('error', (err) => {
24
18
  console.error('Failed to start nova:', err.message);
25
19
  process.exit(1);
26
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';