@neetru/cli 2.28.7 → 2.28.10
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/CHANGELOG.md +78 -0
- package/README.md +25 -1
- package/dist/commands/admin/oidc-login.d.ts +18 -0
- package/dist/commands/admin/oidc-login.js +68 -3
- package/dist/commands/admin/oidc-login.js.map +1 -1
- package/dist/commands/admin/sdk-credential.js +11 -6
- package/dist/commands/admin/sdk-credential.js.map +1 -1
- package/dist/commands/agent-release.d.ts +2 -0
- package/dist/commands/agent-release.js +41 -29
- package/dist/commands/agent-release.js.map +1 -1
- package/dist/commands/agent-write.d.ts +1 -0
- package/dist/commands/agent-write.js +4 -0
- package/dist/commands/agent-write.js.map +1 -1
- package/dist/commands/ai-models.js +9 -4
- package/dist/commands/ai-models.js.map +1 -1
- package/dist/commands/archive.js +9 -2
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/auth.js +17 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/autocomplete.d.ts +1 -1
- package/dist/commands/autocomplete.js +2 -0
- package/dist/commands/autocomplete.js.map +1 -1
- package/dist/commands/chat-menu.js +20 -6
- package/dist/commands/chat-menu.js.map +1 -1
- package/dist/commands/chat.d.ts +14 -0
- package/dist/commands/chat.js +32 -4
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.js +7 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/db-move.d.ts +204 -0
- package/dist/commands/db-move.js +890 -0
- package/dist/commands/db-move.js.map +1 -0
- package/dist/commands/db.d.ts +14 -3
- package/dist/commands/db.js +102 -67
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.js +42 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev-up.d.ts +5 -0
- package/dist/commands/dev-up.js +29 -4
- package/dist/commands/dev-up.js.map +1 -1
- package/dist/commands/doctor.js +12 -6
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domains.js +48 -36
- package/dist/commands/domains.js.map +1 -1
- package/dist/commands/init.d.ts +0 -8
- package/dist/commands/init.js +14 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.js +18 -21
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mobile.d.ts +26 -0
- package/dist/commands/mobile.js +344 -0
- package/dist/commands/mobile.js.map +1 -0
- package/dist/commands/ops.d.ts +20 -0
- package/dist/commands/ops.js +70 -17
- package/dist/commands/ops.js.map +1 -1
- package/dist/commands/products-db.d.ts +1 -0
- package/dist/commands/products-db.js +15 -15
- package/dist/commands/products-db.js.map +1 -1
- package/dist/commands/promote.js +13 -32
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/schema.d.ts +4 -0
- package/dist/commands/schema.js +25 -16
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/servers.d.ts +2 -3
- package/dist/commands/servers.js +4 -7
- package/dist/commands/servers.js.map +1 -1
- package/dist/commands/smoke.d.ts +123 -0
- package/dist/commands/smoke.js +529 -0
- package/dist/commands/smoke.js.map +1 -0
- package/dist/commands/vm-memory.d.ts +53 -0
- package/dist/commands/vm-memory.js +307 -0
- package/dist/commands/vm-memory.js.map +1 -0
- package/dist/commands/vm.d.ts +2 -0
- package/dist/commands/vm.js +8 -0
- package/dist/commands/vm.js.map +1 -1
- package/dist/commands/webhooks.d.ts +2 -0
- package/dist/commands/webhooks.js +7 -0
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/index.js +403 -21
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-artifact-url.d.ts +19 -0
- package/dist/lib/agent-artifact-url.js +48 -0
- package/dist/lib/agent-artifact-url.js.map +1 -0
- package/dist/lib/api-client.d.ts +11 -3
- package/dist/lib/api-client.js +55 -24
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/api-error.js +32 -1
- package/dist/lib/api-error.js.map +1 -1
- package/dist/lib/auth.d.ts +2 -9
- package/dist/lib/auth.js +34 -18
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/cli-write.d.ts +31 -0
- package/dist/lib/cli-write.js +51 -2
- package/dist/lib/cli-write.js.map +1 -1
- package/dist/lib/mobile-local/index.d.ts +7 -0
- package/dist/lib/mobile-local/index.js +7 -0
- package/dist/lib/mobile-local/index.js.map +1 -0
- package/dist/lib/mobile-local/mobile-json.d.ts +57 -0
- package/dist/lib/mobile-local/mobile-json.js +169 -0
- package/dist/lib/mobile-local/mobile-json.js.map +1 -0
- package/dist/lib/product-config.d.ts +5 -0
- package/dist/lib/product-config.js +37 -0
- package/dist/lib/product-config.js.map +1 -0
- package/dist/lib/telemetry.d.ts +7 -0
- package/dist/lib/telemetry.js +9 -0
- package/dist/lib/telemetry.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/api-client.js
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { config } from './config.js';
|
|
2
2
|
import { getActiveTokenSync } from './token-resolver.js';
|
|
3
|
-
import { classifyApiUrl } from './url-allowlist.js';
|
|
3
|
+
import { classifyApiUrl, isOverrideEnabled } from './url-allowlist.js';
|
|
4
|
+
import { CLI_VERSION } from '../version.js';
|
|
5
|
+
import { getCurrentCommandName } from './telemetry.js';
|
|
4
6
|
export class CliApiError extends Error {
|
|
5
7
|
status;
|
|
6
8
|
code;
|
|
7
|
-
|
|
9
|
+
/**
|
|
10
|
+
* `x-correlation-id` carimbado pelo Core na resposta (LABS #6, 2026-09-28).
|
|
11
|
+
* O Core loga TODA request sob esse id; expor no rodapé do erro fecha o loop
|
|
12
|
+
* de debug de campo (usuário informa o `ref:` ao suporte).
|
|
13
|
+
*/
|
|
14
|
+
correlationId;
|
|
15
|
+
constructor(status, code, message, correlationId) {
|
|
8
16
|
super(message);
|
|
9
17
|
this.name = 'CliApiError';
|
|
10
18
|
this.status = status;
|
|
11
19
|
this.code = code;
|
|
20
|
+
this.correlationId = correlationId;
|
|
12
21
|
}
|
|
13
22
|
}
|
|
14
23
|
export class CliNetworkError extends Error {
|
|
@@ -23,38 +32,47 @@ function buildBaseUrl() {
|
|
|
23
32
|
const raw = config.get('neetruApiUrl') ?? 'https://api.neetru.com';
|
|
24
33
|
return raw.replace(/\/+$/, '');
|
|
25
34
|
}
|
|
26
|
-
// MASTER-HIGH-049 (
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
+
// MASTER-HIGH-049 → LABS #4/#19 (2026-09-28): FAIL-CLOSED. Antes só emitia um
|
|
36
|
+
// warning one-shot e mandava o Bearer pro host não-confiável assim mesmo — um
|
|
37
|
+
// `config.json` editado/copiado exfiltrava o token `nrt_` com um mero aviso.
|
|
38
|
+
// Agora BLOQUEIA (throw) qualquer host fora da allowlist, salvo override
|
|
39
|
+
// explícito (`NEETRU_ALLOW_UNTRUSTED_URL=1`). O bypass NÃO compartilha mais o
|
|
40
|
+
// kill-switch do nag legado (`NEETRU_SUPPRESS_LEGACY_WARNINGS`) — alerta de
|
|
41
|
+
// segurança não pode morrer junto com ruído de deprecação.
|
|
42
|
+
export function assertTrustedApiHost(rawUrl) {
|
|
43
|
+
if (isOverrideEnabled())
|
|
35
44
|
return;
|
|
36
45
|
const result = classifyApiUrl(rawUrl);
|
|
37
46
|
if (result.trusted)
|
|
38
47
|
return;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
`
|
|
48
|
+
throw new CliNetworkError(`Host fora da allowlist (${result.host}): ${result.reason ?? 'não confiável'}. ` +
|
|
49
|
+
`O Bearer token da CLI NÃO foi enviado. Se este host é confiável, rode com ` +
|
|
50
|
+
`NEETRU_ALLOW_UNTRUSTED_URL=1.`);
|
|
42
51
|
}
|
|
43
|
-
/**
|
|
52
|
+
/** @deprecated Nome legado — agora é fail-closed (throw), não só warning. Use `assertTrustedApiHost`. */
|
|
53
|
+
export const maybeWarnUntrustedHost = assertTrustedApiHost;
|
|
54
|
+
/** @deprecated Sem estado agora (fail-closed não tem flag one-shot). No-op mantido p/ compat de teste. */
|
|
44
55
|
export function _resetUntrustedHostWarningForTests() {
|
|
45
|
-
|
|
56
|
+
/* no-op */
|
|
46
57
|
}
|
|
47
58
|
export async function apiRequest(path, opts = {}) {
|
|
48
59
|
const baseUrl = buildBaseUrl();
|
|
49
60
|
const url = `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
|
|
50
|
-
//
|
|
51
|
-
|
|
61
|
+
// LABS #4 (2026-09-28): fail-closed — bloqueia host fora da allowlist ANTES
|
|
62
|
+
// de anexar o Bearer (era só warning que mandava o token assim mesmo).
|
|
63
|
+
assertTrustedApiHost(baseUrl);
|
|
52
64
|
// MASTER-HIGH-048 (2.11.0): prefere auth.json (canonico) sobre Conf (legacy).
|
|
53
65
|
const token = opts.token ?? getActiveTokenSync();
|
|
54
66
|
const headers = {
|
|
55
67
|
'content-type': 'application/json',
|
|
56
68
|
accept: 'application/json',
|
|
57
69
|
};
|
|
70
|
+
// LABS #5 (2026-09-28): carimba versão + comando (lineage) do CLI pra o Core
|
|
71
|
+
// casar erro de campo com o cliente. Só o nome do comando, nunca args (PII).
|
|
72
|
+
headers['x-neetru-cli-version'] = CLI_VERSION;
|
|
73
|
+
const cliCommand = getCurrentCommandName();
|
|
74
|
+
if (cliCommand)
|
|
75
|
+
headers['x-neetru-cli-command'] = cliCommand;
|
|
58
76
|
if (token)
|
|
59
77
|
headers['authorization'] = `Bearer ${token}`;
|
|
60
78
|
if (opts.headers) {
|
|
@@ -132,9 +150,13 @@ export async function apiRequest(path, opts = {}) {
|
|
|
132
150
|
let message = `Erro HTTP ${response.status}`;
|
|
133
151
|
if (errBody?.error) {
|
|
134
152
|
if (typeof errBody.error === 'string') {
|
|
135
|
-
// Formato RFC
|
|
136
|
-
code
|
|
137
|
-
|
|
153
|
+
// Formato RFC. Auditoria cli/v1 2026-09-29: o 401 do `requireCliAuth`
|
|
154
|
+
// passou a mandar também `code`/`message` (formato interno) ao lado de
|
|
155
|
+
// `error`/`error_description` — `code` explícito vence o `error` legado.
|
|
156
|
+
code = typeof errBody.code === 'string' && errBody.code ? errBody.code : errBody.error;
|
|
157
|
+
message =
|
|
158
|
+
errBody.error_description ??
|
|
159
|
+
(typeof errBody.message === 'string' && errBody.message ? errBody.message : errBody.error);
|
|
138
160
|
}
|
|
139
161
|
else {
|
|
140
162
|
// Formato interno Neetru
|
|
@@ -145,7 +167,9 @@ export async function apiRequest(path, opts = {}) {
|
|
|
145
167
|
else if (typeof parsed === 'string' && parsed.trim() !== '') {
|
|
146
168
|
message = parsed;
|
|
147
169
|
}
|
|
148
|
-
|
|
170
|
+
// LABS #6 (2026-09-28): captura o x-correlation-id do Core p/ o rodapé do erro.
|
|
171
|
+
const correlationId = response.headers.get('x-correlation-id') ?? undefined;
|
|
172
|
+
throw new CliApiError(response.status, code, message, correlationId);
|
|
149
173
|
}
|
|
150
174
|
return parsed;
|
|
151
175
|
}
|
|
@@ -160,13 +184,19 @@ export async function apiRequest(path, opts = {}) {
|
|
|
160
184
|
export async function* apiStream(path, opts = {}) {
|
|
161
185
|
const baseUrl = buildBaseUrl();
|
|
162
186
|
const url = `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
|
|
163
|
-
|
|
187
|
+
// LABS #4 (2026-09-28): fail-closed também no stream.
|
|
188
|
+
assertTrustedApiHost(baseUrl);
|
|
164
189
|
// MASTER-HIGH-048 (2.11.0): mesmo helper aplica ao stream NDJSON.
|
|
165
190
|
const token = opts.token ?? getActiveTokenSync();
|
|
166
191
|
const headers = {
|
|
167
192
|
'content-type': 'application/json',
|
|
168
193
|
accept: 'application/x-ndjson',
|
|
169
194
|
};
|
|
195
|
+
// LABS #5 (2026-09-28): versão + comando do CLI (sem PII).
|
|
196
|
+
headers['x-neetru-cli-version'] = CLI_VERSION;
|
|
197
|
+
const cliCommand = getCurrentCommandName();
|
|
198
|
+
if (cliCommand)
|
|
199
|
+
headers['x-neetru-cli-command'] = cliCommand;
|
|
170
200
|
if (token)
|
|
171
201
|
headers['authorization'] = `Bearer ${token}`;
|
|
172
202
|
let response;
|
|
@@ -198,7 +228,8 @@ export async function* apiStream(path, opts = {}) {
|
|
|
198
228
|
if (text.trim())
|
|
199
229
|
message = text;
|
|
200
230
|
}
|
|
201
|
-
|
|
231
|
+
const correlationId = response.headers.get('x-correlation-id') ?? undefined;
|
|
232
|
+
throw new CliApiError(response.status, code, message, correlationId);
|
|
202
233
|
}
|
|
203
234
|
if (!response.body)
|
|
204
235
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAOvD,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,MAAM,CAAS;IACf,IAAI,CAAS;IACtB;;;;OAIG;IACM,aAAa,CAAU;IAChC,YAAY,MAAc,EAAE,IAAY,EAAE,OAAe,EAAE,aAAsB;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,KAAK,CAAW;IACzB,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AA2BD,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,wBAAwB,CAAC;IACnE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,2DAA2D;AAC3D,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,IAAI,iBAAiB,EAAE;QAAE,OAAO;IAChC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,IAAI,eAAe,CACvB,2BAA2B,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,IAAI,eAAe,IAAI;QAC9E,4EAA4E;QAC5E,+BAA+B,CAClC,CAAC;AACJ,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,0GAA0G;AAC1G,MAAM,UAAU,kCAAkC;IAChD,WAAW;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,OAAuB,EAAE;IACzE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACpE,4EAA4E;IAC5E,uEAAuE;IACvE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAC;IAEjD,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IACF,6EAA6E;IAC7E,6EAA6E;IAC7E,OAAO,CAAC,sBAAsB,CAAC,GAAG,WAAW,CAAC;IAC9C,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAC3C,IAAI,UAAU;QAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC;IAC7D,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,iFAAiF;IACjF,mFAAmF;IACnF,kFAAkF;IAClF,mFAAmF;IACnF,iFAAiF;IACjF,uEAAuE;IACvE,EAAE;IACF,8EAA8E;IAC9E,+EAA+E;IAC/E,4EAA4E;IAC5E,wDAAwD;IACxD,EAAE;IACF,6EAA6E;IAC7E,uFAAuF;IACvF,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;IACpD,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAgB,IAAI,CAAC,MAAM;QACrC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC,CAAC,aAAa,CAAC;IAElB,uEAAuE;IACvE,mEAAmE;IACnE,6EAA6E;IAC7E,iEAAiE;IACjE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvF,wEAAwE;IACxE,4EAA4E;IAC5E,2EAA2E;IAC3E,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;YAC5B,OAAO;YACP,IAAI,EAAE,cAAc;YACpB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,+EAA+E;QAC/E,+EAA+E;QAC/E,MAAM,SAAS,GACb,GAAG,CAAC,IAAI,KAAK,cAAc;YAC3B,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAK,GAAG,CAAC,KAA2B,EAAE,IAAI,KAAK,cAAc,CAAC;YACxF,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,SAAS;YAC3B,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,GAAG,EAAE;YAC3E,CAAC,CAAC,sBAAsB,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,2EAA2E;IAC3E,gEAAgE;IAEhE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,GAAY,SAAS,CAAC;IAChC,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,2DAA2D;QAC3D,mEAAmE;QACnE,MAAM,OAAO,GAAG,MAEH,CAAC;QAEd,IAAI,IAAI,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC;QAE7C,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACtC,sEAAsE;gBACtE,uEAAuE;gBACvE,yEAAyE;gBACzE,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;gBACvF,OAAO;oBACL,OAAO,CAAC,iBAAiB;wBACzB,CAAC,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/F,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;gBAClC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9D,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QAED,gFAAgF;QAChF,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;QAC5E,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAC9B,IAAY,EACZ,OAAsB,EAAE;IAExB,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACpE,sDAAsD;IACtD,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,kEAAkE;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAC;IAEjD,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,sBAAsB;KAC/B,CAAC;IACF,2DAA2D;IAC3D,OAAO,CAAC,sBAAsB,CAAC,GAAG,WAAW,CAAC;IAC9C,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAC3C,IAAI,UAAU;QAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC;IAC7D,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAExD,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;YAC5B,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACrE,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CACvB,sBAAsB,GAAG,KAAM,KAAe,CAAC,OAAO,EAAE,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,IAAI,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkC,CAAC;YAClE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAE,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;iBACjE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;gBAClC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;QAC5E,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO;IAE3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC9B,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;oBAC9B,CAAC;oBAAC,MAAM,CAAC;wBACP,2DAA2D;oBAC7D,CAAC;gBACH,CAAC;gBACD,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/lib/api-error.js
CHANGED
|
@@ -33,11 +33,42 @@ function emit(json, payload, text) {
|
|
|
33
33
|
else
|
|
34
34
|
log.error(text);
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* A mensagem do 401 vale ser exibida? O Core legado mandava só
|
|
38
|
+
* `{ error: 'Unauthorized' }` (o parser vira message='Unauthorized') — aí o
|
|
39
|
+
* fallback "Execute: neetru login" é mais útil. O Core novo manda
|
|
40
|
+
* `error_description`/`message` descritivos.
|
|
41
|
+
*/
|
|
42
|
+
function isInformative401Message(message) {
|
|
43
|
+
const m = (message ?? '').trim();
|
|
44
|
+
if (!m)
|
|
45
|
+
return false;
|
|
46
|
+
return !/^(unauthori[sz]ed|erro http 401)$/i.test(m);
|
|
47
|
+
}
|
|
36
48
|
export function handleApiError(error, json) {
|
|
37
49
|
if (error instanceof CliApiError) {
|
|
38
50
|
const s = error.status;
|
|
39
51
|
if (s === 401) {
|
|
40
|
-
|
|
52
|
+
// Auditoria cli/v1 2026-09-29: o 401 do Core agora carrega `message`/
|
|
53
|
+
// `error_description` úteis (e o step-up MFA responde `401 mfa_required`).
|
|
54
|
+
// Antes TODO 401 virava "Token inválido ou revogado" — inclusive o de MFA
|
|
55
|
+
// faltando, mandando o operador fazer `neetru login` à toa.
|
|
56
|
+
if (error.code === 'mfa_required') {
|
|
57
|
+
emit(json, { ok: false, error: 'mfa_required', code: error.code, status: s, message: error.message }, `Step-up MFA exigido: ${error.message}
|
|
58
|
+
` +
|
|
59
|
+
' Passe --mfa-token <código TOTP> ou rode `neetru auth mfa-session` (sessão de 1h).');
|
|
60
|
+
safeExit(API_ERROR_EXIT.unauthenticated);
|
|
61
|
+
}
|
|
62
|
+
const serverMsg = isInformative401Message(error.message) ? error.message : '';
|
|
63
|
+
emit(json, {
|
|
64
|
+
ok: false,
|
|
65
|
+
error: 'unauthorized',
|
|
66
|
+
...(error.code && error.code !== 'http_401' ? { code: error.code } : {}),
|
|
67
|
+
status: s,
|
|
68
|
+
message: error.message,
|
|
69
|
+
}, serverMsg
|
|
70
|
+
? `Não autenticado: ${serverMsg}${/neetru login/.test(serverMsg) ? '' : ' — execute: neetru login'}`
|
|
71
|
+
: 'Token inválido ou revogado. Execute: neetru login');
|
|
41
72
|
safeExit(API_ERROR_EXIT.unauthenticated);
|
|
42
73
|
}
|
|
43
74
|
if (s === 403) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-error.js","sourceRoot":"","sources":["../../src/lib/api-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,CAAC,EAAE,uBAAuB;IAClC,eAAe,EAAE,CAAC,EAAE,MAAM;IAC1B,SAAS,EAAE,CAAC,EAAE,MAAM;IACpB,MAAM,EAAE,CAAC,EAAE,4BAA4B;CAC/B,CAAC;AAEX,SAAS,IAAI,CAAC,IAAyB,EAAE,OAAgC,EAAE,IAAY;IACrF,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;;QAC1C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAc;IAC3D,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,CACF,IAAI,EACJ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api-error.js","sourceRoot":"","sources":["../../src/lib/api-error.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth.d.ts
CHANGED
|
@@ -18,14 +18,7 @@ export declare function saveToken(token: string, email: string): Promise<string>
|
|
|
18
18
|
* Usado para exibir o usuário logado no cabeçalho do CLI.
|
|
19
19
|
*/
|
|
20
20
|
export declare function resolveSessionEmail(): Promise<string | null>;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
*
|
|
24
|
-
* Helper interno usado por `getActiveTokenSync()` (em `token-resolver.ts`).
|
|
25
|
-
* Mantido aqui pra preservar o limite de escopo `auth.ts` = `auth.json`-only.
|
|
26
|
-
*
|
|
27
|
-
* Retorna `null` em qualquer falha (arquivo ausente, JSON invalido, token
|
|
28
|
-
* vazio). Pra erro detalhado, usar `loadToken()` async.
|
|
29
|
-
*/
|
|
21
|
+
/** Invalida o cache de auth.json (chamado após escrever/apagar o token). */
|
|
22
|
+
export declare function _invalidateAuthJsonCache(): void;
|
|
30
23
|
export declare function readAuthJsonSync(): NeetruAuth | null;
|
|
31
24
|
export declare function clearToken(): Promise<boolean>;
|
package/dist/lib/auth.js
CHANGED
|
@@ -86,6 +86,7 @@ export async function saveToken(token, email) {
|
|
|
86
86
|
// Em Windows alguns runtimes tratam mode 0600 como read-only flag;
|
|
87
87
|
// ignoramos erro silenciosamente.
|
|
88
88
|
}
|
|
89
|
+
_invalidateAuthJsonCache(); // LABS #17: token novo → invalida o cache de leitura.
|
|
89
90
|
return path;
|
|
90
91
|
}
|
|
91
92
|
/**
|
|
@@ -111,34 +112,49 @@ export async function resolveSessionEmail() {
|
|
|
111
112
|
* Retorna `null` em qualquer falha (arquivo ausente, JSON invalido, token
|
|
112
113
|
* vazio). Pra erro detalhado, usar `loadToken()` async.
|
|
113
114
|
*/
|
|
115
|
+
// LABS #17 (2026-09-28): cache por-processo. `getActiveTokenSync()` chama isto
|
|
116
|
+
// em TODO apiRequest/apiStream; paginação/pickers/watch/`logs -f` reparseavam
|
|
117
|
+
// auth.json N vezes no mesmo processo (existsSync+readFileSync+JSON.parse).
|
|
118
|
+
// Invalidado por saveToken/clearToken — os únicos mutadores dentro do processo.
|
|
119
|
+
// Seguro: o arquivo não muda sob um processo CLI vivo exceto por essas funções.
|
|
120
|
+
let authJsonCache = null;
|
|
121
|
+
/** Invalida o cache de auth.json (chamado após escrever/apagar o token). */
|
|
122
|
+
export function _invalidateAuthJsonCache() {
|
|
123
|
+
authJsonCache = null;
|
|
124
|
+
}
|
|
114
125
|
export function readAuthJsonSync() {
|
|
126
|
+
if (authJsonCache)
|
|
127
|
+
return authJsonCache.value;
|
|
115
128
|
const authPath = getAuthFilePath();
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
129
|
+
let value = null;
|
|
130
|
+
if (existsSync(authPath)) {
|
|
131
|
+
try {
|
|
132
|
+
const raw = readFileSync(authPath, 'utf8');
|
|
133
|
+
const parsed = JSON.parse(raw);
|
|
134
|
+
if (parsed &&
|
|
135
|
+
typeof parsed.token === 'string' &&
|
|
136
|
+
parsed.token.length > 0 &&
|
|
137
|
+
typeof parsed.email === 'string') {
|
|
138
|
+
value = {
|
|
139
|
+
token: parsed.token,
|
|
140
|
+
email: parsed.email,
|
|
141
|
+
savedAt: parsed.savedAt ?? '',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// ignora — token ausente/corrompido
|
|
130
147
|
}
|
|
131
148
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
return null;
|
|
149
|
+
authJsonCache = { value };
|
|
150
|
+
return value;
|
|
136
151
|
}
|
|
137
152
|
export async function clearToken() {
|
|
138
153
|
const path = getAuthFilePath();
|
|
139
154
|
if (!existsSync(path))
|
|
140
155
|
return false;
|
|
141
156
|
await fs.unlink(path);
|
|
157
|
+
_invalidateAuthJsonCache(); // LABS #17: token removido → invalida o cache.
|
|
142
158
|
return true;
|
|
143
159
|
}
|
|
144
160
|
//# sourceMappingURL=auth.js.map
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/cli-write.d.ts
CHANGED
|
@@ -44,6 +44,17 @@ export interface StepUpOptions extends ConfirmOptions {
|
|
|
44
44
|
mfaToken?: string;
|
|
45
45
|
/** `--dry-run` — servidor valida e retorna o efeito SEM aplicar. */
|
|
46
46
|
dryRun?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* `--non-interactive` (ex.: `neetru deploy` em CI): NUNCA prompta TOTP, mesmo
|
|
49
|
+
* com TTY — fail-closed com instrução (`--mfa-token` / `neetru auth mfa-session`).
|
|
50
|
+
*/
|
|
51
|
+
nonInteractive?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Ignora a sessão de 1h salva localmente e exige TOTP fresco. Usado no retry
|
|
54
|
+
* após o servidor recusar a sessão com `401 mfa_required` (sessão válida no
|
|
55
|
+
* disco mas rejeitada no servidor — ex.: segredo HMAC rotacionado).
|
|
56
|
+
*/
|
|
57
|
+
skipSession?: boolean;
|
|
47
58
|
}
|
|
48
59
|
/**
|
|
49
60
|
* Resolve o que uma operação destrutiva TOP-TIER precisa mandar pro servidor:
|
|
@@ -65,6 +76,26 @@ export interface StepUpOptions extends ConfirmOptions {
|
|
|
65
76
|
export declare function resolveStepUp(opts: StepUpOptions): Promise<{
|
|
66
77
|
headers: Record<string, string>;
|
|
67
78
|
}>;
|
|
79
|
+
/** `true` se o erro é o `401 mfa_required` de `requireCliStepUpMfa` no Core. */
|
|
80
|
+
export declare function isMfaRequiredError(error: unknown): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Executa um request cujo step-up MFA é CONDICIONAL no servidor (ex.:
|
|
83
|
+
* `ops bootstrap-admin` só exige MFA quando já existe admin). Não prompta
|
|
84
|
+
* antecipadamente:
|
|
85
|
+
* 1. anexa o que já está disponível sem interação — `--mfa-token` OU a
|
|
86
|
+
* sessão de 1h salva;
|
|
87
|
+
* 2. se o Core responder `401 mfa_required` e ainda não foi enviado um TOTP
|
|
88
|
+
* fresco, resolve o step-up (prompt TOTP / fail-closed em --json e
|
|
89
|
+
* não-TTY), ignorando a sessão local (o servidor acabou de recusá-la), e
|
|
90
|
+
* repete o request UMA vez.
|
|
91
|
+
* Qualquer outro erro (ou falha no retry) vai pro `onError` do caller
|
|
92
|
+
* (tipicamente `handleApiError`). O step-up roda FORA do handler de erro, pra
|
|
93
|
+
* o fail-closed do `resolveStepUp` (safeExit) não ser reprocessado como erro
|
|
94
|
+
* de API.
|
|
95
|
+
*/
|
|
96
|
+
export declare function withStepUpRetry<T>(opts: StepUpOptions, doRequest: (headers: Record<string, string>) => Promise<T>, onError: (error: unknown) => never,
|
|
97
|
+
/** Chamado antes do prompt TOTP do retry (ex.: parar o spinner). */
|
|
98
|
+
beforePrompt?: () => void): Promise<T>;
|
|
68
99
|
/**
|
|
69
100
|
* Imprime o resultado de um comando de escrita — JSON cru ou linha humana.
|
|
70
101
|
* Reconhece a resposta de dry-run (`{ dryRun: true }`) e a sinaliza.
|
package/dist/lib/cli-write.js
CHANGED
|
@@ -17,6 +17,7 @@ import { promises as fs } from 'node:fs';
|
|
|
17
17
|
import { dirname, join } from 'node:path';
|
|
18
18
|
import { homedir } from 'node:os';
|
|
19
19
|
import { requireToken, handleApiError } from './cli-read.js';
|
|
20
|
+
import { CliApiError } from './api-client.js';
|
|
20
21
|
import { log } from '../utils/logger.js';
|
|
21
22
|
import { safeExit } from '../utils/safe-exit.js';
|
|
22
23
|
export { requireToken, handleApiError };
|
|
@@ -181,7 +182,7 @@ export async function resolveStepUp(opts) {
|
|
|
181
182
|
}
|
|
182
183
|
// ── Prioridade 2: sessão de 1h salva localmente ─────────────────────────
|
|
183
184
|
// Verifica ANTES de pedir TOTP — se há sessão válida, usa sem interação.
|
|
184
|
-
const savedSession = loadMfaSession();
|
|
185
|
+
const savedSession = opts.skipSession ? null : loadMfaSession();
|
|
185
186
|
if (savedSession) {
|
|
186
187
|
headers['X-Neetru-MFA-Session'] = savedSession;
|
|
187
188
|
return { headers };
|
|
@@ -193,7 +194,7 @@ export async function resolveStepUp(opts) {
|
|
|
193
194
|
// rodar NEM com TTY — ele escreveria a pergunta no stdout (corrompe o JSON)
|
|
194
195
|
// e penduraria um consumidor programático. Fail-CLOSED em --json OU sem TTY;
|
|
195
196
|
// só promptar em terminal interativo humano (não-json + TTY).
|
|
196
|
-
if (opts.json || !process.stdin.isTTY) {
|
|
197
|
+
if (opts.json || opts.nonInteractive || !process.stdin.isTTY) {
|
|
197
198
|
const msg = 'Operação destrutiva top-tier exige step-up MFA: passe --mfa-token <código TOTP> ' +
|
|
198
199
|
'(modo --json/não-interativo) ou rode `neetru auth mfa-session` para obter uma sessão de 1h.';
|
|
199
200
|
if (opts.json) {
|
|
@@ -214,6 +215,54 @@ export async function resolveStepUp(opts) {
|
|
|
214
215
|
headers['X-Neetru-MFA-Token'] = code;
|
|
215
216
|
return { headers };
|
|
216
217
|
}
|
|
218
|
+
/** `true` se o erro é o `401 mfa_required` de `requireCliStepUpMfa` no Core. */
|
|
219
|
+
export function isMfaRequiredError(error) {
|
|
220
|
+
return error instanceof CliApiError && error.status === 401 && error.code === 'mfa_required';
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Executa um request cujo step-up MFA é CONDICIONAL no servidor (ex.:
|
|
224
|
+
* `ops bootstrap-admin` só exige MFA quando já existe admin). Não prompta
|
|
225
|
+
* antecipadamente:
|
|
226
|
+
* 1. anexa o que já está disponível sem interação — `--mfa-token` OU a
|
|
227
|
+
* sessão de 1h salva;
|
|
228
|
+
* 2. se o Core responder `401 mfa_required` e ainda não foi enviado um TOTP
|
|
229
|
+
* fresco, resolve o step-up (prompt TOTP / fail-closed em --json e
|
|
230
|
+
* não-TTY), ignorando a sessão local (o servidor acabou de recusá-la), e
|
|
231
|
+
* repete o request UMA vez.
|
|
232
|
+
* Qualquer outro erro (ou falha no retry) vai pro `onError` do caller
|
|
233
|
+
* (tipicamente `handleApiError`). O step-up roda FORA do handler de erro, pra
|
|
234
|
+
* o fail-closed do `resolveStepUp` (safeExit) não ser reprocessado como erro
|
|
235
|
+
* de API.
|
|
236
|
+
*/
|
|
237
|
+
export async function withStepUpRetry(opts, doRequest, onError,
|
|
238
|
+
/** Chamado antes do prompt TOTP do retry (ex.: parar o spinner). */
|
|
239
|
+
beforePrompt) {
|
|
240
|
+
const first = {};
|
|
241
|
+
const code = (opts.mfaToken ?? '').trim();
|
|
242
|
+
const savedSession = code ? null : loadMfaSession();
|
|
243
|
+
if (code)
|
|
244
|
+
first['X-Neetru-MFA-Token'] = code;
|
|
245
|
+
else if (savedSession)
|
|
246
|
+
first['X-Neetru-MFA-Session'] = savedSession;
|
|
247
|
+
let firstError;
|
|
248
|
+
try {
|
|
249
|
+
return await doRequest(first);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
firstError = error;
|
|
253
|
+
}
|
|
254
|
+
// Já mandou TOTP fresco e o servidor ainda pediu MFA → não há o que repetir.
|
|
255
|
+
if (!isMfaRequiredError(firstError) || code)
|
|
256
|
+
return onError(firstError);
|
|
257
|
+
beforePrompt?.();
|
|
258
|
+
const { headers } = await resolveStepUp({ ...opts, dryRun: false, skipSession: true });
|
|
259
|
+
try {
|
|
260
|
+
return await doRequest(headers);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
return onError(error);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
217
266
|
/**
|
|
218
267
|
* Imprime o resultado de um comando de escrita — JSON cru ou linha humana.
|
|
219
268
|
* Reconhece a resposta de dry-run (`{ dryRun: true }`) e a sinaliza.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-write.js","sourceRoot":"","sources":["../../src/lib/cli-write.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli-write.js","sourceRoot":"","sources":["../../src/lib/cli-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@neetru/mobile-local` — contrato do registry local `.neetru/mobile.json`.
|
|
3
|
+
*
|
|
4
|
+
* Espelha o barrel de `../db-local/index.js`.
|
|
5
|
+
*/
|
|
6
|
+
export { migrateMobileJson, readMobileJson, writeMobileJson, upsertMobileApp, removeMobileApp, } from './mobile-json.js';
|
|
7
|
+
export type { MobileJson, MobileJsonApp, MobilePlatform } from './mobile-json.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@neetru/mobile-local` — contrato do registry local `.neetru/mobile.json`.
|
|
3
|
+
*
|
|
4
|
+
* Espelha o barrel de `../db-local/index.js`.
|
|
5
|
+
*/
|
|
6
|
+
export { migrateMobileJson, readMobileJson, writeMobileJson, upsertMobileApp, removeMobileApp, } from './mobile-json.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/mobile-local/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export type MobilePlatform = 'ios' | 'android';
|
|
2
|
+
/** Uma entrada de app mobile no registry local. */
|
|
3
|
+
export interface MobileJsonApp {
|
|
4
|
+
/** ID canônico do Core — formato `<slug>__<platform>`. */
|
|
5
|
+
id: string;
|
|
6
|
+
platform: MobilePlatform;
|
|
7
|
+
name?: string;
|
|
8
|
+
/** Obrigatório no Core quando platform=ios. */
|
|
9
|
+
bundleId?: string;
|
|
10
|
+
/** Obrigatório no Core quando platform=ios (Apple Team ID, 10 chars). */
|
|
11
|
+
teamId?: string;
|
|
12
|
+
/** Obrigatório no Core quando platform=android. */
|
|
13
|
+
packageName?: string;
|
|
14
|
+
/** Obrigatório no Core quando platform=android (SHA-256 hex dos certs de assinatura). */
|
|
15
|
+
shaCertFingerprints?: string[];
|
|
16
|
+
redirectUri: string;
|
|
17
|
+
/** Client ID OIDC público (PKCE, sem secret) emitido pelo Core. */
|
|
18
|
+
oidcClientId: string;
|
|
19
|
+
status: string;
|
|
20
|
+
}
|
|
21
|
+
/** O registry `.neetru/mobile.json` — sempre versão 1. */
|
|
22
|
+
export interface MobileJson {
|
|
23
|
+
version: 1;
|
|
24
|
+
apps: MobileJsonApp[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Migra qualquer entrada para um `MobileJson` v1 estruturalmente válido.
|
|
28
|
+
*
|
|
29
|
+
* - v1 válido → normalizado (entradas malformadas reparadas ou descartadas).
|
|
30
|
+
* - objeto sem `version` → upgrade best-effort (trata como v1).
|
|
31
|
+
* - `null` / não-objeto / array / garbage → lança.
|
|
32
|
+
*
|
|
33
|
+
* NUNCA retorna algo que não seja um `MobileJson` v1 válido.
|
|
34
|
+
*/
|
|
35
|
+
export declare function migrateMobileJson(raw: unknown): MobileJson;
|
|
36
|
+
/**
|
|
37
|
+
* Lê + parseia + migra um `.neetru/mobile.json`.
|
|
38
|
+
*
|
|
39
|
+
* Arquivo ausente → registry v1 vazio (não é erro — é um registry novo).
|
|
40
|
+
* JSON inválido → lança um `Error` nomeando o path.
|
|
41
|
+
*/
|
|
42
|
+
export declare function readMobileJson(filePath: string): MobileJson;
|
|
43
|
+
/**
|
|
44
|
+
* Escreve um `MobileJson` de forma ATÔMICA.
|
|
45
|
+
*
|
|
46
|
+
* Estratégia: escreve num arquivo temporário no MESMO diretório do destino
|
|
47
|
+
* (rename só é atômico dentro do mesmo filesystem) e faz `renameSync` —
|
|
48
|
+
* que sobrescreve o arquivo existente tanto no Windows quanto no POSIX.
|
|
49
|
+
*
|
|
50
|
+
* Cria o diretório pai se ausente. Se algo falhar depois do temp ser criado,
|
|
51
|
+
* tenta remover o temp (best-effort) pra não deixar lixo `.tmp-*`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function writeMobileJson(filePath: string, data: MobileJson): void;
|
|
54
|
+
/** Adiciona (ou substitui por `id`) uma entrada e retorna o `MobileJson` atualizado. */
|
|
55
|
+
export declare function upsertMobileApp(mobileJson: MobileJson, app: MobileJsonApp): MobileJson;
|
|
56
|
+
/** Remove uma entrada por `id` e retorna o `MobileJson` atualizado. */
|
|
57
|
+
export declare function removeMobileApp(mobileJson: MobileJson, id: string): MobileJson;
|