neuro-cli 4.1.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +510 -0
  3. package/dist/advisor/advisor.d.ts +50 -0
  4. package/dist/advisor/advisor.js +178 -0
  5. package/dist/agents/base.d.ts +62 -0
  6. package/dist/agents/base.js +215 -0
  7. package/dist/agents/orchestrator.d.ts +46 -0
  8. package/dist/agents/orchestrator.js +192 -0
  9. package/dist/agents/team.d.ts +51 -0
  10. package/dist/agents/team.js +210 -0
  11. package/dist/api/models.d.ts +23 -0
  12. package/dist/api/models.js +514 -0
  13. package/dist/api/ollama.d.ts +153 -0
  14. package/dist/api/ollama.js +751 -0
  15. package/dist/api/openrouter.d.ts +55 -0
  16. package/dist/api/openrouter.js +223 -0
  17. package/dist/commands/commands.d.ts +43 -0
  18. package/dist/commands/commands.js +308 -0
  19. package/dist/config/config.d.ts +8 -0
  20. package/dist/config/config.js +311 -0
  21. package/dist/context/compaction.d.ts +54 -0
  22. package/dist/context/compaction.js +251 -0
  23. package/dist/context/custom-agents.d.ts +107 -0
  24. package/dist/context/custom-agents.js +397 -0
  25. package/dist/context/custom-tools.d.ts +120 -0
  26. package/dist/context/custom-tools.js +564 -0
  27. package/dist/context/git-checkpoint.d.ts +52 -0
  28. package/dist/context/git-checkpoint.js +240 -0
  29. package/dist/context/neuro-md.d.ts +48 -0
  30. package/dist/context/neuro-md.js +202 -0
  31. package/dist/context/neuroignore.d.ts +102 -0
  32. package/dist/context/neuroignore.js +441 -0
  33. package/dist/context/repo-map.d.ts +38 -0
  34. package/dist/context/repo-map.js +220 -0
  35. package/dist/context/skill-standard.d.ts +262 -0
  36. package/dist/context/skill-standard.js +1156 -0
  37. package/dist/context/skill-system.d.ts +75 -0
  38. package/dist/context/skill-system.js +578 -0
  39. package/dist/context/tree-sitter.d.ts +99 -0
  40. package/dist/context/tree-sitter.js +1956 -0
  41. package/dist/core/acp.d.ts +325 -0
  42. package/dist/core/acp.js +1498 -0
  43. package/dist/core/api-server.d.ts +143 -0
  44. package/dist/core/api-server.js +550 -0
  45. package/dist/core/approval.d.ts +81 -0
  46. package/dist/core/approval.js +432 -0
  47. package/dist/core/auto-compact.d.ts +127 -0
  48. package/dist/core/auto-compact.js +436 -0
  49. package/dist/core/auto-mode.d.ts +232 -0
  50. package/dist/core/auto-mode.js +831 -0
  51. package/dist/core/background-session.d.ts +166 -0
  52. package/dist/core/background-session.js +696 -0
  53. package/dist/core/cicd.d.ts +257 -0
  54. package/dist/core/cicd.js +1443 -0
  55. package/dist/core/cloud-sync.d.ts +156 -0
  56. package/dist/core/cloud-sync.js +582 -0
  57. package/dist/core/code-review.d.ts +132 -0
  58. package/dist/core/code-review.js +1191 -0
  59. package/dist/core/completion.d.ts +49 -0
  60. package/dist/core/completion.js +384 -0
  61. package/dist/core/context.d.ts +38 -0
  62. package/dist/core/context.js +144 -0
  63. package/dist/core/diff-preview.d.ts +35 -0
  64. package/dist/core/diff-preview.js +173 -0
  65. package/dist/core/doom-loop.d.ts +51 -0
  66. package/dist/core/doom-loop.js +179 -0
  67. package/dist/core/engine.d.ts +183 -0
  68. package/dist/core/engine.js +942 -0
  69. package/dist/core/extended-thinking.d.ts +103 -0
  70. package/dist/core/extended-thinking.js +269 -0
  71. package/dist/core/fallback.d.ts +54 -0
  72. package/dist/core/fallback.js +104 -0
  73. package/dist/core/git-worktree.d.ts +139 -0
  74. package/dist/core/git-worktree.js +614 -0
  75. package/dist/core/headless.d.ts +30 -0
  76. package/dist/core/headless.js +101 -0
  77. package/dist/core/i18n.d.ts +83 -0
  78. package/dist/core/i18n.js +739 -0
  79. package/dist/core/linting.d.ts +129 -0
  80. package/dist/core/linting.js +699 -0
  81. package/dist/core/model-router.d.ts +109 -0
  82. package/dist/core/model-router.js +581 -0
  83. package/dist/core/multi-model.d.ts +243 -0
  84. package/dist/core/multi-model.js +1099 -0
  85. package/dist/core/multi-session.d.ts +144 -0
  86. package/dist/core/multi-session.js +442 -0
  87. package/dist/core/multimodal.d.ts +125 -0
  88. package/dist/core/multimodal.js +286 -0
  89. package/dist/core/observability.d.ts +93 -0
  90. package/dist/core/observability.js +737 -0
  91. package/dist/core/os-sandbox.d.ts +122 -0
  92. package/dist/core/os-sandbox.js +1193 -0
  93. package/dist/core/outcome-grading.d.ts +228 -0
  94. package/dist/core/outcome-grading.js +1123 -0
  95. package/dist/core/output-styles.d.ts +57 -0
  96. package/dist/core/output-styles.js +382 -0
  97. package/dist/core/parallel-agents.d.ts +183 -0
  98. package/dist/core/parallel-agents.js +563 -0
  99. package/dist/core/plugin-bundle.d.ts +236 -0
  100. package/dist/core/plugin-bundle.js +887 -0
  101. package/dist/core/plugin-sdk.d.ts +139 -0
  102. package/dist/core/plugin-sdk.js +273 -0
  103. package/dist/core/prompt-cache.d.ts +163 -0
  104. package/dist/core/prompt-cache.js +599 -0
  105. package/dist/core/sandbox.d.ts +127 -0
  106. package/dist/core/sandbox.js +369 -0
  107. package/dist/core/scheduled-tasks.d.ts +151 -0
  108. package/dist/core/scheduled-tasks.js +502 -0
  109. package/dist/core/security-scanner.d.ts +160 -0
  110. package/dist/core/security-scanner.js +1494 -0
  111. package/dist/core/session.d.ts +83 -0
  112. package/dist/core/session.js +269 -0
  113. package/dist/core/shell-completion.d.ts +51 -0
  114. package/dist/core/shell-completion.js +674 -0
  115. package/dist/core/smart-monitor.d.ts +146 -0
  116. package/dist/core/smart-monitor.js +1199 -0
  117. package/dist/core/spec-driven.d.ts +233 -0
  118. package/dist/core/spec-driven.js +1485 -0
  119. package/dist/core/spending-warnings.d.ts +123 -0
  120. package/dist/core/spending-warnings.js +456 -0
  121. package/dist/core/sub-agent.d.ts +298 -0
  122. package/dist/core/sub-agent.js +1023 -0
  123. package/dist/core/telemetry.d.ts +157 -0
  124. package/dist/core/telemetry.js +412 -0
  125. package/dist/core/terminal-ux.d.ts +134 -0
  126. package/dist/core/terminal-ux.js +649 -0
  127. package/dist/core/testing.d.ts +146 -0
  128. package/dist/core/testing.js +1200 -0
  129. package/dist/core/types.d.ts +439 -0
  130. package/dist/core/types.js +6 -0
  131. package/dist/core/undo-redo.d.ts +112 -0
  132. package/dist/core/undo-redo.js +290 -0
  133. package/dist/core/updater.d.ts +159 -0
  134. package/dist/core/updater.js +608 -0
  135. package/dist/core/vim-mode.d.ts +151 -0
  136. package/dist/core/vim-mode.js +771 -0
  137. package/dist/core/voice.d.ts +137 -0
  138. package/dist/core/voice.js +538 -0
  139. package/dist/core/web-dashboard.d.ts +109 -0
  140. package/dist/core/web-dashboard.js +484 -0
  141. package/dist/hooks/hooks.d.ts +74 -0
  142. package/dist/hooks/hooks.js +160 -0
  143. package/dist/hooks/llm-evaluator.d.ts +165 -0
  144. package/dist/hooks/llm-evaluator.js +560 -0
  145. package/dist/index.d.ts +3 -0
  146. package/dist/index.js +1186 -0
  147. package/dist/lsp/lsp-manager.d.ts +63 -0
  148. package/dist/lsp/lsp-manager.js +351 -0
  149. package/dist/mcp/client.d.ts +133 -0
  150. package/dist/mcp/client.js +684 -0
  151. package/dist/mcp/mcp-apps.d.ts +70 -0
  152. package/dist/mcp/mcp-apps.js +1007 -0
  153. package/dist/tools/bash.d.ts +5 -0
  154. package/dist/tools/bash.js +195 -0
  155. package/dist/tools/browser.d.ts +92 -0
  156. package/dist/tools/browser.js +1570 -0
  157. package/dist/tools/extended.d.ts +6 -0
  158. package/dist/tools/extended.js +191 -0
  159. package/dist/tools/file.d.ts +10 -0
  160. package/dist/tools/file.js +382 -0
  161. package/dist/tools/github.d.ts +389 -0
  162. package/dist/tools/github.js +759 -0
  163. package/dist/tools/index.d.ts +9 -0
  164. package/dist/tools/index.js +40 -0
  165. package/dist/tools/memory.d.ts +6 -0
  166. package/dist/tools/memory.js +197 -0
  167. package/dist/tools/registry.d.ts +29 -0
  168. package/dist/tools/registry.js +64 -0
  169. package/dist/tools/web.d.ts +6 -0
  170. package/dist/tools/web.js +150 -0
  171. package/dist/ui/renderer.d.ts +97 -0
  172. package/dist/ui/renderer.js +279 -0
  173. package/dist/ui/theme.d.ts +27 -0
  174. package/dist/ui/theme.js +106 -0
  175. package/package.json +83 -0
@@ -0,0 +1,51 @@
1
+ import { BaseAgent, AgentCallbacks } from '../agents/base.js';
2
+ import { OpenRouterClient, TokenUsage } from '../api/openrouter.js';
3
+ import { ToolRegistry } from '../tools/registry.js';
4
+ import { AgentExecution } from '../core/types.js';
5
+ export interface TeamMessage {
6
+ from: string;
7
+ to: string | 'all';
8
+ content: string;
9
+ timestamp: number;
10
+ type: 'task' | 'result' | 'question' | 'coordination' | 'status';
11
+ }
12
+ export interface TeamTask {
13
+ id: string;
14
+ description: string;
15
+ assignedTo: string;
16
+ status: 'pending' | 'in_progress' | 'completed' | 'failed';
17
+ result?: string;
18
+ dependsOn: string[];
19
+ }
20
+ export interface TeamResult {
21
+ tasks: TeamTask[];
22
+ messages: TeamMessage[];
23
+ totalUsage: TokenUsage;
24
+ execution: AgentExecution;
25
+ }
26
+ export declare class AgentTeam {
27
+ private teamName;
28
+ private lead;
29
+ private members;
30
+ private client;
31
+ private registry;
32
+ private workingDirectory;
33
+ private sessionId;
34
+ private tasks;
35
+ private messages;
36
+ private completedTasks;
37
+ constructor(teamName: string, lead: BaseAgent, client: OpenRouterClient, registry: ToolRegistry, workingDirectory: string, sessionId: string);
38
+ /**
39
+ * Add a team member
40
+ */
41
+ addMember(agent: BaseAgent): void;
42
+ /**
43
+ * Execute a task with the team
44
+ */
45
+ execute(task: string, callbacks?: AgentCallbacks): Promise<TeamResult>;
46
+ private createTaskPlan;
47
+ private getReadyTasks;
48
+ private getDependencyContext;
49
+ private sendMessage;
50
+ }
51
+ //# sourceMappingURL=team.d.ts.map
@@ -0,0 +1,210 @@
1
+ // ============================================================
2
+ // NeuroCLI - Agent Teams with Inter-Agent Messaging
3
+ // (Like Claude Code's Agent Teams + Dynamic Workflows)
4
+ // ============================================================
5
+ export class AgentTeam {
6
+ teamName;
7
+ lead;
8
+ members = new Map();
9
+ client;
10
+ registry;
11
+ workingDirectory;
12
+ sessionId;
13
+ tasks = new Map();
14
+ messages = [];
15
+ completedTasks = new Set();
16
+ constructor(teamName, lead, client, registry, workingDirectory, sessionId) {
17
+ this.teamName = teamName;
18
+ this.lead = lead;
19
+ this.client = client;
20
+ this.registry = registry;
21
+ this.workingDirectory = workingDirectory;
22
+ this.sessionId = sessionId;
23
+ }
24
+ /**
25
+ * Add a team member
26
+ */
27
+ addMember(agent) {
28
+ this.members.set(agent.name, agent);
29
+ }
30
+ /**
31
+ * Execute a task with the team
32
+ */
33
+ async execute(task, callbacks) {
34
+ const startTime = Date.now();
35
+ let totalUsage = { inputTokens: 0, outputTokens: 0, cost: 0 };
36
+ // Step 1: Lead analyzes task and creates sub-tasks
37
+ callbacks?.onThinking?.(`🧑‍💼 Lead "${this.lead.name}" is planning task distribution...`);
38
+ const plan = await this.createTaskPlan(task, callbacks);
39
+ // Step 2: Execute tasks with coordination
40
+ callbacks?.onThinking?.(`📋 Plan: ${plan.length} sub-tasks created`);
41
+ for (const teamTask of plan) {
42
+ this.tasks.set(teamTask.id, teamTask);
43
+ }
44
+ // Execute tasks respecting dependencies
45
+ let iteration = 0;
46
+ const maxIterations = plan.length * 3; // Safety limit
47
+ while (this.completedTasks.size < plan.length && iteration < maxIterations) {
48
+ iteration++;
49
+ // Find ready tasks
50
+ const readyTasks = this.getReadyTasks();
51
+ if (readyTasks.length === 0) {
52
+ // Deadlock - mark remaining as failed
53
+ for (const [id, task] of this.tasks) {
54
+ if (task.status === 'pending') {
55
+ task.status = 'failed';
56
+ task.result = 'Deadlock: dependencies could not be resolved';
57
+ }
58
+ }
59
+ break;
60
+ }
61
+ // Execute ready tasks (sequentially for safety, could parallelize)
62
+ for (const teamTask of readyTasks) {
63
+ const member = this.members.get(teamTask.assignedTo);
64
+ if (!member) {
65
+ teamTask.status = 'failed';
66
+ teamTask.result = `Agent "${teamTask.assignedTo}" not found`;
67
+ this.completedTasks.add(teamTask.id);
68
+ continue;
69
+ }
70
+ teamTask.status = 'in_progress';
71
+ callbacks?.onThinking?.(`🤖 ${teamTask.assignedTo} working on: ${teamTask.description.slice(0, 80)}...`);
72
+ // Build context from previous task results
73
+ let fullTask = teamTask.description;
74
+ const depContext = this.getDependencyContext(teamTask);
75
+ if (depContext) {
76
+ fullTask += `\n\n## Context from teammates:\n${depContext}`;
77
+ }
78
+ try {
79
+ const result = await member.run(fullTask, {
80
+ onToken: callbacks?.onToken,
81
+ onToolCall: callbacks?.onToolCall,
82
+ onToolResult: callbacks?.onToolResult,
83
+ onApprovalNeeded: callbacks?.onApprovalNeeded,
84
+ onThinking: callbacks?.onThinking,
85
+ });
86
+ teamTask.status = 'completed';
87
+ teamTask.result = result.content;
88
+ totalUsage.inputTokens += result.usage.inputTokens;
89
+ totalUsage.outputTokens += result.usage.outputTokens;
90
+ totalUsage.cost += result.usage.cost;
91
+ // Send result message to team
92
+ this.sendMessage({
93
+ from: teamTask.assignedTo,
94
+ to: 'all',
95
+ content: `Completed: ${teamTask.description}\nResult: ${result.content.slice(0, 500)}`,
96
+ timestamp: Date.now(),
97
+ type: 'result',
98
+ });
99
+ callbacks?.onThinking?.(`✅ ${teamTask.assignedTo} completed their task`);
100
+ }
101
+ catch (error) {
102
+ teamTask.status = 'failed';
103
+ teamTask.result = error instanceof Error ? error.message : String(error);
104
+ this.sendMessage({
105
+ from: teamTask.assignedTo,
106
+ to: this.lead.name,
107
+ content: `Failed: ${teamTask.description}\nError: ${teamTask.result}`,
108
+ timestamp: Date.now(),
109
+ type: 'result',
110
+ });
111
+ }
112
+ this.completedTasks.add(teamTask.id);
113
+ }
114
+ }
115
+ // Step 3: Lead synthesizes final result
116
+ callbacks?.onThinking?.('🧑‍💼 Lead is synthesizing the final result...');
117
+ const taskResults = Array.from(this.tasks.values())
118
+ .map(t => `[${t.status}] ${t.assignedTo}: ${t.description}\n${t.result || 'No result'}`)
119
+ .join('\n\n');
120
+ const execution = {
121
+ agentName: `Team:${this.teamName}`,
122
+ task,
123
+ startTime,
124
+ endTime: Date.now(),
125
+ iterations: iteration,
126
+ tokensUsed: totalUsage.inputTokens + totalUsage.outputTokens,
127
+ status: 'completed',
128
+ };
129
+ return {
130
+ tasks: Array.from(this.tasks.values()),
131
+ messages: this.messages,
132
+ totalUsage,
133
+ execution,
134
+ };
135
+ }
136
+ // ---- Private Methods ----
137
+ async createTaskPlan(task, callbacks) {
138
+ const memberList = Array.from(this.members.entries())
139
+ .map(([name, agent]) => `- ${name}: ${agent.description}`)
140
+ .join('\n');
141
+ const prompt = `You are the lead of agent team "${this.teamName}". Break down the following task into sub-tasks for your team members.
142
+
143
+ ## Team Members
144
+ ${memberList}
145
+
146
+ ## Task
147
+ ${task}
148
+
149
+ Create a JSON plan with sub-tasks. Each task should have:
150
+ - id: unique identifier (e.g., "t1", "t2")
151
+ - description: what the agent should do
152
+ - assignedTo: which team member
153
+ - dependsOn: array of task IDs this depends on (empty if none)
154
+
155
+ Respond with ONLY a JSON array of tasks.`;
156
+ const response = await this.lead.query(prompt);
157
+ try {
158
+ const jsonMatch = response.match(/\[[\s\S]*\]/);
159
+ if (jsonMatch) {
160
+ const tasks = JSON.parse(jsonMatch[0]);
161
+ return tasks.map(t => ({
162
+ id: t.id,
163
+ description: t.description,
164
+ assignedTo: t.assignedTo,
165
+ status: 'pending',
166
+ dependsOn: t.dependsOn || [],
167
+ }));
168
+ }
169
+ }
170
+ catch { }
171
+ // Fallback: assign everything to first member
172
+ const firstMember = Array.from(this.members.keys())[0];
173
+ return [{
174
+ id: 't1',
175
+ description: task,
176
+ assignedTo: firstMember,
177
+ status: 'pending',
178
+ dependsOn: [],
179
+ }];
180
+ }
181
+ getReadyTasks() {
182
+ return Array.from(this.tasks.values()).filter(task => {
183
+ if (task.status !== 'pending')
184
+ return false;
185
+ if (task.dependsOn.length === 0)
186
+ return true;
187
+ return task.dependsOn.every(depId => {
188
+ const dep = this.tasks.get(depId);
189
+ return dep?.status === 'completed';
190
+ });
191
+ });
192
+ }
193
+ getDependencyContext(task) {
194
+ if (task.dependsOn.length === 0)
195
+ return '';
196
+ return task.dependsOn
197
+ .map(depId => {
198
+ const dep = this.tasks.get(depId);
199
+ if (!dep || dep.status !== 'completed')
200
+ return '';
201
+ return `### ${dep.assignedTo} (${dep.description})\n${dep.result?.slice(0, 1000) || 'No result'}`;
202
+ })
203
+ .filter(Boolean)
204
+ .join('\n\n');
205
+ }
206
+ sendMessage(msg) {
207
+ this.messages.push(msg);
208
+ }
209
+ }
210
+ //# sourceMappingURL=team.js.map
@@ -0,0 +1,23 @@
1
+ import { ModelConfig } from '../core/types.js';
2
+ export declare const MODELS: Record<string, ModelConfig>;
3
+ export declare const MODEL_CATEGORIES: {
4
+ free: string[];
5
+ 'free-vision': string[];
6
+ 'free-tools': string[];
7
+ flagship: string[];
8
+ balanced: string[];
9
+ fast: string[];
10
+ 'open-source': string[];
11
+ };
12
+ /** Best free model for coding (with tool support) */
13
+ export declare const BEST_FREE_CODING_MODEL = "qwen/qwen3-coder:free";
14
+ /** Best free model overall (largest context + tools) */
15
+ export declare const BEST_FREE_MODEL = "nvidia/nemotron-3-super-120b-a12b:free";
16
+ /** Default free model for agents */
17
+ export declare const DEFAULT_FREE_MODEL = "qwen/qwen3-coder:free";
18
+ export declare function getModel(id: string): ModelConfig | undefined;
19
+ export declare function isFreeModel(modelId: string): boolean;
20
+ export declare function calculateCost(modelId: string, inputTokens: number, outputTokens: number): number;
21
+ export declare function getFreeModels(): ModelConfig[];
22
+ export declare function getFreeModelsWithTools(): ModelConfig[];
23
+ //# sourceMappingURL=models.d.ts.map