@neetru/cli 2.14.0 → 2.16.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 (39) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/commands/build.d.ts +14 -0
  3. package/dist/commands/build.js +26 -2
  4. package/dist/commands/build.js.map +1 -1
  5. package/dist/commands/code.d.ts +10 -31
  6. package/dist/commands/code.js +269 -220
  7. package/dist/commands/code.js.map +1 -1
  8. package/dist/commands/servers.js +8 -7
  9. package/dist/commands/servers.js.map +1 -1
  10. package/dist/lib/agent-commands.d.ts +16 -7
  11. package/dist/lib/agent-commands.js +40 -26
  12. package/dist/lib/agent-commands.js.map +1 -1
  13. package/dist/lib/ai/orchestrator.js +1 -42
  14. package/dist/lib/ai/orchestrator.js.map +1 -1
  15. package/dist/lib/code-agent-files.d.ts +48 -0
  16. package/dist/lib/code-agent-files.js +285 -2
  17. package/dist/lib/code-agent-files.js.map +1 -1
  18. package/dist/lib/code-agent-gateway.d.ts +27 -0
  19. package/dist/lib/code-agent-gateway.js +115 -0
  20. package/dist/lib/code-agent-gateway.js.map +1 -0
  21. package/dist/lib/code-agent-protocol.d.ts +8 -0
  22. package/dist/lib/code-agent-protocol.js +22 -0
  23. package/dist/lib/code-agent-protocol.js.map +1 -1
  24. package/dist/lib/code-agent-session.d.ts +78 -0
  25. package/dist/lib/code-agent-session.js +188 -0
  26. package/dist/lib/code-agent-session.js.map +1 -0
  27. package/dist/lib/code-agent-tools.d.ts +17 -0
  28. package/dist/lib/code-agent-tools.js +52 -0
  29. package/dist/lib/code-agent-tools.js.map +1 -0
  30. package/dist/lib/code-agent-types.d.ts +34 -0
  31. package/dist/lib/code-agent-types.js +7 -0
  32. package/dist/lib/code-agent-types.js.map +1 -0
  33. package/dist/lib/code-agent-ui.d.ts +49 -0
  34. package/dist/lib/code-agent-ui.js +313 -0
  35. package/dist/lib/code-agent-ui.js.map +1 -0
  36. package/dist/lib/sse.d.ts +14 -0
  37. package/dist/lib/sse.js +43 -0
  38. package/dist/lib/sse.js.map +1 -0
  39. package/package.json +1 -1
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Renderização de terminal do `neetru code` — extraído de commands/code.ts
3
+ * (Fase 2, NEETRU_CODE_ARCHITECTURE.md: "separar núcleo de interface").
4
+ *
5
+ * Puramente apresentacional: recebe dados já resolvidos (settings, history,
6
+ * strings) e escreve no terminal. Não decide fluxo, não chama AI Gateway,
7
+ * não executa ferramentas — isso mora em code-agent-gateway.ts /
8
+ * code-agent-tools.ts / commands/code.ts (orquestração do REPL).
9
+ */
10
+ import chalk from 'chalk';
11
+ import path from 'node:path';
12
+ import { spawnSync } from 'node:child_process';
13
+ import { summarizePatch } from './code-agent-protocol.js';
14
+ import { renderColoredDiff } from './code-agent-files.js';
15
+ const AI_GATEWAY_CHAT_PATH = '/api/cli/v1/ai/chat';
16
+ const UI_MIN_WIDTH = 72;
17
+ const UI_MAX_WIDTH = 110;
18
+ export function stripAnsi(text) {
19
+ return text.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
20
+ }
21
+ export function visibleLength(text) {
22
+ return Array.from(stripAnsi(text)).length;
23
+ }
24
+ export function padVisible(text, width) {
25
+ return `${text}${' '.repeat(Math.max(0, width - visibleLength(text)))}`;
26
+ }
27
+ export function terminalWidth() {
28
+ const raw = process.stdout.columns ?? 88;
29
+ return Math.max(UI_MIN_WIDTH, Math.min(UI_MAX_WIDTH, raw));
30
+ }
31
+ export function truncateMiddle(text, max) {
32
+ if (visibleLength(text) <= max)
33
+ return text;
34
+ if (max <= 5)
35
+ return text.slice(0, max);
36
+ const clean = stripAnsi(text);
37
+ const left = Math.ceil((max - 3) / 2);
38
+ const right = Math.floor((max - 3) / 2);
39
+ return `${clean.slice(0, left)}...${clean.slice(clean.length - right)}`;
40
+ }
41
+ export function wrapPlain(text, width) {
42
+ const clean = stripAnsi(text);
43
+ if (clean.length <= width)
44
+ return [clean];
45
+ const out = [];
46
+ let rest = clean;
47
+ while (rest.length > width) {
48
+ const slice = rest.slice(0, width + 1);
49
+ const breakAt = Math.max(slice.lastIndexOf(' '), slice.lastIndexOf('/'), slice.lastIndexOf('\\'));
50
+ const idx = breakAt > Math.floor(width * 0.45) ? breakAt : width;
51
+ out.push(rest.slice(0, idx).trimEnd());
52
+ rest = rest.slice(idx).trimStart();
53
+ }
54
+ if (rest)
55
+ out.push(rest);
56
+ return out;
57
+ }
58
+ export function printBox(title, rows = []) {
59
+ const width = terminalWidth();
60
+ const inner = width - 2;
61
+ const label = title ? ` ${title} ` : '';
62
+ const top = `+${label}${'-'.repeat(Math.max(0, inner - visibleLength(label)))}+`;
63
+ console.log(chalk.dim(top));
64
+ for (const row of rows) {
65
+ const wrapped = wrapPlain(row, inner - 2);
66
+ for (const line of wrapped) {
67
+ console.log(chalk.dim('| ') + padVisible(truncateMiddle(line, inner - 2), inner - 2) + chalk.dim(' |'));
68
+ }
69
+ }
70
+ console.log(chalk.dim(`+${'-'.repeat(inner)}+`));
71
+ }
72
+ export function printStatusBar(settings, mode) {
73
+ const width = terminalWidth();
74
+ const repo = path.basename(settings.cwd) || settings.cwd;
75
+ const patchMode = settings.apply ? (settings.yes ? 'auto-aplica' : 'confirma patch') : 'somente plano';
76
+ const raw = ` neetru code | ${mode} | ${repo} | ${settings.model} | ${patchMode} `;
77
+ console.log(chalk.inverse(padVisible(truncateMiddle(raw, width), width)));
78
+ }
79
+ export function printDivider(label) {
80
+ const width = terminalWidth();
81
+ if (!label) {
82
+ console.log(chalk.dim('-'.repeat(width)));
83
+ return;
84
+ }
85
+ const title = ` ${label} `;
86
+ console.log(chalk.dim(`${title}${'-'.repeat(Math.max(0, width - visibleLength(title)))}`));
87
+ }
88
+ export function printEvent(kind, title, detail) {
89
+ const colors = {
90
+ wait: chalk.cyan,
91
+ tool: chalk.blue,
92
+ ok: chalk.green,
93
+ warn: chalk.yellow,
94
+ error: chalk.red,
95
+ };
96
+ const labels = {
97
+ wait: '...',
98
+ tool: 'tool',
99
+ ok: 'ok',
100
+ warn: 'aviso',
101
+ error: 'erro',
102
+ };
103
+ const time = new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' });
104
+ const tag = colors[kind](`[${labels[kind]}]`.padEnd(8));
105
+ const suffix = detail ? chalk.dim(` ${detail}`) : '';
106
+ console.log(`${chalk.dim(time)} ${tag} ${chalk.bold(title)}${suffix}`);
107
+ }
108
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
109
+ const SPINNER_COLORS = [chalk.cyan, chalk.magenta, chalk.yellow, chalk.green];
110
+ /**
111
+ * Spinner de turno — mostra progresso ao vivo (frame animado + cor rotativa +
112
+ * tempo decorrido MM:SS) enquanto o AI Gateway processa. Cobre TANTO o
113
+ * caminho de streaming quanto o fallback sem stream — antes o fallback ficava
114
+ * mudo até a resposta chegar ou o timeout estourar, sem nenhum feedback.
115
+ * Sem-op em saída não-TTY (pipe/CI/teste) — não faz sentido redesenhar linha.
116
+ */
117
+ export function startTurnSpinner(label) {
118
+ if (!process.stdout.isTTY) {
119
+ return { update: () => { }, stop: () => { } };
120
+ }
121
+ const startedAt = Date.now();
122
+ let frame = 0;
123
+ let detail = '';
124
+ const render = () => {
125
+ const elapsedSec = Math.floor((Date.now() - startedAt) / 1000);
126
+ const mm = String(Math.floor(elapsedSec / 60)).padStart(2, '0');
127
+ const ss = String(elapsedSec % 60).padStart(2, '0');
128
+ const color = SPINNER_COLORS[frame % SPINNER_COLORS.length];
129
+ const glyph = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];
130
+ frame++;
131
+ const line = `${color(glyph)} ${chalk.dim(`${mm}:${ss}`)} ${label}${detail ? chalk.dim(` ${detail}`) : ''}`;
132
+ process.stdout.write(`\r${line}${' '.repeat(10)}`);
133
+ };
134
+ render();
135
+ const timer = setInterval(render, 120);
136
+ return {
137
+ update: (next) => {
138
+ detail = next ?? '';
139
+ },
140
+ stop: () => {
141
+ clearInterval(timer);
142
+ process.stdout.write(`\r${' '.repeat(terminalWidth())}\r`);
143
+ },
144
+ };
145
+ }
146
+ export function summarizeToolResult(result) {
147
+ const lines = result.split(/\r?\n/).filter(Boolean).length;
148
+ const chars = result.length;
149
+ return `${lines} linha(s), ${chars} char(s)`;
150
+ }
151
+ /**
152
+ * Resposta final do assistente — sem caixa ASCII (a caixa fazia `truncateMiddle`
153
+ * cortar linhas de prosa no meio, feio e ilegível). Marcador colorido + word-wrap
154
+ * natural do terminal, padrão comum de CLIs de chat modernas.
155
+ */
156
+ export function printAssistantText(content) {
157
+ const text = content.trim();
158
+ if (!text)
159
+ return;
160
+ const width = terminalWidth();
161
+ console.log();
162
+ console.log(chalk.magenta('●') + ' ' + chalk.dim('neetru code'));
163
+ for (const paragraph of text.split(/\r?\n/)) {
164
+ if (!paragraph) {
165
+ console.log();
166
+ continue;
167
+ }
168
+ for (const line of wrapPlain(paragraph, width - 2)) {
169
+ console.log(` ${line}`);
170
+ }
171
+ }
172
+ console.log();
173
+ }
174
+ export function patchSummaryRows(patch) {
175
+ const summary = summarizePatch(patch);
176
+ if (summary.length === 0)
177
+ return ['arquivos: nao detectado'];
178
+ const added = summary.reduce((total, item) => total + item.added, 0);
179
+ const removed = summary.reduce((total, item) => total + item.removed, 0);
180
+ const rows = [`arquivos: ${summary.length} | +${added} -${removed}`];
181
+ for (const item of summary.slice(0, 8)) {
182
+ rows.push(`${item.file} +${item.added} -${item.removed}`);
183
+ }
184
+ if (summary.length > 8)
185
+ rows.push(`... mais ${summary.length - 8} arquivo(s)`);
186
+ return rows;
187
+ }
188
+ export function printPatchPreview(patch) {
189
+ printBox('patch proposto', [
190
+ ...patchSummaryRows(patch),
191
+ 'aplicacao: git apply depois de confirmacao',
192
+ ]);
193
+ process.stdout.write(renderColoredDiff(patch));
194
+ }
195
+ export function renderHeader(settings, mode = 'oneshot') {
196
+ const gitBranch = spawnSync('git', ['branch', '--show-current'], { cwd: settings.cwd, encoding: 'utf8' });
197
+ const gitStatus = spawnSync('git', ['status', '--short'], { cwd: settings.cwd, encoding: 'utf8' });
198
+ const branch = gitBranch.status === 0 && gitBranch.stdout.trim() ? gitBranch.stdout.trim() : 'sem git';
199
+ const dirty = gitStatus.status === 0
200
+ ? gitStatus.stdout.split(/\r?\n/).filter(Boolean).length
201
+ : 0;
202
+ console.log();
203
+ printStatusBar(settings, mode);
204
+ printBox('sessao', [
205
+ `IA Gateway ${AI_GATEWAY_CHAT_PATH}`,
206
+ `Modelo ${settings.model}`,
207
+ `Pasta ${truncateMiddle(settings.cwd, terminalWidth() - 18)}`,
208
+ `Git ${branch} | ${dirty} arquivo(s) alterado(s)`,
209
+ `Patch ${settings.apply ? (settings.yes ? 'aplica sem perguntar' : 'pede confirmacao') : 'somente plano'}`,
210
+ `Limites ${settings.maxTurns} turno(s) | ${settings.maxTokens} tokens | temp ${settings.temperature}`,
211
+ `Contexto ${settings.files.length ? settings.files.join(', ') : 'sem arquivo inicial'}`,
212
+ ]);
213
+ console.log();
214
+ }
215
+ export function renderInteractiveHelp() {
216
+ printBox('comandos', [
217
+ '/files listar arquivos do projeto',
218
+ '/pick escolher arquivo(s) por numero e anexar ao contexto',
219
+ '/status mostrar sessao, git e contexto',
220
+ '/overview mostrar visao geral do projeto',
221
+ '/diff mostrar diff git atual',
222
+ '/review pedir revisao das mudancas atuais',
223
+ '/save salvar conversa em .neetru/code/sessions',
224
+ '/resume listar e retomar uma sessao salva',
225
+ '/compact manter system prompt e ultimas mensagens',
226
+ '/model mostrar modelo atual',
227
+ '/plan nao aplicar patches',
228
+ '/apply pedir confirmacao antes de aplicar',
229
+ '/yes aplicar patch sem perguntar',
230
+ '/no voltar para confirmacao manual',
231
+ '/clear limpar tela e conversa',
232
+ '/help mostrar estes comandos',
233
+ '/exit sair',
234
+ ]);
235
+ console.log(chalk.dim('Escreva a tarefa direto no prompt. O agente pede arquivos, mostra o fluxo e propoe patch.'));
236
+ console.log();
237
+ }
238
+ export function renderSessionStatus(settings, history = []) {
239
+ const gitStatus = spawnSync('git', ['status', '--short'], { cwd: settings.cwd, encoding: 'utf8' });
240
+ const changed = gitStatus.status === 0
241
+ ? gitStatus.stdout.split(/\r?\n/).filter(Boolean)
242
+ : [];
243
+ printBox('status', [
244
+ `modelo: ${settings.model}`,
245
+ `pasta: ${settings.cwd}`,
246
+ `patch: ${settings.apply ? (settings.yes ? 'auto-aplica' : 'confirma antes') : 'somente plano'}`,
247
+ `mensagens na conversa: ${history.length}`,
248
+ `contexto inicial: ${settings.files.length ? settings.files.join(', ') : 'nenhum'}`,
249
+ `git alterado: ${changed.length} arquivo(s)`,
250
+ ...(changed.length ? changed.slice(0, 8) : []),
251
+ ...(changed.length > 8 ? [`... mais ${changed.length - 8}`] : []),
252
+ ]);
253
+ }
254
+ export function renderPrompt(settings) {
255
+ const repo = path.basename(settings.cwd) || 'projeto';
256
+ const mode = settings.apply ? (settings.yes ? 'auto' : 'confirmar') : 'plano';
257
+ return chalk.cyan(`neetru code ${repo} [${mode}] > `);
258
+ }
259
+ export function printFileSample(files, total) {
260
+ if (files.length === 0) {
261
+ printEvent('warn', 'Nenhum arquivo encontrado');
262
+ return;
263
+ }
264
+ printBox('arquivos', [
265
+ `mostrando ${files.length} de ${total}`,
266
+ ...files,
267
+ ...(total > files.length ? ['... lista truncada em 60 arquivos.'] : []),
268
+ ]);
269
+ }
270
+ /** Picker de arquivos (Fase 5) — lista numerada; `/pick` pede o(s) numero(s) ao usuario. */
271
+ export function printFilePicker(files, total) {
272
+ if (files.length === 0) {
273
+ printEvent('warn', 'Nenhum arquivo encontrado');
274
+ return;
275
+ }
276
+ printBox('escolher arquivos', [
277
+ `mostrando ${files.length} de ${total}`,
278
+ ...files.map((file, i) => `${i + 1}. ${file}`),
279
+ ...(total > files.length ? ['... lista truncada em 60 arquivos.'] : []),
280
+ ]);
281
+ }
282
+ /** Lista sessoes salvas numeradas (Fase 4) — usuario escolhe pelo numero em `/resume`. */
283
+ export function printSessionList(sessions) {
284
+ if (sessions.length === 0) {
285
+ printEvent('warn', 'Nenhuma sessao salva encontrada', '.neetru/code/sessions/');
286
+ return;
287
+ }
288
+ printBox('sessoes salvas', sessions.map((s, i) => {
289
+ const label = s.preview ? ` — ${s.preview}` : '';
290
+ return `${i + 1}. ${s.timestamp} (${s.messageCount} msg)${label}`;
291
+ }));
292
+ }
293
+ export function toolDetail(tool) {
294
+ if (!tool)
295
+ return '';
296
+ if (tool.tool === 'read_file' && typeof tool.path === 'string')
297
+ return tool.path;
298
+ if (tool.tool === 'list_files' && typeof tool.pattern === 'string' && tool.pattern)
299
+ return tool.pattern;
300
+ if (tool.tool === 'search' && typeof tool.query === 'string')
301
+ return tool.query;
302
+ if (tool.tool === 'read_many_files' && Array.isArray(tool.paths)) {
303
+ return `${tool.paths.length} arquivo(s)`;
304
+ }
305
+ if (tool.tool === 'search_regex' && typeof tool.pattern === 'string') {
306
+ const flags = typeof tool.flags === 'string' && tool.flags ? `/${tool.flags}` : '';
307
+ return `/${tool.pattern}/${flags}`;
308
+ }
309
+ if (tool.tool === 'project_symbols' && typeof tool.path === 'string' && tool.path)
310
+ return tool.path;
311
+ return '';
312
+ }
313
+ //# sourceMappingURL=code-agent-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-agent-ui.js","sourceRoot":"","sources":["../../src/lib/code-agent-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Consome um `ReadableStream` de bytes no formato SSE (`data: <payload>\n\n`,
3
+ * uma ou mais linhas por chunk de rede) e chama `onLine(payload)` pra cada
4
+ * linha `data: ` encontrada — `payload` é a string crua (sem parse; o caller
5
+ * decide o shape do JSON e trata `[DONE]`/keep-alives à sua maneira).
6
+ *
7
+ * Extraído de `src/lib/ai/orchestrator.ts` (onde nasceu pra reusar o parsing
8
+ * manual que `streamGemini` já fazia em `streamGateway`) pra um módulo sem
9
+ * dependências pesadas — `code-agent-gateway.ts` (`neetru code`) reusa o
10
+ * mesmo parser sem herdar o bundle inteiro do orchestrator (@anthropic-ai/sdk
11
+ * + openai). Cleanup do reader é feito aqui (`reader.cancel()` em finally) —
12
+ * o caller só precisa gerenciar seu próprio timeout/AbortController.
13
+ */
14
+ export declare function readSseLines(body: ReadableStream<Uint8Array>, onLine: (payload: string) => void): Promise<void>;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Consome um `ReadableStream` de bytes no formato SSE (`data: <payload>\n\n`,
3
+ * uma ou mais linhas por chunk de rede) e chama `onLine(payload)` pra cada
4
+ * linha `data: ` encontrada — `payload` é a string crua (sem parse; o caller
5
+ * decide o shape do JSON e trata `[DONE]`/keep-alives à sua maneira).
6
+ *
7
+ * Extraído de `src/lib/ai/orchestrator.ts` (onde nasceu pra reusar o parsing
8
+ * manual que `streamGemini` já fazia em `streamGateway`) pra um módulo sem
9
+ * dependências pesadas — `code-agent-gateway.ts` (`neetru code`) reusa o
10
+ * mesmo parser sem herdar o bundle inteiro do orchestrator (@anthropic-ai/sdk
11
+ * + openai). Cleanup do reader é feito aqui (`reader.cancel()` em finally) —
12
+ * o caller só precisa gerenciar seu próprio timeout/AbortController.
13
+ */
14
+ export async function readSseLines(body, onLine) {
15
+ const reader = body.getReader();
16
+ const dec = new TextDecoder();
17
+ let buf = '';
18
+ try {
19
+ while (true) {
20
+ const { value, done } = await reader.read();
21
+ if (done)
22
+ break;
23
+ buf += dec.decode(value, { stream: true });
24
+ const lines = buf.split('\n');
25
+ buf = lines.pop() ?? '';
26
+ for (const line of lines) {
27
+ const matchData = line.match(/^data:\s*(.*)$/);
28
+ if (!matchData)
29
+ continue;
30
+ onLine(matchData[1]);
31
+ }
32
+ }
33
+ }
34
+ finally {
35
+ try {
36
+ await reader.cancel();
37
+ }
38
+ catch {
39
+ // reader já fechado, ignora.
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/lib/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAC/C,IAAI,CAAC,SAAS;oBAAE,SAAS;gBACzB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neetru/cli",
3
- "version": "2.14.0",
3
+ "version": "2.16.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": [