@nio-cli/cli 0.2.0 → 0.3.2
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.
- package/README.md +68 -26
- package/dist/app/ai-client.js +44 -0
- package/dist/app/ai-client.js.map +1 -0
- package/dist/app/docker-manager.js +12 -9
- package/dist/app/docker-manager.js.map +1 -1
- package/dist/cli/commands/ai.js +61 -0
- package/dist/cli/commands/ai.js.map +1 -0
- package/dist/cli/commands/auth.js +91 -70
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/config.js +4 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/debug.js +9 -0
- package/dist/cli/commands/debug.js.map +1 -1
- package/dist/cli/commands/docker.js +25 -0
- package/dist/cli/commands/docker.js.map +1 -1
- package/dist/cli/commands/docs/content.js +26 -6
- package/dist/cli/commands/docs/content.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +2 -1
- package/dist/cli/commands/init/auth-step.js.map +1 -1
- package/dist/cli/commands/init/handoff.js +20 -0
- package/dist/cli/commands/init/handoff.js.map +1 -0
- package/dist/cli/commands/init/index.js +24 -38
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/open.js +8 -0
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/start.js +8 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/flows/onboarding.js +116 -0
- package/dist/cli/flows/onboarding.js.map +1 -0
- package/dist/cli/program.js +58 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli.js +26 -53
- package/dist/cli.js.map +1 -1
- package/dist/gateway/config.js +1 -2
- package/dist/gateway/config.js.map +1 -1
- package/dist/lib/auth/gateway-client.js +22 -42
- package/dist/lib/auth/gateway-client.js.map +1 -1
- package/dist/lib/auth/gateway-process.js +54 -0
- package/dist/lib/auth/gateway-process.js.map +1 -0
- package/dist/lib/auth/nio-config.js +10 -1
- package/dist/lib/auth/nio-config.js.map +1 -1
- package/dist/lib/clients/client-configs.js +24 -10
- package/dist/lib/clients/client-configs.js.map +1 -1
- package/dist/lib/debug.js +6 -0
- package/dist/lib/debug.js.map +1 -0
- package/dist/lib/headroom.js +44 -0
- package/dist/lib/headroom.js.map +1 -0
- package/dist/lib/ide-tasks.js +54 -0
- package/dist/lib/ide-tasks.js.map +1 -0
- package/dist/lib/load-env.js +31 -2
- package/dist/lib/load-env.js.map +1 -1
- package/dist/matrix-logo.js +43 -11
- package/dist/matrix-logo.js.map +1 -1
- package/dist/tui/app.js +155 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components.js +137 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/debug.js +17 -0
- package/dist/tui/debug.js.map +1 -0
- package/dist/tui/index.js +2 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/launch.js +64 -0
- package/dist/tui/launch.js.map +1 -0
- package/dist/tui/markdown.js +40 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/opencode.js +33 -0
- package/dist/tui/opencode.js.map +1 -0
- package/dist/tui/palette-source.js +71 -0
- package/dist/tui/palette-source.js.map +1 -0
- package/dist/tui/palette.js +58 -0
- package/dist/tui/palette.js.map +1 -0
- package/dist/tui/state.js +132 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +14 -0
- package/dist/tui/theme.js.map +1 -0
- package/headroom/docker-compose.yml +27 -0
- package/package.json +11 -1
package/README.md
CHANGED
|
@@ -27,10 +27,11 @@ você → nio (CLI) ──► nio-gateway ──► Postgres (login: senh
|
|
|
27
27
|
`EnvironmentBuilder` garante os toolchains, resolve os MCPs e grava o `config`
|
|
28
28
|
materializado na linha `sessions` do Postgres. A sessão é isolada, tem UUID e
|
|
29
29
|
pode ser reativada depois (`nio sessions`).
|
|
30
|
-
3.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
3. **`nio ai` abre a interface NIO** — o Headroom (proxy de compressão, container
|
|
31
|
+
Docker, obrigatório), o `opencode serve` headless (`opencode/big-pickle`, MCP
|
|
32
|
+
`nio` + MCPs do perfil), e a UI do NIO em Ink (chat, sidebar, paleta `/`). Com
|
|
33
|
+
IDE, roda num terminal integrado dela. A partir daí o agente tem as tools
|
|
34
|
+
`nio_*` — criar/ativar sessão, re-materializar ambiente, delegar execução.
|
|
34
35
|
|
|
35
36
|
O **Postgres é a fonte da verdade** do domínio (usuários, sessões, trilha de
|
|
36
37
|
auth). A CLI e o gateway só falam com o banco que **você** configurar — não há
|
|
@@ -56,6 +57,7 @@ Ficam no PATH: `nio` (CLI), `nio-gateway` (serviço de auth), `nio-cli` e
|
|
|
56
57
|
| **PostgreSQL** alcançável | fonte da verdade (sessões, usuários) | schema em `db/schema.sql` aplicado uma vez |
|
|
57
58
|
| **`JWT_SECRET`** (segredo do time) | assinar/validar as sessões | mesmo valor em toda máquina |
|
|
58
59
|
| **OpenCode** | operador de IA | o `nio init` oferece instalar (`npm i -g opencode-ai`) |
|
|
60
|
+
| **Docker** | obrigatório pro `nio ai` — roda o Headroom (proxy de compressão) | `docker compose version` |
|
|
59
61
|
| *(opcional)* provedor de SMS | 2º fator | `SMS_ENDPOINT_URL` + `SMS_AUTH_HEADER` + `SMS_BODY_TEMPLATE` |
|
|
60
62
|
|
|
61
63
|
---
|
|
@@ -102,7 +104,7 @@ JWT_SECRET=<mesmo-valor-do-time>
|
|
|
102
104
|
| `JWT_SECRET` / `JWT_EXPIRES_IN` | **sem** prefixo (segredo do time) | `nio-gateway` + `nio-cli` |
|
|
103
105
|
| `SMS_ENDPOINT_URL` / `SMS_AUTH_HEADER` / `SMS_BODY_TEMPLATE` / `SMS_FROM` | **sem** prefixo | `nio-gateway` |
|
|
104
106
|
| `NIO_GATEWAY_HOST` (default `127.0.0.1`) | `NIO_` | `nio-gateway` — `0.0.0.0` p/ Kong em container |
|
|
105
|
-
| `NIO_GATEWAY_URL` (default `http://127.0.0.1:
|
|
107
|
+
| `NIO_GATEWAY_URL` (default `http://127.0.0.1:3000`) | `NIO_` | a CLI acha o nio-gateway (Kong na frente = aponta :8000) |
|
|
106
108
|
|
|
107
109
|
O schema de conexão é sempre `postgres://…`; um destino inválido falha explícito,
|
|
108
110
|
nunca cai num default silencioso.
|
|
@@ -111,17 +113,28 @@ nunca cai num default silencioso.
|
|
|
111
113
|
|
|
112
114
|
## Primeiros passos
|
|
113
115
|
|
|
116
|
+
Um comando só:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
nio # (ou `nio start`) — a esteira guiada
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
A esteira detecta em que ponto você está e conduz — **config → gateway → login →
|
|
123
|
+
sessão → handoff pro OpenCode** —, perguntando antes de cada passo. Ela sobe o
|
|
124
|
+
`nio-gateway` sozinha se faltar. Se você sair no meio, ela imprime a linha exata
|
|
125
|
+
pra retomar (`nio start`); nada morre no silêncio.
|
|
126
|
+
|
|
127
|
+
Por dentro, é isto (cada um roda na mão também):
|
|
128
|
+
|
|
114
129
|
```bash
|
|
115
130
|
nio config setup # cola NIO_DATABASE_URL + JWT_SECRET (o time te passa), testa, salva
|
|
116
|
-
nio-gateway
|
|
117
|
-
nio register # cria seu usuário na base compartilhada
|
|
131
|
+
nio-gateway # gateway de auth (a esteira sobe sozinha se faltar)
|
|
132
|
+
nio register # cria seu usuário na base compartilhada → cai no login
|
|
118
133
|
nio login # autentica (salva o JWT em ~/.nio/session.json)
|
|
119
134
|
nio security enable-2fa # (opcional) 2º fator
|
|
120
|
-
nio init # monta o ambiente da sessão
|
|
135
|
+
nio init # monta o ambiente da sessão → `nio ai` (Headroom + OpenCode, num terminal da IDE)
|
|
121
136
|
```
|
|
122
137
|
|
|
123
|
-
Se você pular o `nio config setup`, o próprio `nio register`/`init` abre o wizard.
|
|
124
|
-
|
|
125
138
|
O `nio-gateway` só é necessário pros comandos de auth (`login`/`logout`/
|
|
126
139
|
`verify-2fa`/`security`). Todo o resto — `init`, `sessions`, as tools MCP —
|
|
127
140
|
fala com o Postgres direto usando o JWT local. Rode `nio debug` a qualquer
|
|
@@ -137,9 +150,9 @@ Hexagonal. O núcleo não conhece IO; os adapters implementam os contratos.
|
|
|
137
150
|
entrypoints: src/cli.ts (nio) src/gateway/index.ts (nio-gateway)
|
|
138
151
|
src/mcp-server.ts (nio-cli) src/mcp-server-lang.ts (nio-lang)
|
|
139
152
|
app: SessionManager · EnvironmentBuilder · DependencyWatcher · DockerManager
|
|
140
|
-
core/: types.ts
|
|
141
|
-
|
|
142
|
-
adapters/: pg/ (Postgres) ide/ (vscode) pkg/ (npm,pip,…) docker/ sms/ skills/
|
|
153
|
+
core/: types.ts (entidades + enums) + ports por domínio, sem IO:
|
|
154
|
+
repositories.ts · environment.ts · docker.ts · messaging.ts · lang.ts
|
|
155
|
+
adapters/: pg/ (Postgres) ide/ (vscode) pkg/ (npm,pip,…) docker/ sms/ skills/ lang/
|
|
143
156
|
profiles/: catálogo dos 6 perfis (fixos no fonte)
|
|
144
157
|
```
|
|
145
158
|
|
|
@@ -159,7 +172,7 @@ Detalhes: [`docs/arch/`](docs/arch/) (uma `ARQUITETURA-*.md` por camada) e os
|
|
|
159
172
|
|
|
160
173
|
### Perfis
|
|
161
174
|
|
|
162
|
-
Fixos no fonte (`src/core/
|
|
175
|
+
Fixos no fonte (`src/core/types.ts`) — novos perfis só entram alterando o código:
|
|
163
176
|
|
|
164
177
|
`fullstack` · `analyst` · `scientist` · `dba` · `qa` · `bi`
|
|
165
178
|
|
|
@@ -200,15 +213,32 @@ endpoint local que imprime o código no terminal (aponte `SMS_ENDPOINT_URL` pra
|
|
|
200
213
|
|
|
201
214
|
---
|
|
202
215
|
|
|
203
|
-
## Operador de IA
|
|
204
|
-
|
|
205
|
-
No fim do `nio init
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
216
|
+
## Operador de IA (`nio ai`)
|
|
217
|
+
|
|
218
|
+
No fim do `nio init` a CLI sobe o **client de IA** da sessão — e o mesmo `nio ai`
|
|
219
|
+
retoma a qualquer momento. Ele:
|
|
220
|
+
|
|
221
|
+
1. **Sobe o Headroom** — proxy de compressão de contexto em container Docker
|
|
222
|
+
(`headroom/docker-compose.yml`), **obrigatório** ([ADR 0007](docs/adr/0007-headroom-proxy-obrigatorio.md)).
|
|
223
|
+
Sem Docker, `nio ai` para com erro acionável (o `nio init` não morre — materializa
|
|
224
|
+
o ambiente e deixa a linha `nio ai` pra retomar). Manual: `nio docker headroom {up,down,status}`.
|
|
225
|
+
2. **Aponta o provider pro Headroom** — grava `provider.opencode.options.baseURL`
|
|
226
|
+
no `~/.config/opencode/opencode.json` (junto do `model: opencode/big-pickle`,
|
|
227
|
+
do MCP `nio` e dos MCPs do perfil).
|
|
228
|
+
3. **Sobe o `opencode serve` headless e abre a interface NIO** (Ink — chat
|
|
229
|
+
streamado, sidebar verde, paleta `/` com os comandos e capacidades do NIO). O
|
|
230
|
+
motor é o `opencode/big-pickle`; a casca é nossa. Se a sessão tem IDE (VS Code /
|
|
231
|
+
Cursor), o `nio init` grava um `.vscode/tasks.json` (task `NIO`, `runOn: folderOpen`)
|
|
232
|
+
e o `nio ai` sobe num **terminal integrado da IDE** — uma superfície, não duas.
|
|
233
|
+
Sem IDE, roda no terminal atual. Sem TTY / sem `opencode` → cai na TUI do OpenCode.
|
|
234
|
+
|
|
235
|
+
Ver [`docs/arch/ARQUITETURA-CLIENTE-IA.md`](docs/arch/ARQUITETURA-CLIENTE-IA.md) e
|
|
236
|
+
[`docs/arch/ARQUITETURA-CLIENTE-TUI.md`](docs/arch/ARQUITETURA-CLIENTE-TUI.md).
|
|
237
|
+
|
|
238
|
+
> A interface NIO (Ink) está na **fatia 2a** ([ADR 0008](docs/adr/0008-interface-nio-ink.md)).
|
|
239
|
+
> A paridade completa com o OpenCode (diff viewer, file tree, seletor de modelo…) é a 2b.
|
|
240
|
+
> Multi-cliente (OpenCode | Codex) e o ladder de failover entre modelos seguem
|
|
241
|
+
> parkeados em
|
|
212
242
|
> [`docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md`](docs/arch/ARQUITETURA-CLIENTES-MULTI-FUTURO.md)
|
|
213
243
|
> ([ADR 0004](docs/adr/0004-operador-ia-unico.md)).
|
|
214
244
|
|
|
@@ -220,10 +250,12 @@ Operações do CLI, **sem o binário na frente** (declarado no cabeçalho da tab
|
|
|
220
250
|
Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --help`.
|
|
221
251
|
|
|
222
252
|
<!-- COMMANDS:START -->
|
|
223
|
-
<!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`,
|
|
253
|
+
<!-- gerado por `bun run gen:docs` — não edite à mão. binário `nio`, 42 comandos. -->
|
|
224
254
|
|
|
225
255
|
| Comando | Descrição |
|
|
226
256
|
| --- | --- |
|
|
257
|
+
| `ai` | Abre a interface NIO da sessão ativa (Headroom + opencode serve + Ink) |
|
|
258
|
+
| `ai status` | Estado do Headroom (proxy obrigatório do client de IA) |
|
|
227
259
|
| `clean-legacy` | Remove commands/skills legados (substituídos) de ~/.claude e ~/.codex |
|
|
228
260
|
| `completion [shell]` | Imprime o script de autocomplete (bash\|zsh\|fish). |
|
|
229
261
|
| `config` | Config compartilhada da equipe (~/.nio/config.env) |
|
|
@@ -235,6 +267,10 @@ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --
|
|
|
235
267
|
| `docker compose <action> [service]` | Wrapper sobre `docker compose` do projeto (up\|down\|restart\|ps\|logs) |
|
|
236
268
|
| `docker create` | Cria e sobe um container (wizard ou flags) |
|
|
237
269
|
| `docker debug [container]` | Coleta o contexto de um container e entrega o diagnóstico pro operador de IA |
|
|
270
|
+
| `docker headroom` | Proxy de compressão de contexto — obrigatório pro `nio ai` (ADR 0007) |
|
|
271
|
+
| `docker headroom down` | Derruba o container do Headroom |
|
|
272
|
+
| `docker headroom status` | O Headroom está no ar? |
|
|
273
|
+
| `docker headroom up` | Sobe o container do Headroom |
|
|
238
274
|
| `docker orquest [instruction]` | Orquestra os serviços do projeto via compose, dirigido pelo operador (linguagem natural) |
|
|
239
275
|
| `docker portainer` | Abre o Portainer no navegador |
|
|
240
276
|
| `docker toolkit` | Infra NIO: Docker MCP Gateway + Portainer (docker/docker-compose.yml) |
|
|
@@ -248,7 +284,7 @@ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --
|
|
|
248
284
|
| `login` | Autentica via nio-gateway (túnel HTTP) e salva a sessão localmente (JWT) |
|
|
249
285
|
| `logout` | Encerra a sessão local e revoga a auth_session no banco |
|
|
250
286
|
| `plan` | Roda o engine pensante sobre o projeto e escreve/refina o plan.md da raiz. |
|
|
251
|
-
| `register` | Cria um novo usuário no banco (user_cli) |
|
|
287
|
+
| `register` | Cria um novo usuário no banco (user_cli) e já entra (login) |
|
|
252
288
|
| `security` | 2º fator do login (SMS OTP + códigos de backup) |
|
|
253
289
|
| `security disable-2fa` | Desativa o 2º fator |
|
|
254
290
|
| `security enable-2fa` | Ativa o 2º fator via SMS |
|
|
@@ -256,6 +292,7 @@ Gerada da fonte por `npm run gen:docs`. Ajuda de qualquer comando: `nio <cmd> --
|
|
|
256
292
|
| `security status` | Mostra o estado do 2º fator |
|
|
257
293
|
| `skills` | Skills, commands e agents do nio (lidos do repo aberto via cache) |
|
|
258
294
|
| `skills status` | Lista os docs do repo de skills (cache local ~/.nio/skills) |
|
|
295
|
+
| `start` | Conduz a esteira: config → gateway → login → sessão → OpenCode |
|
|
259
296
|
| `sync` | Instala/atualiza skills, commands e agents nos clientes configurados, a partir do bundle (idempotente); checa atualização do pacote |
|
|
260
297
|
| `validate-plan` | Lê o plan.md da raiz e roda o engine pensante para julgar se o plano precisa de uma spec antes de implementar. |
|
|
261
298
|
| `whoami` | Mostra o usuário autenticado |
|
|
@@ -449,7 +486,12 @@ background em qualquer comando (`update-notifier`).
|
|
|
449
486
|
| `Conteúdo de skills não encontrado` | cache `~/.nio/skills` vazio — rode `nio sync` com rede, ou `NIO_SKILLS_DIR` pra um checkout local |
|
|
450
487
|
| Sobraram comandos antigos | `nio clean-legacy` (`--dry-run` pra revisar antes) |
|
|
451
488
|
|
|
452
|
-
Sempre: `nio debug` mostra o estado de tudo com uma dica por item.
|
|
489
|
+
Sempre: `nio debug` mostra o estado de tudo com uma dica por item. E
|
|
490
|
+
`NIO_DEBUG=1 nio <cmd>` liga log verboso (`[nio:debug]` em stderr): `.env`
|
|
491
|
+
carregados, config resolvida, requests pro gateway, e stack trace completo nos erros.
|
|
492
|
+
|
|
493
|
+
O logo Matrix anima (chuva caindo) toda vez que aparece em terminal interativo.
|
|
494
|
+
`NIO_NO_ANIM=1` deixa ele sempre estático; fora de TTY (pipe/CI) já é estático.
|
|
453
495
|
|
|
454
496
|
---
|
|
455
497
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { ensureHeadroomRunning, HEADROOM_URL } from '../lib/headroom.js';
|
|
3
|
+
import { installOpencodeGlobal, NIO_OPERATOR_MODEL } from '../lib/clients/client-configs.js';
|
|
4
|
+
import { isBinaryInstalled } from '../lib/clients/client-install.js';
|
|
5
|
+
import { c, sym } from '../lib/colors.js';
|
|
6
|
+
import { dlog } from '../lib/debug.js';
|
|
7
|
+
export class HeadroomRequiredError extends Error {
|
|
8
|
+
constructor(detail) {
|
|
9
|
+
super(`Headroom é obrigatório pro client de IA (ADR 0007). ${detail}`);
|
|
10
|
+
this.name = 'HeadroomRequiredError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function ensureHeadroomAndWire(ensure = ensureHeadroomRunning) {
|
|
14
|
+
const h = await ensure();
|
|
15
|
+
if (!h.ok)
|
|
16
|
+
throw new HeadroomRequiredError(h.error ?? 'não consegui subir o Headroom.');
|
|
17
|
+
if (h.started)
|
|
18
|
+
console.log(` ${c.green(sym.ok)} Headroom no ar (${HEADROOM_URL}).`);
|
|
19
|
+
try {
|
|
20
|
+
installOpencodeGlobal([], undefined, HEADROOM_URL);
|
|
21
|
+
dlog('opencode.json: provider.opencode.options.baseURL =', HEADROOM_URL);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.warn(` ${c.yellow(sym.warn)} não gravei o baseURL no opencode.json: ${err.message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function launchAiClient(opts, deps = {}) {
|
|
28
|
+
const spawnFn = deps.spawnFn ?? spawn;
|
|
29
|
+
const isInstalled = deps.isInstalled ?? isBinaryInstalled;
|
|
30
|
+
await ensureHeadroomAndWire(deps.ensureHeadroom);
|
|
31
|
+
if (!isInstalled('opencode')) {
|
|
32
|
+
console.log(` ${c.yellow(sym.warn)} OpenCode não está no PATH. Instale com \`npm i -g opencode-ai\`.`);
|
|
33
|
+
return 127;
|
|
34
|
+
}
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
const child = spawnFn('opencode', ['run', '--model', NIO_OPERATOR_MODEL, opts.prompt], { stdio: 'inherit', cwd: opts.cwd });
|
|
37
|
+
child.on('exit', (code) => resolve(code ?? 0));
|
|
38
|
+
child.on('error', (err) => {
|
|
39
|
+
console.error(`[erro] Falha ao iniciar o OpenCode: ${err.message}`);
|
|
40
|
+
resolve(127);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ai-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-client.js","sourceRoot":"","sources":["../../src/app/ai-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAA6B,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,MAAc;QACxB,KAAK,CAAC,uDAAuD,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAaD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAA8C,qBAAqB;IAEnE,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,MAAM,IAAI,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,gCAAgC,CAAC,CAAC;IACxF,IAAI,CAAC,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,YAAY,IAAI,CAAC,CAAC;IACrF,IAAI,CAAC;QACH,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,oDAAoD,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA4C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAqC,EACrC,OAAqB,EAAE;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,iBAAiB,CAAC;IAE1D,MAAM,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEjD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mEAAmE,CAC3F,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CACnB,UAAU,EACV,CAAC,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,EACnD,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CACpC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,uCAAuC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { NIO_OPERATOR_MODEL } from '../lib/clients/client-configs.js';
|
|
1
|
+
import { launchAiClient, HeadroomRequiredError } from './ai-client.js';
|
|
3
2
|
import { CLUSTER_STACK } from '../lib/docker.js';
|
|
4
3
|
const PREAMBLE = [
|
|
5
4
|
'Você é o operador de infra Docker desta máquina.',
|
|
@@ -56,13 +55,17 @@ export function parseServicesLine(output) {
|
|
|
56
55
|
return [];
|
|
57
56
|
return m[1].split(',').map((s) => s.trim()).filter(Boolean);
|
|
58
57
|
}
|
|
59
|
-
export function runOperator(prompt, opts = {}) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
export async function runOperator(prompt, opts = {}) {
|
|
59
|
+
try {
|
|
60
|
+
return await launchAiClient({ cwd: opts.cwd ?? process.cwd(), prompt });
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err instanceof HeadroomRequiredError) {
|
|
64
|
+
console.error(`[erro] ${err.message}`);
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
66
69
|
}
|
|
67
70
|
export function parseStackServices(stdout) {
|
|
68
71
|
return stdout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-manager.js","sourceRoot":"","sources":["../../src/app/docker-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"docker-manager.js","sourceRoot":"","sources":["../../src/app/docker-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAajD,MAAM,QAAQ,GAAG;IACf,kDAAkD;IAClD,oFAAoF;IACpF,oFAAoF;CACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAGb,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,OAAO;QACL,QAAQ;QACR,EAAE;QACF,oCAAoC,GAAG,CAAC,SAAS,oDAAoD;QACrG,yFAAyF;QACzF,EAAE;QACF,sBAAsB;QACtB,GAAG,CAAC,EAAE;QACN,EAAE;QACF,mBAAmB,GAAG,CAAC,SAAS,aAAa;QAC7C,GAAG,CAAC,IAAI;QACR,EAAE;QACF,sBAAsB,GAAG,CAAC,SAAS,eAAe;QAClD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,WAAmB,EAAE,MAAe;IAC1F,OAAO;QACL,QAAQ;QACR,EAAE;QACF,YAAY,WAAW,EAAE;QACzB,WAAW,WAAW,EAAE;QACxB,EAAE;QACF,MAAM;YACJ,CAAC,CAAC,uHAAuH;YACzH,CAAC,CAAC,wHAAwH;KAC7H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,WAAmB;IACzE,OAAO;QACL,QAAQ;QACR,EAAE;QACF,YAAY,WAAW,EAAE;QACzB,mDAAmD,aAAa,SAAS,WAAW,EAAE;QACtF,EAAE;QACF,8DAA8D;QAC9D,gIAAgI;QAChI,yCAAyC,aAAa,KAAK;QAC3D,2CAA2C,aAAa,6DAA6D;QACrH,EAAE;QACF,kHAAkH;KACnH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,OAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,IAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAA4D,CAAC;IAC1F,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC;AACxC,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAuB,EACvB,OAAgB,EAChB,KAA0B;IAE1B,MAAM,KAAK,GAA4B,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,MAAM,GAA4B,EAAE,GAAG,CAAE,KAAK,CAAC,MAAkC,IAAI,EAAE,CAAC,EAAE,CAAC;IACjG,IAAI,KAAK;QAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;;QAC7B,OAAO,MAAM,CAAC,OAAO,CAAC;IAC3B,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAsB,EACtB,SAAiB;IAEjB,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO;QACL,SAAS;QACT,EAAE,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE;QAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;QACrC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { brand } from "../../brand.js";
|
|
2
|
+
import { c, sym } from "../../lib/colors.js";
|
|
3
|
+
import { loadSession } from "../../lib/auth/session-store.js";
|
|
4
|
+
import { createSessionRepository } from "../../adapters/pg/session-repository.js";
|
|
5
|
+
import { headroomHealthy, HEADROOM_URL } from "../../lib/headroom.js";
|
|
6
|
+
import { HeadroomRequiredError } from "../../app/ai-client.js";
|
|
7
|
+
async function requireActiveSession() {
|
|
8
|
+
const stored = await loadSession();
|
|
9
|
+
if (!stored) {
|
|
10
|
+
console.error(`${c.yellow(sym.warn)} Não autenticado. Rode ${c.cyan(`${brand.name} login`)}.`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
let session;
|
|
14
|
+
try {
|
|
15
|
+
session = await createSessionRepository().findActiveByUser(stored.userId);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
console.error(`${c.red(sym.err)} Falha no banco: ${err.message}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
if (!session) {
|
|
23
|
+
console.error(`${c.yellow(sym.warn)} Nenhuma sessão ativa. Rode ${c.cyan(`${brand.name} init`)} ou ` +
|
|
24
|
+
`${c.cyan(`${brand.name} sessions activate <id>`)}.`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
return session;
|
|
28
|
+
}
|
|
29
|
+
async function runAi() {
|
|
30
|
+
const session = await requireActiveSession();
|
|
31
|
+
try {
|
|
32
|
+
const { launchNioTui } = await import("../../tui/index.js");
|
|
33
|
+
const code = await launchNioTui({ cwd: session.projectPath });
|
|
34
|
+
if (code !== 0)
|
|
35
|
+
process.exitCode = code;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err instanceof HeadroomRequiredError) {
|
|
39
|
+
console.error(`${c.red(sym.err)} ${err.message}`);
|
|
40
|
+
console.error(c.dim(` suba o Docker e rode \`${brand.name} docker headroom up\`, ou tente de novo.`));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function registerAiCommand(program) {
|
|
47
|
+
const ai = program
|
|
48
|
+
.command("ai")
|
|
49
|
+
.description("Abre a interface NIO da sessão ativa (Headroom + opencode serve + Ink)")
|
|
50
|
+
.action(runAi);
|
|
51
|
+
ai
|
|
52
|
+
.command("status")
|
|
53
|
+
.description("Estado do Headroom (proxy obrigatório do client de IA)")
|
|
54
|
+
.action(async () => {
|
|
55
|
+
const up = await headroomHealthy();
|
|
56
|
+
console.log(`${up ? c.green(sym.ok) : c.red(sym.err)} Headroom ${c.dim(HEADROOM_URL)} — ${up ? "no ar" : "fora"}`);
|
|
57
|
+
if (!up)
|
|
58
|
+
console.log(c.dim(` suba com \`${brand.name} docker headroom up\``));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../../src/cli/commands/ai.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,KAAK,UAAU,oBAAoB;IACjC,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,OAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,uBAAuB,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAqB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM;YACpF,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,yBAAyB,CAAC,GAAG,CACvD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,IAAI,0CAA0C,CAAC,CAAC,CAAC;YACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjB,EAAE;SACC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CACtG,CAAC;QACF,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { input, password } from "../../lib/prompts.js";
|
|
2
2
|
import { brand } from "../../brand.js";
|
|
3
|
-
import {
|
|
3
|
+
import { animateMatrixLogo } from "../../matrix-logo.js";
|
|
4
4
|
import { startSpinner } from "../../lib/spinner.js";
|
|
5
5
|
import { c, sym } from "../../lib/colors.js";
|
|
6
6
|
import { createUserRepository } from "../../adapters/pg/user-repository.js";
|
|
7
7
|
import { gatewayLogin, gatewayLogout, gatewayVerify2fa, } from "../../lib/auth/gateway-client.js";
|
|
8
8
|
import { loadSession, saveSession, clearSession } from "../../lib/auth/session-store.js";
|
|
9
9
|
import { ensureConfig } from "../../lib/auth/nio-config.js";
|
|
10
|
+
import { ensureGatewayRunning } from "../../lib/auth/gateway-process.js";
|
|
11
|
+
import { continueChain } from "../flows/onboarding.js";
|
|
12
|
+
import { box, cmd } from "../../lib/colors.js";
|
|
10
13
|
import { authCopy } from "../copy.js";
|
|
11
14
|
async function resolveSecondFactor(challengeId, phoneHint) {
|
|
12
15
|
console.log(` ${c.dim(`código enviado por SMS para ${phoneHint}`)}`);
|
|
@@ -30,39 +33,95 @@ async function resolveSecondFactor(challengeId, phoneHint) {
|
|
|
30
33
|
return null;
|
|
31
34
|
}
|
|
32
35
|
const MIN_PASSWORD_LENGTH = 8;
|
|
33
|
-
function
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
async function requireGateway() {
|
|
37
|
+
const result = await ensureGatewayRunning();
|
|
38
|
+
if (result.ok)
|
|
39
|
+
return;
|
|
40
|
+
console.error(box(`${c.yellow(sym.warn)} ${c.bold("O nio-gateway não está no ar e não consegui subir sozinho.")}\n` +
|
|
41
|
+
`${c.dim("abra noutra janela:")} ${cmd("nio-gateway")}\n` +
|
|
42
|
+
`${c.dim("e tente de novo.")}`, { borderColor: "yellow", title: "Gateway necessário" }));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
export async function runLogin() {
|
|
46
|
+
await ensureConfig({ interactive: true });
|
|
47
|
+
await requireGateway();
|
|
48
|
+
const name = await input({ message: authCopy.login.namePrompt });
|
|
49
|
+
const pass = await password({ message: authCopy.login.passwordPrompt, mask: "*" });
|
|
50
|
+
const spinner = startSpinner("Autenticando...");
|
|
51
|
+
let session;
|
|
52
|
+
try {
|
|
53
|
+
const result = await gatewayLogin(name.trim(), pass);
|
|
54
|
+
if (!result) {
|
|
55
|
+
spinner.fail(authCopy.login.invalidCredentials);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
spinner.stop();
|
|
59
|
+
if (result.step === "done") {
|
|
60
|
+
session = result;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const s = await resolveSecondFactor(result.challengeId, result.phoneHint);
|
|
64
|
+
if (!s) {
|
|
65
|
+
console.error(`${c.red(sym.err)} 2º fator não concluído.`);
|
|
54
66
|
process.exit(1);
|
|
55
67
|
}
|
|
56
|
-
|
|
57
|
-
spinner.stop();
|
|
58
|
-
console.log(renderMatrixLogo());
|
|
59
|
-
console.log(`[ok] Usuário criado: ${user.name} (id ${user.id})`);
|
|
60
|
-
console.log(`Rode \`${brand.name} login\` pra autenticar.`);
|
|
68
|
+
session = s;
|
|
61
69
|
}
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
spinner.fail(`Falha ao autenticar: ${err.message}`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
await saveSession({
|
|
76
|
+
userId: session.userId,
|
|
77
|
+
name: session.name,
|
|
78
|
+
token: session.token,
|
|
79
|
+
sessionId: session.sessionId,
|
|
80
|
+
loggedInAt: new Date().toISOString(),
|
|
81
|
+
expiresAt: session.expiresAt,
|
|
82
|
+
});
|
|
83
|
+
await animateMatrixLogo();
|
|
84
|
+
console.log("[ok] Autenticado!");
|
|
85
|
+
console.log(`Usuário: ${session.name}`);
|
|
86
|
+
console.log(`ID: ${session.userId}`);
|
|
87
|
+
}
|
|
88
|
+
export async function runRegister() {
|
|
89
|
+
await ensureConfig({ interactive: true });
|
|
90
|
+
const name = await input({
|
|
91
|
+
message: authCopy.register.namePrompt,
|
|
92
|
+
validate: (v) => v.trim().length > 0 || authCopy.register.nameInvalid,
|
|
93
|
+
});
|
|
94
|
+
const pass = await password({
|
|
95
|
+
message: authCopy.register.passwordPrompt,
|
|
96
|
+
mask: "*",
|
|
97
|
+
validate: (v) => v.length >= MIN_PASSWORD_LENGTH || authCopy.register.passwordInvalid,
|
|
98
|
+
});
|
|
99
|
+
const repo = createUserRepository();
|
|
100
|
+
const spinner = startSpinner("Criando usuário...");
|
|
101
|
+
try {
|
|
102
|
+
const existing = await repo.findByName(name.trim());
|
|
103
|
+
if (existing) {
|
|
104
|
+
spinner.fail(`Usuário "${name.trim()}" já existe.`);
|
|
64
105
|
process.exit(1);
|
|
65
106
|
}
|
|
107
|
+
const user = await repo.create({ name: name.trim(), password: pass });
|
|
108
|
+
spinner.stop();
|
|
109
|
+
console.log(`${c.green(sym.ok)} Usuário criado: ${user.name} (id ${user.id})`);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
spinner.fail(`Falha ao criar usuário: ${err.message}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
console.log(c.dim("\nVamos entrar:"));
|
|
116
|
+
await runLogin();
|
|
117
|
+
}
|
|
118
|
+
function registerRegisterCommand(program) {
|
|
119
|
+
program
|
|
120
|
+
.command("register")
|
|
121
|
+
.description("Cria um novo usuário no banco (user_cli) e já entra (login)")
|
|
122
|
+
.action(async () => {
|
|
123
|
+
await runRegister();
|
|
124
|
+
await continueChain({ from: "command" });
|
|
66
125
|
});
|
|
67
126
|
}
|
|
68
127
|
function registerLoginCommand(program) {
|
|
@@ -70,46 +129,8 @@ function registerLoginCommand(program) {
|
|
|
70
129
|
.command("login")
|
|
71
130
|
.description("Autentica via nio-gateway (túnel HTTP) e salva a sessão localmente (JWT)")
|
|
72
131
|
.action(async () => {
|
|
73
|
-
await
|
|
74
|
-
|
|
75
|
-
const pass = await password({ message: authCopy.login.passwordPrompt, mask: "*" });
|
|
76
|
-
const spinner = startSpinner("Autenticando...");
|
|
77
|
-
let session;
|
|
78
|
-
try {
|
|
79
|
-
const result = await gatewayLogin(name.trim(), pass);
|
|
80
|
-
if (!result) {
|
|
81
|
-
spinner.fail(authCopy.login.invalidCredentials);
|
|
82
|
-
process.exit(1);
|
|
83
|
-
}
|
|
84
|
-
spinner.stop();
|
|
85
|
-
if (result.step === "done") {
|
|
86
|
-
session = result;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
const s = await resolveSecondFactor(result.challengeId, result.phoneHint);
|
|
90
|
-
if (!s) {
|
|
91
|
-
console.error(`${c.red(sym.err)} 2º fator não concluído.`);
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
session = s;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
spinner.fail(`Falha ao autenticar: ${err.message}`);
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
101
|
-
await saveSession({
|
|
102
|
-
userId: session.userId,
|
|
103
|
-
name: session.name,
|
|
104
|
-
token: session.token,
|
|
105
|
-
sessionId: session.sessionId,
|
|
106
|
-
loggedInAt: new Date().toISOString(),
|
|
107
|
-
expiresAt: session.expiresAt,
|
|
108
|
-
});
|
|
109
|
-
console.log(renderMatrixLogo());
|
|
110
|
-
console.log("[ok] Autenticado!");
|
|
111
|
-
console.log(`Usuário: ${session.name}`);
|
|
112
|
-
console.log(`ID: ${session.userId}`);
|
|
132
|
+
await runLogin();
|
|
133
|
+
await continueChain({ from: "command" });
|
|
113
134
|
});
|
|
114
135
|
}
|
|
115
136
|
function registerLogoutCommand(program) {
|
|
@@ -144,7 +165,7 @@ function registerWhoamiCommand(program) {
|
|
|
144
165
|
console.log(JSON.stringify(session, null, 2));
|
|
145
166
|
return;
|
|
146
167
|
}
|
|
147
|
-
|
|
168
|
+
await animateMatrixLogo();
|
|
148
169
|
console.log(`Usuário: ${session.name}`);
|
|
149
170
|
console.log(`ID: ${session.userId}`);
|
|
150
171
|
console.log(`Login em: ${session.loggedInAt}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { c, sym } from "../../lib/colors.js";
|
|
2
2
|
import { CONFIG_FILE, checkConfig, runConfigWizard } from "../../lib/auth/nio-config.js";
|
|
3
|
+
import { continueChain } from "../flows/onboarding.js";
|
|
3
4
|
const LABEL = { missing: "faltando", invalid: "inválido", unreachable: "sem conexão" };
|
|
4
5
|
async function runCheck(opts) {
|
|
5
6
|
const problems = await checkConfig();
|
|
@@ -30,8 +31,9 @@ export function registerConfigCommand(program) {
|
|
|
30
31
|
.command("setup")
|
|
31
32
|
.description("Wizard: cola os valores do time, testa a conexão e salva")
|
|
32
33
|
.action(async () => {
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
if (!(await runConfigWizard()))
|
|
35
|
+
process.exit(1);
|
|
36
|
+
await continueChain({ from: "command" });
|
|
35
37
|
});
|
|
36
38
|
config
|
|
37
39
|
.command("path")
|