@neetru/cli 2.2.0 → 2.3.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.
@@ -2,34 +2,80 @@ import Anthropic from '@anthropic-ai/sdk';
2
2
  import OpenAI from 'openai';
3
3
  import { config } from '../config.js';
4
4
  import { NEETRU_SYSTEM_CONTEXT, loadProjectContext } from './context.js';
5
+ import { discoveredKeys } from './auth-discovery.js';
5
6
  import { log } from '../../utils/logger.js';
7
+ /**
8
+ * Resolve a apiKey efetiva pra um provider. Prioridade:
9
+ * 1. Config local do Neetru (set via `neetru config set`).
10
+ * 2. Cred descoberta de Claude Code / Codex / Gemini CLIs concorrentes
11
+ * (auth-discovery).
12
+ *
13
+ * Não faz lookup repetido — caller pode chamar várias vezes sem custo
14
+ * (discovery é cacheada via module-level evaluation no detect call mas
15
+ * aqui rechamamos pra refletir mudanças em runtime).
16
+ */
17
+ function resolveKey(provider) {
18
+ const configKey = provider === 'anthropic'
19
+ ? 'anthropicApiKey'
20
+ : provider === 'openai'
21
+ ? 'openaiApiKey'
22
+ : 'geminiApiKey';
23
+ const localKey = config.get(configKey);
24
+ if (localKey)
25
+ return localKey;
26
+ return discoveredKeys()[provider];
27
+ }
6
28
  /**
7
29
  * Escolhe o modelo mais adequado para um dado tipo de tarefa.
8
- * "auto" usa Claude por padrão — mais adequado para raciocínio de
9
- * arquitetura e análise de código. Expande conforme as chaves configuradas.
30
+ *
31
+ * Heurísticas (em ordem):
32
+ * 1. Se user forçou um modelo (!= auto), respeita — desde que tenha cred.
33
+ * 2. Code generation pesado → OpenAI (gpt-4o codex-trained) se tiver.
34
+ * 3. Análise/arquitetura/raciocínio longo → Claude (sonnet 4.6).
35
+ * 4. Sumarização rápida / Q&A factual → Gemini (mais barato) se tiver.
36
+ * 5. Fallback: o primeiro provider com cred (claude > openai > gemini).
10
37
  */
11
- function routeModel(input, preferred) {
12
- if (preferred !== 'auto')
13
- return preferred;
38
+ export function routeModel(input, preferred) {
39
+ // Provedores efetivamente disponíveis (config OU discovery).
40
+ const available = {
41
+ claude: !!resolveKey('anthropic'),
42
+ openai: !!resolveKey('openai'),
43
+ gemini: !!resolveKey('gemini'),
44
+ };
45
+ if (preferred !== 'auto') {
46
+ if (preferred === 'claude' && available.claude)
47
+ return 'claude';
48
+ if (preferred === 'openai' && available.openai)
49
+ return 'openai';
50
+ if (preferred === 'gemini' && available.gemini)
51
+ return 'gemini';
52
+ // Pediu mas não tem cred — cai pra auto.
53
+ }
14
54
  const lower = input.toLowerCase();
15
- // Tarefas de geração pura de código → OpenAI (se disponível)
16
- const isCodeGen = lower.includes('crie um componente') ||
17
- lower.includes('gere o código') ||
18
- lower.includes('escreva a função') ||
19
- lower.includes('implemente');
20
- const hasOpenAI = !!config.get('openaiApiKey');
21
- if (isCodeGen && hasOpenAI)
55
+ // Code generation pesado → OpenAI
56
+ const isCodeGen = /\b(crie|gere|escreva|implemente|escreve|gera|cria)\s+(um|uma|o|a|essa|esse|esta|este)?\s*(componente|função|funcao|classe|módulo|modulo|arquivo|test|teste|endpoint|rota|hook|serviço|servico|api)\b/i.test(lower) || /^```|^class\s|^function\s|^const\s+\w+\s*=\s*\(/m.test(input);
57
+ if (isCodeGen && available.openai)
22
58
  return 'openai';
23
- return 'claude'; // padrão: Claude para arquitetura, análise, raciocínio
59
+ // Sumarização rápida / Q&A factual Gemini
60
+ const isQuickQa = /\b(o que é|o que e|defina|defina o|defina a|resuma|resume|sumariza|sumarize|que faz|para que serve)\b/i.test(lower) && input.length < 240;
61
+ if (isQuickQa && available.gemini)
62
+ return 'gemini';
63
+ // Default: Claude (arquitetura, análise, raciocínio).
64
+ if (available.claude)
65
+ return 'claude';
66
+ if (available.openai)
67
+ return 'openai';
68
+ if (available.gemini)
69
+ return 'gemini';
70
+ // Sem creds em lugar nenhum — joga erro descritivo. Caller pode oferecer
71
+ // `neetru auth setup` antes de tentar.
72
+ throw new Error('Nenhum provedor de IA configurado. Rode: neetru auth setup');
24
73
  }
25
- /**
26
- * Stream de resposta via Claude (claude-sonnet-4-5 ou superior).
27
- * Retorna o texto completo ao final.
28
- */
29
74
  async function streamClaude(messages, systemExtra, onChunk) {
30
- const apiKey = config.get('anthropicApiKey');
31
- if (!apiKey)
32
- throw new Error('anthropicApiKey não configurada. Execute: neetru config set anthropicApiKey <sk-ant-...>');
75
+ const apiKey = resolveKey('anthropic');
76
+ if (!apiKey) {
77
+ throw new Error('Cred Claude/Anthropic ausente. Rode `neetru auth setup` ou `neetru config set anthropicApiKey <sk-ant-...>`');
78
+ }
33
79
  const client = new Anthropic({ apiKey });
34
80
  const system = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
35
81
  let full = '';
@@ -48,13 +94,11 @@ async function streamClaude(messages, systemExtra, onChunk) {
48
94
  }
49
95
  return full;
50
96
  }
51
- /**
52
- * Stream de resposta via OpenAI (gpt-4o).
53
- */
54
97
  async function streamOpenAI(messages, systemExtra, onChunk) {
55
- const apiKey = config.get('openaiApiKey');
56
- if (!apiKey)
57
- throw new Error('openaiApiKey não configurada. Execute: neetru config set openaiApiKey <sk-...>');
98
+ const apiKey = resolveKey('openai');
99
+ if (!apiKey) {
100
+ throw new Error('Cred OpenAI ausente. Rode `neetru auth setup` ou `neetru config set openaiApiKey <sk-...>`');
101
+ }
58
102
  const client = new OpenAI({ apiKey });
59
103
  const systemContent = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
60
104
  let full = '';
@@ -75,6 +119,65 @@ async function streamOpenAI(messages, systemExtra, onChunk) {
75
119
  }
76
120
  return full;
77
121
  }
122
+ /**
123
+ * Stream via Gemini. Usa a REST API REST `streamGenerateContent` direto
124
+ * (sem dependência extra). Modelo: gemini-1.5-flash (rápido + barato).
125
+ */
126
+ async function streamGemini(messages, systemExtra, onChunk) {
127
+ const apiKey = resolveKey('gemini');
128
+ if (!apiKey) {
129
+ throw new Error('Cred Gemini ausente. Rode `neetru auth setup` ou `neetru config set geminiApiKey <key>`');
130
+ }
131
+ const systemContent = [NEETRU_SYSTEM_CONTEXT, systemExtra].filter(Boolean).join('\n\n');
132
+ // Gemini API expects user/model roles (não assistant). Converte.
133
+ const contents = messages.map((m) => ({
134
+ role: m.role === 'assistant' ? 'model' : 'user',
135
+ parts: [{ text: m.content }],
136
+ }));
137
+ const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:streamGenerateContent?alt=sse&key=${encodeURIComponent(apiKey)}`;
138
+ const resp = await fetch(url, {
139
+ method: 'POST',
140
+ headers: { 'content-type': 'application/json' },
141
+ body: JSON.stringify({
142
+ systemInstruction: { parts: [{ text: systemContent }] },
143
+ contents,
144
+ }),
145
+ });
146
+ if (!resp.ok || !resp.body) {
147
+ const txt = await resp.text().catch(() => '');
148
+ throw new Error(`Gemini API erro ${resp.status}: ${txt.slice(0, 200)}`);
149
+ }
150
+ let full = '';
151
+ const reader = resp.body.getReader();
152
+ const dec = new TextDecoder();
153
+ let buf = '';
154
+ while (true) {
155
+ const { value, done } = await reader.read();
156
+ if (done)
157
+ break;
158
+ buf += dec.decode(value, { stream: true });
159
+ // SSE: linhas começando com "data: "
160
+ const lines = buf.split('\n');
161
+ buf = lines.pop() ?? '';
162
+ for (const line of lines) {
163
+ const m = line.match(/^data:\s*(.*)$/);
164
+ if (!m)
165
+ continue;
166
+ try {
167
+ const obj = JSON.parse(m[1]);
168
+ const txt = obj?.candidates?.[0]?.content?.parts?.[0]?.text;
169
+ if (typeof txt === 'string' && txt) {
170
+ onChunk(txt);
171
+ full += txt;
172
+ }
173
+ }
174
+ catch {
175
+ // ignora linha de keep-alive
176
+ }
177
+ }
178
+ }
179
+ return full;
180
+ }
78
181
  /**
79
182
  * Orquestrador principal: decide o modelo, injeta contexto Neetru,
80
183
  * faz stream da resposta e retorna o texto completo.
@@ -84,9 +187,45 @@ export async function chat(messages, onChunk, preferred) {
84
187
  const model = routeModel(lastUserMsg, preferred ?? config.get('defaultModel') ?? 'auto');
85
188
  const projectCtx = await loadProjectContext();
86
189
  log.dim(`modelo: ${model}`);
87
- if (model === 'openai') {
190
+ if (model === 'openai')
88
191
  return streamOpenAI(messages, projectCtx, onChunk);
89
- }
192
+ if (model === 'gemini')
193
+ return streamGemini(messages, projectCtx, onChunk);
90
194
  return streamClaude(messages, projectCtx, onChunk);
91
195
  }
196
+ /**
197
+ * Spawn N agents concorrentes pra mesma pergunta. Útil pra "team mode":
198
+ * pega N opiniões e o caller decide o que fazer. Retorna array com
199
+ * {model, response} pra cada um.
200
+ *
201
+ * Limite: spawn só até a quantidade de providers com cred. Se pedir 5 mas
202
+ * só tem 2 providers configurados, roda 2.
203
+ */
204
+ export async function chatParallel(prompt, systemExtra) {
205
+ const targets = [];
206
+ if (resolveKey('anthropic'))
207
+ targets.push('claude');
208
+ if (resolveKey('openai'))
209
+ targets.push('openai');
210
+ if (resolveKey('gemini'))
211
+ targets.push('gemini');
212
+ if (targets.length === 0) {
213
+ throw new Error('Nenhum provedor configurado. Rode: neetru auth setup');
214
+ }
215
+ const messages = [{ role: 'user', content: prompt }];
216
+ const noop = () => { };
217
+ const results = await Promise.allSettled(targets.map(async (m) => {
218
+ let response = '';
219
+ if (m === 'claude')
220
+ response = await streamClaude(messages, systemExtra, noop);
221
+ else if (m === 'openai')
222
+ response = await streamOpenAI(messages, systemExtra, noop);
223
+ else
224
+ response = await streamGemini(messages, systemExtra, noop);
225
+ return { model: m, response };
226
+ }));
227
+ return results.map((r, i) => r.status === 'fulfilled'
228
+ ? { model: targets[i], response: r.value.response, ok: true }
229
+ : { model: targets[i], response: '', ok: false, error: String(r.reason?.message ?? r.reason) });
230
+ }
92
231
  //# sourceMappingURL=orchestrator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/ai/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/lib/ai/orchestrator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neetru/cli",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "type": "module",
5
5
  "description": "Neetru Developer Kit — scaffold, AI assistant, publish, build e deploy de produtos SaaS Neetru via Core (VM-based agents)",
6
6
  "keywords": [