@neetru/cli 2.19.1 → 2.20.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 (38) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/commands/code.d.ts +8 -2
  3. package/dist/commands/code.js +474 -191
  4. package/dist/commands/code.js.map +1 -1
  5. package/dist/commands/config.js +2 -0
  6. package/dist/commands/config.js.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/code-agent-files.d.ts +9 -1
  10. package/dist/lib/code-agent-files.js +37 -10
  11. package/dist/lib/code-agent-files.js.map +1 -1
  12. package/dist/lib/code-agent-gateway.js +2 -0
  13. package/dist/lib/code-agent-gateway.js.map +1 -1
  14. package/dist/lib/code-agent-git-tools.d.ts +56 -0
  15. package/dist/lib/code-agent-git-tools.js +212 -0
  16. package/dist/lib/code-agent-git-tools.js.map +1 -0
  17. package/dist/lib/code-agent-protocol.d.ts +8 -0
  18. package/dist/lib/code-agent-protocol.js.map +1 -1
  19. package/dist/lib/code-agent-session.d.ts +9 -1
  20. package/dist/lib/code-agent-session.js +58 -21
  21. package/dist/lib/code-agent-session.js.map +1 -1
  22. package/dist/lib/code-agent-settings.d.ts +24 -1
  23. package/dist/lib/code-agent-settings.js +53 -4
  24. package/dist/lib/code-agent-settings.js.map +1 -1
  25. package/dist/lib/code-agent-subagents.d.ts +105 -0
  26. package/dist/lib/code-agent-subagents.js +179 -0
  27. package/dist/lib/code-agent-subagents.js.map +1 -0
  28. package/dist/lib/code-agent-tools.js +16 -0
  29. package/dist/lib/code-agent-tools.js.map +1 -1
  30. package/dist/lib/code-agent-tui.js +44 -9
  31. package/dist/lib/code-agent-tui.js.map +1 -1
  32. package/dist/lib/code-agent-types.d.ts +51 -0
  33. package/dist/lib/code-agent-ui.js +15 -1
  34. package/dist/lib/code-agent-ui.js.map +1 -1
  35. package/dist/lib/config.d.ts +1 -0
  36. package/dist/lib/config.js +1 -0
  37. package/dist/lib/config.js.map +1 -1
  38. package/package.json +1 -1
@@ -118,6 +118,28 @@ export function saveCodeSession(settings, history) {
118
118
  fs.writeFileSync(file, formatCodeSessionMarkdown(settings, history), 'utf8');
119
119
  return path.relative(settings.cwd, file).replace(/\\/g, '/');
120
120
  }
121
+ /**
122
+ * Nome fixo (não-timestamped) do checkpoint automático — GAP-M1-18
123
+ * (2026-07-11, "ajuda a trabalho a longo prazo"): antes só `/save` manual
124
+ * persistia a conversa; uma sessão longa/densa que crashar ou fechar sem o
125
+ * usuário lembrar de salvar perdia tudo. Prefixo `_` (nunca gerado por
126
+ * `saveCodeSession`, que usa timestamp ISO) marca "não é uma sessão salva
127
+ * de verdade" — `listCodeSessions`/`/resume` ignoram este arquivo de
128
+ * propósito (ver filtro abaixo), senão toda sessão nova mostraria o
129
+ * autosave da anterior como se fosse uma escolha do usuário.
130
+ */
131
+ const AUTOSAVE_FILENAME = '_autosave.md';
132
+ /** Sobrescreve o mesmo arquivo a cada chamada (não acumula um .md por turno). */
133
+ export function autoSaveCodeSession(settings, history) {
134
+ try {
135
+ const dir = path.join(settings.cwd, '.neetru', 'code', 'sessions');
136
+ fs.mkdirSync(dir, { recursive: true });
137
+ fs.writeFileSync(path.join(dir, AUTOSAVE_FILENAME), formatCodeSessionMarkdown(settings, history), 'utf8');
138
+ }
139
+ catch {
140
+ // Best-effort — autosave nunca deve interromper a sessao interativa.
141
+ }
142
+ }
121
143
  function sessionsDir(cwd) {
122
144
  return path.join(cwd, '.neetru', 'code', 'sessions');
123
145
  }
@@ -136,31 +158,46 @@ function parseSessionMarkdown(content) {
136
158
  messages,
137
159
  };
138
160
  }
139
- /** Lista sessoes salvas, mais recente primeiro (nomes de arquivo ISO ordenam lexicograficamente). */
161
+ function readSessionSummary(dir, file, previewPrefix = '') {
162
+ const full = path.join(dir, file);
163
+ let content = '';
164
+ try {
165
+ content = fs.readFileSync(full, 'utf8');
166
+ }
167
+ catch {
168
+ content = '';
169
+ }
170
+ const parsed = parseSessionMarkdown(content);
171
+ const firstUser = parsed.messages.find((m) => m.role === 'user');
172
+ const preview = previewPrefix + (firstUser?.content ?? '').replace(/\s+/g, ' ').trim().slice(0, 80);
173
+ return {
174
+ file: `.neetru/code/sessions/${file}`,
175
+ timestamp: parsed.date || file.replace(/\.md$/, ''),
176
+ messageCount: parsed.messageCount,
177
+ preview,
178
+ };
179
+ }
180
+ /**
181
+ * Lista sessoes salvas, mais recente primeiro (nomes de arquivo ISO ordenam
182
+ * lexicograficamente). O checkpoint automatico (`autoSaveCodeSession`)
183
+ * aparece PRIMEIRO com prefixo "[auto]" quando existe — nao e "escondido"
184
+ * do usuario (senao a sessao perdida por crash/fechar sem `/save` fica
185
+ * irrecuperavel via UI), so marcado como diferente de um save manual.
186
+ */
140
187
  export function listCodeSessions(cwd) {
141
188
  const dir = sessionsDir(cwd);
142
189
  if (!fs.existsSync(dir))
143
190
  return [];
144
- const files = fs.readdirSync(dir).filter((f) => f.endsWith('.md')).sort().reverse();
145
- return files.map((file) => {
146
- const full = path.join(dir, file);
147
- let content = '';
148
- try {
149
- content = fs.readFileSync(full, 'utf8');
150
- }
151
- catch {
152
- content = '';
153
- }
154
- const parsed = parseSessionMarkdown(content);
155
- const firstUser = parsed.messages.find((m) => m.role === 'user');
156
- const preview = (firstUser?.content ?? '').replace(/\s+/g, ' ').trim().slice(0, 80);
157
- return {
158
- file: `.neetru/code/sessions/${file}`,
159
- timestamp: parsed.date || file.replace(/\.md$/, ''),
160
- messageCount: parsed.messageCount,
161
- preview,
162
- };
163
- });
191
+ const all = fs.readdirSync(dir);
192
+ const autosave = all.includes(AUTOSAVE_FILENAME)
193
+ ? [readSessionSummary(dir, AUTOSAVE_FILENAME, '[auto] ')]
194
+ : [];
195
+ const manual = all
196
+ .filter((f) => f.endsWith('.md') && f !== AUTOSAVE_FILENAME)
197
+ .sort()
198
+ .reverse()
199
+ .map((file) => readSessionSummary(dir, file));
200
+ return [...autosave, ...manual];
164
201
  }
165
202
  /** Carrega as mensagens de uma sessao salva (`file` relativo ao cwd, vindo de listCodeSessions). */
166
203
  export function loadCodeSession(cwd, file) {
@@ -1 +1 @@
1
- {"version":3,"file":"code-agent-session.js","sourceRoot":"","sources":["../../src/lib/code-agent-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code-agent-session.js","sourceRoot":"","sources":["../../src/lib/code-agent-session.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,17 @@ export declare const DEFAULT_CODE_MODEL = "llama-3.3-70b-versatile";
2
2
  export declare const DEFAULT_CODE_MAX_TURNS = 8;
3
3
  export declare const DEFAULT_CODE_MAX_TOKENS = 4096;
4
4
  export declare const DEFAULT_CODE_TEMPERATURE = 0.2;
5
+ /**
6
+ * GAP-M1-18 (2026-07-11) — preset "ultracode": pedido do usuário por um modo
7
+ * pra trabalho denso/longo (`--ultracode` ou `/ultracode` na sessão
8
+ * interativa). Amplia turnos/tokens/effort de uma vez em vez do usuário
9
+ * precisar lembrar de 3 flags toda vez. Tetos escolhidos dentro dos limites
10
+ * já validados em `resolveSettings` (`parseBoundedNumber` — max 30
11
+ * turnos/32768 tokens), não introduz teto novo no request em si.
12
+ */
13
+ export declare const ULTRACODE_MAX_TURNS = 24;
14
+ export declare const ULTRACODE_MAX_TOKENS = 32768;
15
+ export declare const ULTRACODE_EFFORT: "high";
5
16
  export interface ResolveCodeModelInput {
6
17
  cliModel?: string;
7
18
  envModel?: string;
@@ -23,7 +34,19 @@ type CatalogProvider = (typeof KNOWN_CATALOG_PROVIDERS)[number];
23
34
  * um provider inválido não deveria travar o comando inteiro, só perde o
24
35
  * roteamento forçado e cai no WRRR normal).
25
36
  */
26
- export declare function resolveCodeProvider(cliProvider?: string, configuredProvider?: string): CatalogProvider | undefined;
37
+ export declare function resolveCodeProvider(cliProvider?: string, configuredProvider?: string, model?: string): CatalogProvider | undefined;
38
+ declare const KNOWN_EFFORT_LEVELS: readonly ["low", "medium", "high"];
39
+ export type CodeEffort = (typeof KNOWN_EFFORT_LEVELS)[number];
40
+ /**
41
+ * Resolve o nível de esforço de raciocínio — prioridade `--effort` (flag da
42
+ * tarefa) sobre `gatewayEffort` configurado (`neetru config set`). Ausente =
43
+ * undefined = comportamento default do provider/modelo (a maioria não é
44
+ * "reasoning model" e ignora o campo quando presente — só Groq/OpenAI
45
+ * recebem `reasoning_effort` de verdade, ver `provider-adapters.ts` no
46
+ * Core). Valor fora do conjunto conhecido é ignorado silenciosamente
47
+ * (fail-open — mesmo padrão de `resolveCodeProvider`).
48
+ */
49
+ export declare function resolveCodeEffort(cliEffort?: string, configuredEffort?: string): CodeEffort | undefined;
27
50
  export declare function parseBoundedNumber(value: unknown, fallback: number, limits: {
28
51
  min: number;
29
52
  max: number;
@@ -2,6 +2,17 @@ export const DEFAULT_CODE_MODEL = 'llama-3.3-70b-versatile';
2
2
  export const DEFAULT_CODE_MAX_TURNS = 8;
3
3
  export const DEFAULT_CODE_MAX_TOKENS = 4096;
4
4
  export const DEFAULT_CODE_TEMPERATURE = 0.2;
5
+ /**
6
+ * GAP-M1-18 (2026-07-11) — preset "ultracode": pedido do usuário por um modo
7
+ * pra trabalho denso/longo (`--ultracode` ou `/ultracode` na sessão
8
+ * interativa). Amplia turnos/tokens/effort de uma vez em vez do usuário
9
+ * precisar lembrar de 3 flags toda vez. Tetos escolhidos dentro dos limites
10
+ * já validados em `resolveSettings` (`parseBoundedNumber` — max 30
11
+ * turnos/32768 tokens), não introduz teto novo no request em si.
12
+ */
13
+ export const ULTRACODE_MAX_TURNS = 24;
14
+ export const ULTRACODE_MAX_TOKENS = 32_768;
15
+ export const ULTRACODE_EFFORT = 'high';
5
16
  export function isAnthropicModel(model) {
6
17
  if (!model)
7
18
  return false;
@@ -27,6 +38,25 @@ export function resolveCodeModel(input) {
27
38
  return { model: DEFAULT_CODE_MODEL };
28
39
  }
29
40
  const KNOWN_CATALOG_PROVIDERS = ['groq', 'nvidia', 'openai'];
41
+ /**
42
+ * Nomes de modelo NATIVOS de um único provider do catálogo curado
43
+ * (model-catalog.ts no Core, GAP-M1-16) — duplicados aqui de propósito pra
44
+ * funcionar OFFLINE/sync (sem round-trip ao Core só pra resolver o provider
45
+ * antes da 1a chamada). Achado em uso real (2026-07-11): `neetru code -m
46
+ * meta-llama/llama-4-scout-17b-16e-instruct` sem `--provider`/`gatewayProvider`
47
+ * configurado caiu no WRRR livre — quando sorteou uma key NVIDIA, o modelo
48
+ * (Groq-only) deu 404 la, nao-retryable, `withKeyRetryDetailed` devolveu
49
+ * null na 1a tentativa -> 503 "nenhum provider disponivel" mesmo com Groq
50
+ * saudavel no pool. `neetru ai models use <id>` ja resolve isso fixando os
51
+ * dois juntos; este fallback cobre quem passa `-m` manualmente com um nome
52
+ * do catalogo sem saber que precisa do `--provider` junto.
53
+ */
54
+ const NATIVE_MODEL_PROVIDER = {
55
+ 'meta-llama/llama-4-scout-17b-16e-instruct': 'groq',
56
+ 'llama-3.3-70b-versatile': 'groq',
57
+ 'meta/llama-4-maverick-17b-128e-instruct': 'nvidia',
58
+ 'meta/llama-3.3-70b-instruct': 'nvidia',
59
+ };
30
60
  /**
31
61
  * GAP-M1-16 (2026-07-10): resolve o provider a forçar no request — prioridade
32
62
  * `--provider` (flag explícita da tarefa) sobre `gatewayProvider` configurado
@@ -35,13 +65,32 @@ const KNOWN_CATALOG_PROVIDERS = ['groq', 'nvidia', 'openai'];
35
65
  * um provider inválido não deveria travar o comando inteiro, só perde o
36
66
  * roteamento forçado e cai no WRRR normal).
37
67
  */
38
- export function resolveCodeProvider(cliProvider, configuredProvider) {
68
+ export function resolveCodeProvider(cliProvider, configuredProvider, model) {
39
69
  const explicit = firstNonEmpty(cliProvider, configuredProvider);
70
+ if (explicit) {
71
+ return KNOWN_CATALOG_PROVIDERS.includes(explicit)
72
+ ? explicit
73
+ : undefined;
74
+ }
75
+ // Nenhum dos dois informado — tenta inferir do nome do modelo antes de
76
+ // desistir pro WRRR livre (ver doc de NATIVE_MODEL_PROVIDER acima).
77
+ return model ? NATIVE_MODEL_PROVIDER[model] : undefined;
78
+ }
79
+ const KNOWN_EFFORT_LEVELS = ['low', 'medium', 'high'];
80
+ /**
81
+ * Resolve o nível de esforço de raciocínio — prioridade `--effort` (flag da
82
+ * tarefa) sobre `gatewayEffort` configurado (`neetru config set`). Ausente =
83
+ * undefined = comportamento default do provider/modelo (a maioria não é
84
+ * "reasoning model" e ignora o campo quando presente — só Groq/OpenAI
85
+ * recebem `reasoning_effort` de verdade, ver `provider-adapters.ts` no
86
+ * Core). Valor fora do conjunto conhecido é ignorado silenciosamente
87
+ * (fail-open — mesmo padrão de `resolveCodeProvider`).
88
+ */
89
+ export function resolveCodeEffort(cliEffort, configuredEffort) {
90
+ const explicit = firstNonEmpty(cliEffort, configuredEffort);
40
91
  if (!explicit)
41
92
  return undefined;
42
- return KNOWN_CATALOG_PROVIDERS.includes(explicit)
43
- ? explicit
44
- : undefined;
93
+ return KNOWN_EFFORT_LEVELS.includes(explicit) ? explicit : undefined;
45
94
  }
46
95
  export function parseBoundedNumber(value, fallback, limits) {
47
96
  if (value === undefined || value === null || value === '')
@@ -1 +1 @@
1
- {"version":3,"file":"code-agent-settings.js","sourceRoot":"","sources":["../../src/lib/code-agent-settings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAa5C,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,GAAG,MAAiC;IACzD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/D,IAAI,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/D,IAAI,UAAU,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAE9E,IAAI,UAAU,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,OAAO;YACL,KAAK,EAAE,kBAAkB;YACzB,OAAO,EACL,2CAA2C,UAAU,KAAK;gBAC1D,qBAAqB,kBAAkB,gDAAgD;SAC1F,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAGtE;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAoB,EAAE,kBAA2B;IACnF,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAChE,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAQ,uBAA6C,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtE,CAAC,CAAE,QAA4B;QAC/B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAc,EACd,QAAgB,EAChB,MAAuD;IAEvD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC3E,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"code-agent-settings.js","sourceRoot":"","sources":["../../src/lib/code-agent-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Orquestrador de subagentes do `neetru code` — permite delegar subtarefas a
3
+ * agentes que rodam concorrentemente (fan-out) enquanto a sessão principal
4
+ * continua livre. Cada subagente reusa o MESMO loop de turnos (`runAgentTask`),
5
+ * porém em modo plano e silencioso, e devolve seu resultado (texto final ou
6
+ * patch proposto) pra sessão principal decidir o que fazer.
7
+ *
8
+ * Arquitetura (princípios gerais de orquestração multi-agente, nada copiado de
9
+ * CLI alheia):
10
+ * - fan-out: N subtarefas independentes disparadas sem bloquear o prompt;
11
+ * - isolamento de contexto: cada subagente tem seu PRÓPRIO histórico de
12
+ * mensagens (`CodeMessage[]`) — nunca compartilha com a sessão principal nem
13
+ * com outro subagente;
14
+ * - coleta assíncrona: o estado vive em memória; o resultado é lido sob demanda
15
+ * (`/agents result`) e um patch só é aplicado por um passo explícito e
16
+ * separado (`/agents apply`), passando pelo mesmo `confirm` de sempre.
17
+ *
18
+ * Segurança (invariantes duras):
19
+ * - subagentes SEMPRE rodam com `apply:false` — nunca aplicam patch sozinhos,
20
+ * independente da config da sessão (escrita concorrente no mesmo working dir
21
+ * corromperia o estado git);
22
+ * - sem aninhamento: um subagente nunca inicia outro (só o REPL interativo
23
+ * chama `startSubagent`; o loop de turnos não tem como fazê-lo);
24
+ * - limite de concorrência (`MAX_CONCURRENT_SUBAGENTS`) protege o rate-limit
25
+ * do AI Gateway.
26
+ *
27
+ * O runner (`runAgentTask`) é INJETADO por quem monta o REPL
28
+ * (`configureSubagentRunner`), não importado daqui — assim este módulo não
29
+ * depende de `commands/code.ts` (import unidirecional, sem ciclo) e os testes
30
+ * injetam um stub sem tocar na rede.
31
+ */
32
+ import type { AgentTaskOutcome, CodeMessage, CodeSettings, ConfirmFn, RunAgentTaskOptions } from './code-agent-types.js';
33
+ import type { CodeAgentState } from './code-agent-session.js';
34
+ /**
35
+ * Máximo de subagentes rodando ao mesmo tempo. Escolhido em 4 porque o AI
36
+ * Gateway do Core limita `AI_GATEWAY_RATE_LIMIT = 30 req/min/IP`: cada turno de
37
+ * subagente é 1 requisição e um subagente faz vários turnos; com 4 concorrentes
38
+ * MAIS a própria sessão principal (que também consome o gateway) as requisições
39
+ * interleiam bem abaixo do teto, sobrando folga pra retries/backoff. Mais que
40
+ * isso arrisca 429 e desperdício de tokens sem ganho real de paralelismo (Node
41
+ * é single-thread — isto é concorrência de I/O, não paralelismo de CPU).
42
+ */
43
+ export declare const MAX_CONCURRENT_SUBAGENTS = 4;
44
+ export type SubagentStatus = 'running' | 'done' | 'failed' | 'stopped';
45
+ export interface SubagentSummary {
46
+ id: string;
47
+ /** Resumo curto da tarefa (1 linha). */
48
+ task: string;
49
+ status: SubagentStatus;
50
+ startedAt: number;
51
+ finishedAt?: number;
52
+ /** true quando o subagente concluiu propondo um patch aplicável. */
53
+ hasPatch: boolean;
54
+ }
55
+ export interface SubagentResult {
56
+ id: string;
57
+ status: SubagentStatus;
58
+ task: string;
59
+ outcome?: AgentTaskOutcome;
60
+ error?: string;
61
+ }
62
+ /**
63
+ * Assinatura do runner injetado. Bate exatamente com `runAgentTask` de
64
+ * `commands/code.ts` (incluindo o retorno `AgentTaskOutcome` e o parâmetro
65
+ * `options`). Injetar em vez de importar evita o import circular
66
+ * commands/code.ts <-> este módulo.
67
+ */
68
+ export type AgentTaskRunner = (task: string, settings: CodeSettings, confirm: ConfirmFn, history?: CodeMessage[], onState?: (state: CodeAgentState) => void, options?: RunAgentTaskOptions) => Promise<AgentTaskOutcome>;
69
+ type SettledListener = (summary: SubagentSummary) => void;
70
+ export declare function configureSubagentRunner(runner: AgentTaskRunner): void;
71
+ /**
72
+ * Registra um ouvinte de conclusão. Retorna uma função pra cancelar o registro.
73
+ * O REPL usa isto pra emitir UMA linha de notificação quando um subagente
74
+ * termina (respeitando a regra de silêncio: nada de output enquanto roda). O
75
+ * orquestrador não conhece o terminal/Ink — só avisa quem se registrou.
76
+ */
77
+ export declare function onSubagentSettled(cb: SettledListener): () => void;
78
+ /**
79
+ * Dispara um subagente em background (fire-and-forget). Retorna o id curto pra
80
+ * consulta posterior. A Promise roda solta; o estado é atualizado quando ela
81
+ * assenta. `apply:false` é FORÇADO aqui, ignorando `settings.apply` — a
82
+ * aplicação de patch é sempre um passo separado e explícito da sessão principal.
83
+ */
84
+ export declare function startSubagent(task: string, settings: CodeSettings): string;
85
+ export declare function listSubagents(): SubagentSummary[];
86
+ /**
87
+ * Sinaliza cancelamento cooperativo. Marca 'stopped' de imediato (determinístico
88
+ * pra UI/consulta) e aborta o `AbortController` — o loop de turnos percebe na
89
+ * fronteira do próximo turno e encerra. Retorna false se o id não existe ou já
90
+ * terminou.
91
+ */
92
+ export declare function stopSubagent(id: string): boolean;
93
+ /** Para todos os subagentes ainda rodando (ex: ao sair da sessão) — evita órfãos. */
94
+ export declare function stopAllSubagents(): number;
95
+ export declare function getSubagentResult(id: string): SubagentResult | null;
96
+ /**
97
+ * Patch aplicável = subagente concluído COM SUCESSO propondo um patch. Um
98
+ * subagente parado/falho/rodando nunca devolve patch aqui (é o que impede
99
+ * aplicar o resultado de um subagente cancelado). A APLICAÇÃO em si continua
100
+ * sendo responsabilidade da sessão principal (confirm + git apply).
101
+ */
102
+ export declare function getApplicablePatch(id: string): string | null;
103
+ /** Só pra testes: zera o estado global entre casos. */
104
+ export declare function __resetSubagents(): void;
105
+ export {};
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Máximo de subagentes rodando ao mesmo tempo. Escolhido em 4 porque o AI
3
+ * Gateway do Core limita `AI_GATEWAY_RATE_LIMIT = 30 req/min/IP`: cada turno de
4
+ * subagente é 1 requisição e um subagente faz vários turnos; com 4 concorrentes
5
+ * MAIS a própria sessão principal (que também consome o gateway) as requisições
6
+ * interleiam bem abaixo do teto, sobrando folga pra retries/backoff. Mais que
7
+ * isso arrisca 429 e desperdício de tokens sem ganho real de paralelismo (Node
8
+ * é single-thread — isto é concorrência de I/O, não paralelismo de CPU).
9
+ */
10
+ export const MAX_CONCURRENT_SUBAGENTS = 4;
11
+ const subagents = new Map();
12
+ const settledListeners = new Set();
13
+ let runnerImpl = null;
14
+ let seq = 0;
15
+ /** Subagentes nunca aplicam patch → confirm nunca é chamado; nega por garantia. */
16
+ const denyConfirm = async () => false;
17
+ export function configureSubagentRunner(runner) {
18
+ runnerImpl = runner;
19
+ }
20
+ /**
21
+ * Registra um ouvinte de conclusão. Retorna uma função pra cancelar o registro.
22
+ * O REPL usa isto pra emitir UMA linha de notificação quando um subagente
23
+ * termina (respeitando a regra de silêncio: nada de output enquanto roda). O
24
+ * orquestrador não conhece o terminal/Ink — só avisa quem se registrou.
25
+ */
26
+ export function onSubagentSettled(cb) {
27
+ settledListeners.add(cb);
28
+ return () => settledListeners.delete(cb);
29
+ }
30
+ function toSummary(record) {
31
+ return {
32
+ id: record.id,
33
+ task: record.task,
34
+ status: record.status,
35
+ startedAt: record.startedAt,
36
+ finishedAt: record.finishedAt,
37
+ hasPatch: record.outcome?.kind === 'patch',
38
+ };
39
+ }
40
+ function notifySettled(record) {
41
+ const summary = toSummary(record);
42
+ for (const cb of settledListeners) {
43
+ try {
44
+ cb(summary);
45
+ }
46
+ catch {
47
+ // Um ouvinte com defeito nunca deve derrubar a coleta de resultado.
48
+ }
49
+ }
50
+ }
51
+ /** Reduz a tarefa a uma linha curta (pra listagem/resumo). */
52
+ function summarizeTask(task) {
53
+ const oneLine = task.replace(/\s+/g, ' ').trim();
54
+ return oneLine.length > 80 ? `${oneLine.slice(0, 77)}...` : oneLine;
55
+ }
56
+ /**
57
+ * Dispara um subagente em background (fire-and-forget). Retorna o id curto pra
58
+ * consulta posterior. A Promise roda solta; o estado é atualizado quando ela
59
+ * assenta. `apply:false` é FORÇADO aqui, ignorando `settings.apply` — a
60
+ * aplicação de patch é sempre um passo separado e explícito da sessão principal.
61
+ */
62
+ export function startSubagent(task, settings) {
63
+ if (!runnerImpl) {
64
+ throw new Error('Runner de subagente não configurado (configureSubagentRunner).');
65
+ }
66
+ const trimmed = task.trim();
67
+ if (!trimmed)
68
+ throw new Error('Tarefa vazia.');
69
+ const running = countRunning();
70
+ if (running >= MAX_CONCURRENT_SUBAGENTS) {
71
+ throw new Error(`Limite de ${MAX_CONCURRENT_SUBAGENTS} subagentes simultâneos atingido — pare um com /agents stop <id>.`);
72
+ }
73
+ const id = `a${++seq}`;
74
+ const controller = new AbortController();
75
+ const record = {
76
+ id,
77
+ task: summarizeTask(trimmed),
78
+ status: 'running',
79
+ startedAt: Date.now(),
80
+ controller,
81
+ history: [],
82
+ };
83
+ subagents.set(id, record);
84
+ // apply/yes forçados a false: subagente é sempre modo plano.
85
+ const subSettings = { ...settings, apply: false, yes: false };
86
+ void runnerImpl(trimmed, subSettings, denyConfirm, record.history, undefined, {
87
+ silent: true,
88
+ signal: controller.signal,
89
+ })
90
+ .then((outcome) => {
91
+ record.outcome = outcome;
92
+ // `stopSubagent` já pode ter marcado 'stopped'; só promove se ainda rodando.
93
+ if (record.status === 'running')
94
+ record.status = 'done';
95
+ })
96
+ .catch((error) => {
97
+ record.error = error instanceof Error ? error.message : String(error);
98
+ if (record.status === 'running') {
99
+ record.status = controller.signal.aborted ? 'stopped' : 'failed';
100
+ }
101
+ })
102
+ .finally(() => {
103
+ if (record.finishedAt === undefined)
104
+ record.finishedAt = Date.now();
105
+ notifySettled(record);
106
+ });
107
+ return id;
108
+ }
109
+ function countRunning() {
110
+ let n = 0;
111
+ for (const record of subagents.values()) {
112
+ if (record.status === 'running')
113
+ n++;
114
+ }
115
+ return n;
116
+ }
117
+ export function listSubagents() {
118
+ return [...subagents.values()]
119
+ .sort((a, b) => a.startedAt - b.startedAt)
120
+ .map(toSummary);
121
+ }
122
+ /**
123
+ * Sinaliza cancelamento cooperativo. Marca 'stopped' de imediato (determinístico
124
+ * pra UI/consulta) e aborta o `AbortController` — o loop de turnos percebe na
125
+ * fronteira do próximo turno e encerra. Retorna false se o id não existe ou já
126
+ * terminou.
127
+ */
128
+ export function stopSubagent(id) {
129
+ const record = subagents.get(id);
130
+ if (!record || record.status !== 'running')
131
+ return false;
132
+ record.status = 'stopped';
133
+ record.finishedAt = Date.now();
134
+ record.controller.abort();
135
+ return true;
136
+ }
137
+ /** Para todos os subagentes ainda rodando (ex: ao sair da sessão) — evita órfãos. */
138
+ export function stopAllSubagents() {
139
+ let n = 0;
140
+ for (const record of subagents.values()) {
141
+ if (record.status === 'running') {
142
+ stopSubagent(record.id);
143
+ n++;
144
+ }
145
+ }
146
+ return n;
147
+ }
148
+ export function getSubagentResult(id) {
149
+ const record = subagents.get(id);
150
+ if (!record)
151
+ return null;
152
+ return {
153
+ id: record.id,
154
+ status: record.status,
155
+ task: record.task,
156
+ outcome: record.outcome,
157
+ error: record.error,
158
+ };
159
+ }
160
+ /**
161
+ * Patch aplicável = subagente concluído COM SUCESSO propondo um patch. Um
162
+ * subagente parado/falho/rodando nunca devolve patch aqui (é o que impede
163
+ * aplicar o resultado de um subagente cancelado). A APLICAÇÃO em si continua
164
+ * sendo responsabilidade da sessão principal (confirm + git apply).
165
+ */
166
+ export function getApplicablePatch(id) {
167
+ const record = subagents.get(id);
168
+ if (!record || record.status !== 'done')
169
+ return null;
170
+ return record.outcome?.kind === 'patch' ? record.outcome.patch ?? null : null;
171
+ }
172
+ /** Só pra testes: zera o estado global entre casos. */
173
+ export function __resetSubagents() {
174
+ subagents.clear();
175
+ settledListeners.clear();
176
+ runnerImpl = null;
177
+ seq = 0;
178
+ }
179
+ //# sourceMappingURL=code-agent-subagents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-agent-subagents.js","sourceRoot":"","sources":["../../src/lib/code-agent-subagents.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,13 @@ export const CODE_TOOL_REGISTRY = [
20
20
  { name: 'search_regex', usage: 'NEETRU_TOOL {"tool":"search_regex","pattern":"regex","flags":"i opcional"}' },
21
21
  { name: 'run_tests', usage: 'NEETRU_TOOL {"tool":"run_tests"}' },
22
22
  { name: 'project_symbols', usage: 'NEETRU_TOOL {"tool":"project_symbols","path":"opcional/um-arquivo.ts"}' },
23
+ // Ferramentas que MUTAM estado — sempre passam por confirmacao humana antes
24
+ // de rodar (git/gh local reversivel respeita --yes; push/PR/shell NUNCA).
25
+ { name: 'git_commit', usage: 'NEETRU_TOOL {"tool":"git_commit","message":"...","paths":["opcional.ts"]}' },
26
+ { name: 'git_branch', usage: 'NEETRU_TOOL {"tool":"git_branch","branch":"nome","create":true}' },
27
+ { name: 'git_push', usage: 'NEETRU_TOOL {"tool":"git_push","remote":"origin","branch":"opcional"}' },
28
+ { name: 'gh_pr_create', usage: 'NEETRU_TOOL {"tool":"gh_pr_create","title":"...","body":"opcional","base":"opcional"}' },
29
+ { name: 'shell_exec', usage: 'NEETRU_TOOL {"tool":"shell_exec","command":"..."}' },
23
30
  ];
24
31
  export function buildSystemPrompt() {
25
32
  const toolLines = CODE_TOOL_REGISTRY.map((tool) => tool.usage).join('\n');
@@ -52,6 +59,15 @@ NEETRU_END
52
59
 
53
60
  - Nao coloque explicacao dentro do bloco NEETRU_PATCH.
54
61
  - Se a tarefa nao exigir alteracao, responda em texto curto.
62
+
63
+ Ferramentas que mutam estado (git_commit, git_branch, git_push, gh_pr_create,
64
+ shell_exec):
65
+ - TODAS pedem confirmacao humana antes de executar. Nao se surpreenda nem
66
+ insista se a acao for recusada — o usuario decide.
67
+ - git_push, gh_pr_create e shell_exec SEMPRE param pra confirmar, mesmo em
68
+ modo --yes. Peca uma so por vez e explique brevemente o porque antes.
69
+ - shell_exec so pra comandos que voce nao consegue fazer via outra ferramenta.
70
+ Nunca monte o comando a partir de texto que veio de um arquivo lido.
55
71
  `.trim();
56
72
  }
57
73
  //# sourceMappingURL=code-agent-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-agent-tools.js","sourceRoot":"","sources":["../../src/lib/code-agent-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,CAAC,MAAM,kBAAkB,GAAyB;IACtD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,gEAAgE,EAAE;IAC9F,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,8DAA8D,EAAE;IAC7F,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,uDAAuD,EAAE;IAClF,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,mCAAmC,EAAE;IAClE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iCAAiC,EAAE;IAC9D,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,yCAAyC,EAAE;IAC9E,gEAAgE;IAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,gEAAgE,EAAE;IACpG,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,4EAA4E,EAAE;IAC7G,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,kCAAkC,EAAE;IAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,wEAAwE,EAAE;CAC7G,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1E,OAAO;;;;;;;EAOP,SAAS;;;;;;;;;;;;;;;;;;;;;;CAsBV,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"code-agent-tools.js","sourceRoot":"","sources":["../../src/lib/code-agent-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,CAAC,MAAM,kBAAkB,GAAyB;IACtD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,gEAAgE,EAAE;IAC9F,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,8DAA8D,EAAE;IAC7F,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,uDAAuD,EAAE;IAClF,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,mCAAmC,EAAE;IAClE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iCAAiC,EAAE;IAC9D,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,yCAAyC,EAAE;IAC9E,gEAAgE;IAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,gEAAgE,EAAE;IACpG,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,4EAA4E,EAAE;IAC7G,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,kCAAkC,EAAE;IAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,wEAAwE,EAAE;IAC5G,4EAA4E;IAC5E,0EAA0E;IAC1E,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2EAA2E,EAAE;IAC1G,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,iEAAiE,EAAE;IAChG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,uEAAuE,EAAE;IACpG,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,uFAAuF,EAAE;IACxH,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,mDAAmD,EAAE;CACnF,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1E,OAAO;;;;;;;EAOP,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BV,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}