@neetru/cli 1.0.0 → 2.0.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 (135) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +109 -152
  3. package/dist/commands/add.d.ts +8 -3
  4. package/dist/commands/add.js +70 -143
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/ai.d.ts +4 -0
  7. package/dist/commands/ai.js +88 -0
  8. package/dist/commands/ai.js.map +1 -0
  9. package/dist/commands/autocomplete.d.ts +7 -0
  10. package/dist/commands/autocomplete.js +107 -0
  11. package/dist/commands/autocomplete.js.map +1 -0
  12. package/dist/commands/build.d.ts +18 -0
  13. package/dist/commands/build.js +288 -0
  14. package/dist/commands/build.js.map +1 -0
  15. package/dist/commands/config.d.ts +3 -0
  16. package/dist/commands/config.js +70 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/db.d.ts +14 -0
  19. package/dist/commands/db.js +187 -0
  20. package/dist/commands/db.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +16 -3
  22. package/dist/commands/deploy.js +400 -180
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/doctor.d.ts +27 -0
  25. package/dist/commands/doctor.js +211 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/env.d.ts +15 -0
  28. package/dist/commands/env.js +56 -0
  29. package/dist/commands/env.js.map +1 -0
  30. package/dist/commands/fn.d.ts +6 -0
  31. package/dist/commands/fn.js +87 -0
  32. package/dist/commands/fn.js.map +1 -0
  33. package/dist/commands/init.d.ts +10 -3
  34. package/dist/commands/init.js +212 -143
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/login.d.ts +6 -3
  37. package/dist/commands/login.js +222 -92
  38. package/dist/commands/login.js.map +1 -1
  39. package/dist/commands/logout.d.ts +1 -0
  40. package/dist/commands/logout.js +28 -0
  41. package/dist/commands/logout.js.map +1 -0
  42. package/dist/commands/logs.d.ts +14 -3
  43. package/dist/commands/logs.js +132 -106
  44. package/dist/commands/logs.js.map +1 -1
  45. package/dist/commands/mocks.d.ts +5 -0
  46. package/dist/commands/mocks.js +23 -0
  47. package/dist/commands/mocks.js.map +1 -0
  48. package/dist/commands/open.d.ts +4 -3
  49. package/dist/commands/open.js +53 -85
  50. package/dist/commands/open.js.map +1 -1
  51. package/dist/commands/promote.d.ts +9 -0
  52. package/dist/commands/promote.js +114 -0
  53. package/dist/commands/promote.js.map +1 -0
  54. package/dist/commands/publish.d.ts +14 -0
  55. package/dist/commands/publish.js +180 -0
  56. package/dist/commands/publish.js.map +1 -0
  57. package/dist/commands/status.d.ts +5 -3
  58. package/dist/commands/status.js +91 -93
  59. package/dist/commands/status.js.map +1 -1
  60. package/dist/commands/upgrade.d.ts +12 -0
  61. package/dist/commands/upgrade.js +77 -0
  62. package/dist/commands/upgrade.js.map +1 -0
  63. package/dist/commands/validate.d.ts +1 -3
  64. package/dist/commands/validate.js +83 -91
  65. package/dist/commands/validate.js.map +1 -1
  66. package/dist/commands/whoami.d.ts +5 -3
  67. package/dist/commands/whoami.js +76 -28
  68. package/dist/commands/whoami.js.map +1 -1
  69. package/dist/index.d.ts +0 -1
  70. package/dist/index.js +337 -36
  71. package/dist/index.js.map +1 -1
  72. package/dist/lib/ai/context.d.ts +11 -0
  73. package/dist/lib/ai/context.js +112 -0
  74. package/dist/lib/ai/context.js.map +1 -0
  75. package/dist/lib/ai/orchestrator.d.ts +10 -0
  76. package/dist/lib/ai/orchestrator.js +92 -0
  77. package/dist/lib/ai/orchestrator.js.map +1 -0
  78. package/dist/lib/api-client.d.ts +21 -0
  79. package/dist/lib/api-client.js +65 -0
  80. package/dist/lib/api-client.js.map +1 -0
  81. package/dist/lib/auth.d.ts +15 -0
  82. package/dist/lib/auth.js +98 -0
  83. package/dist/lib/auth.js.map +1 -0
  84. package/dist/lib/config-schema.d.ts +165 -0
  85. package/dist/lib/config-schema.js +57 -0
  86. package/dist/lib/config-schema.js.map +1 -0
  87. package/dist/lib/config.d.ts +15 -0
  88. package/dist/lib/config.js +33 -0
  89. package/dist/lib/config.js.map +1 -0
  90. package/dist/utils/logger.d.ts +13 -0
  91. package/dist/utils/logger.js +27 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/package.json +35 -33
  94. package/templates/auth/callback.ts +22 -0
  95. package/templates/auth/sign-in.tsx +41 -0
  96. package/templates/billing/checkout.ts +22 -0
  97. package/templates/billing/page.tsx +43 -0
  98. package/templates/support/ticket-form.tsx +68 -0
  99. package/templates/usage/track.ts +30 -0
  100. package/templates/users/profile.tsx +43 -0
  101. package/LICENSE +0 -21
  102. package/dist/commands/add.d.ts.map +0 -1
  103. package/dist/commands/deploy.d.ts.map +0 -1
  104. package/dist/commands/generate-types.d.ts +0 -3
  105. package/dist/commands/generate-types.d.ts.map +0 -1
  106. package/dist/commands/generate-types.js +0 -150
  107. package/dist/commands/generate-types.js.map +0 -1
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/login.d.ts.map +0 -1
  110. package/dist/commands/logs.d.ts.map +0 -1
  111. package/dist/commands/open.d.ts.map +0 -1
  112. package/dist/commands/status.d.ts.map +0 -1
  113. package/dist/commands/validate.d.ts.map +0 -1
  114. package/dist/commands/whoami.d.ts.map +0 -1
  115. package/dist/config.d.ts +0 -14
  116. package/dist/config.d.ts.map +0 -1
  117. package/dist/config.js +0 -83
  118. package/dist/config.js.map +0 -1
  119. package/dist/index.d.ts.map +0 -1
  120. package/dist/scaffold/auth.d.ts +0 -3
  121. package/dist/scaffold/auth.d.ts.map +0 -1
  122. package/dist/scaffold/auth.js +0 -228
  123. package/dist/scaffold/auth.js.map +0 -1
  124. package/dist/scaffold/billing.d.ts +0 -3
  125. package/dist/scaffold/billing.d.ts.map +0 -1
  126. package/dist/scaffold/billing.js +0 -184
  127. package/dist/scaffold/billing.js.map +0 -1
  128. package/dist/scaffold/usage.d.ts +0 -3
  129. package/dist/scaffold/usage.d.ts.map +0 -1
  130. package/dist/scaffold/usage.js +0 -173
  131. package/dist/scaffold/usage.js.map +0 -1
  132. package/dist/scaffold/users.d.ts +0 -3
  133. package/dist/scaffold/users.d.ts.map +0 -1
  134. package/dist/scaffold/users.js +0 -135
  135. package/dist/scaffold/users.js.map +0 -1
@@ -1,104 +1,234 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.loginCommand = loginCommand;
40
- const commander_1 = require("commander");
41
- const chalk_1 = __importDefault(require("chalk"));
42
- const ora_1 = __importDefault(require("ora"));
43
- const config_1 = require("../config");
44
- async function prompt(questions) {
45
- const { default: inquirer } = await Promise.resolve().then(() => __importStar(require('inquirer')));
46
- return inquirer.prompt(questions);
1
+ /**
2
+ * `neetru login` Device Code OAuth (RFC 8628).
3
+ *
4
+ * Sprint 1: substitui o paste manual de token por fluxo browser-aware.
5
+ *
6
+ * Steps:
7
+ * 1. POST {api}/api/v1/oauth/device/authorize → device_code, user_code,
8
+ * verification_uri, interval, expires_in.
9
+ * 2. Print user_code + abrir browser na verification_uri (best-effort).
10
+ * 3. Polling POST {api}/api/v1/oauth/device/token a cada `interval` s
11
+ * até receber access_token, slow_down (interval+5s) ou erro fatal.
12
+ * 4. Salvar token em ~/.config/neetru-cli/auth.json (chmod 0600).
13
+ * 5. Validar via /api/cli/v1/whoami pra mostrar identidade.
14
+ *
15
+ * Mantém `--token` legado pra CI: pula o flow e salva direto.
16
+ * Suporta `--json` pra ambientes scriptados (saída machine-readable).
17
+ */
18
+ import chalk from 'chalk';
19
+ import ora from 'ora';
20
+ import { spawn } from 'node:child_process';
21
+ import { config } from '../lib/config.js';
22
+ import { saveToken } from '../lib/auth.js';
23
+ import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
24
+ import { log } from '../utils/logger.js';
25
+ const TOKEN_PATTERN = /^nrt_[a-z0-9]{8,16}_[A-Za-z0-9_\-=]{20,64}$/;
26
+ const DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
27
+ const POLL_TIMEOUT_MS = 10 * 60 * 1000; // 10min
28
+ function emitJson(obj) {
29
+ console.log(JSON.stringify(obj));
47
30
  }
48
- function loginCommand() {
49
- const cmd = new commander_1.Command('login');
50
- cmd
51
- .description('Autentica o CLI com sua API key do Neetru Core')
52
- .option('--core-url <url>', 'URL do Neetru Core', 'https://core.neetru.com')
53
- .option('--api-key <key>', 'API key (opcional, será solicitada interativamente se omitida)')
54
- .action(async (options) => {
55
- console.log('\n' + chalk_1.default.bold.cyan('🔐 Neetru CLILogin'));
56
- console.log(chalk_1.default.dim('Autentique seu CLI para chamar a API do Neetru Core\n'));
57
- const coreUrl = options.coreUrl;
58
- let apiKey = options.apiKey;
59
- if (!apiKey) {
60
- console.log(chalk_1.default.dim('Obtenha sua API key em:'));
61
- console.log(chalk_1.default.cyan(` ${coreUrl}/admin/credentials\n`));
62
- const { key } = await prompt([{
63
- type: 'password',
64
- name: 'key',
65
- message: 'API key:',
66
- mask: '*',
67
- validate: (v) => v.length >= 20 || 'API key parece inválida (muito curta)',
68
- }]);
69
- apiKey = key;
31
+ /**
32
+ * Best-effort cross-platform browser open. Falha silenciosamente — usuário
33
+ * sempre tem fallback de copiar/colar a URL.
34
+ */
35
+ function openBrowser(url) {
36
+ try {
37
+ if (process.platform === 'win32') {
38
+ // Detached `start` via cmd.exeempty title arg is required.
39
+ spawn('cmd', ['/c', 'start', '""', url], {
40
+ detached: true,
41
+ stdio: 'ignore',
42
+ windowsHide: true,
43
+ }).unref();
44
+ return;
45
+ }
46
+ if (process.platform === 'darwin') {
47
+ spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
48
+ return;
70
49
  }
71
- const spinner = (0, ora_1.default)('Verificando credenciais...').start();
50
+ spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
51
+ }
52
+ catch {
53
+ // ignore — caller já printou a URL.
54
+ }
55
+ }
56
+ function sleep(ms) {
57
+ return new Promise((res) => setTimeout(res, ms));
58
+ }
59
+ async function pollForToken(deviceCode, initialIntervalSec, expiresAtMs, json) {
60
+ let intervalMs = initialIntervalSec * 1000;
61
+ const spinner = json
62
+ ? null
63
+ : ora({ text: 'Aguardando aprovação no browser…', color: 'blue' }).start();
64
+ while (Date.now() < expiresAtMs) {
65
+ await sleep(intervalMs);
72
66
  try {
73
- const res = await fetch(`${coreUrl}/api/v1/cli/whoami`, {
74
- headers: { Authorization: `Bearer ${apiKey}` },
75
- signal: AbortSignal.timeout(8000),
67
+ const result = await apiRequest('/api/v1/oauth/device/token', {
68
+ method: 'POST',
69
+ body: {
70
+ grant_type: DEVICE_GRANT_TYPE,
71
+ device_code: deviceCode,
72
+ client_id: 'neetru-cli',
73
+ },
76
74
  });
77
- if (!res.ok) {
78
- spinner.fail(`Falha de autenticação (HTTP ${res.status})`);
79
- if (res.status === 401) {
80
- console.log(chalk_1.default.dim(' → API key inválida ou expirada'));
75
+ spinner?.succeed('Autorização concedida.');
76
+ return result.access_token;
77
+ }
78
+ catch (error) {
79
+ if (error instanceof CliApiError) {
80
+ // Códigos RFC 8628.
81
+ if (error.code === 'authorization_pending') {
82
+ continue;
83
+ }
84
+ if (error.code === 'slow_down') {
85
+ intervalMs += 5_000;
86
+ continue;
87
+ }
88
+ if (error.code === 'access_denied') {
89
+ spinner?.fail('Autorização negada pelo usuário.');
90
+ throw new Error('access_denied');
81
91
  }
82
- process.exit(1);
92
+ if (error.code === 'expired_token') {
93
+ spinner?.fail('Código expirou. Reinicie `neetru login`.');
94
+ throw new Error('expired_token');
95
+ }
96
+ spinner?.fail(`Erro do servidor: ${error.code}`);
97
+ throw new Error(error.code);
98
+ }
99
+ if (error instanceof CliNetworkError) {
100
+ // Trata como transient — segue tentando até timeout.
101
+ continue;
83
102
  }
84
- const data = await res.json();
85
- spinner.succeed(`Autenticado como ${chalk_1.default.cyan(data.email ?? 'usuário')} (${data.role ?? 'role desconhecida'})`);
103
+ spinner?.fail(error.message);
104
+ throw error;
86
105
  }
87
- catch (e) {
88
- spinner.fail(`Erro: ${e.message}`);
106
+ }
107
+ spinner?.fail('Timeout aguardando aprovação.');
108
+ throw new Error('timeout');
109
+ }
110
+ export async function runLogin(opts = {}) {
111
+ const json = !!opts.json;
112
+ if (!json)
113
+ log.banner();
114
+ // ── Path legado: --token <nrt_...> pula o device flow.
115
+ if (opts.token) {
116
+ const token = opts.token.trim();
117
+ if (!TOKEN_PATTERN.test(token)) {
118
+ if (json)
119
+ emitJson({ ok: false, error: 'invalid_token_format' });
120
+ else
121
+ log.error('Token inválido. Formato esperado: nrt_<keyId>_<secret>');
89
122
  process.exit(1);
90
123
  }
91
- // Save to global config
92
- const existing = (0, config_1.readGlobalConfig)();
93
- (0, config_1.writeGlobalConfig)({
94
- ...existing,
95
- coreUrl,
96
- clientSecret: apiKey,
124
+ try {
125
+ const me = await apiRequest('/api/cli/v1/whoami', { token });
126
+ const path = await saveToken(token, me.email);
127
+ // Compat: alguns comandos legados ainda leem do Conf.
128
+ config.set('neetruApiKey', token);
129
+ if (json) {
130
+ emitJson({ ok: true, email: me.email, role: me.role, path });
131
+ }
132
+ else {
133
+ log.success(`Logado como ${chalk.bold(me.email)} (role: ${chalk.bold(me.role)})`);
134
+ log.dim(`Token salvo em ${path}`);
135
+ }
136
+ process.exit(0);
137
+ }
138
+ catch (err) {
139
+ handleFatalAuthError(err, json);
140
+ }
141
+ return;
142
+ }
143
+ // ── Device Code flow.
144
+ let authResp;
145
+ try {
146
+ authResp = await apiRequest('/api/v1/oauth/device/authorize', {
147
+ method: 'POST',
148
+ body: { client_id: 'neetru-cli' },
149
+ });
150
+ }
151
+ catch (err) {
152
+ if (json)
153
+ emitJson({ ok: false, error: 'authorize_failed', message: err.message });
154
+ else
155
+ log.error(`Falha ao iniciar login: ${err.message}`);
156
+ process.exit(2);
157
+ return;
158
+ }
159
+ const verifyUrl = authResp.verification_uri_complete ?? authResp.verification_uri;
160
+ if (json) {
161
+ emitJson({
162
+ ok: true,
163
+ stage: 'awaiting_approval',
164
+ user_code: authResp.user_code,
165
+ verification_uri: authResp.verification_uri,
166
+ verification_uri_complete: authResp.verification_uri_complete ?? null,
167
+ expires_in: authResp.expires_in,
97
168
  });
98
- console.log('\n' + chalk_1.default.green.bold('✓ Login efetuado'));
99
- console.log(chalk_1.default.dim('Credenciais salvas em ~/.neetru/config.json'));
100
- console.log('');
101
- });
102
- return cmd;
169
+ }
170
+ else {
171
+ console.log();
172
+ console.log(` ${chalk.dim('Código de verificação')}`);
173
+ console.log(` ${chalk.bold.cyan(authResp.user_code)}`);
174
+ console.log();
175
+ console.log(` ${chalk.dim('Verifique em')} ${chalk.underline(authResp.verification_uri)}`);
176
+ console.log();
177
+ }
178
+ openBrowser(verifyUrl);
179
+ const expiresAtMs = Date.now() + Math.min(authResp.expires_in * 1000, POLL_TIMEOUT_MS);
180
+ let accessToken;
181
+ try {
182
+ accessToken = await pollForToken(authResp.device_code, authResp.interval ?? 5, expiresAtMs, json);
183
+ }
184
+ catch (err) {
185
+ const message = err.message;
186
+ if (json)
187
+ emitJson({ ok: false, error: message });
188
+ else
189
+ log.error(`Login falhou: ${message}`);
190
+ process.exit(1);
191
+ return;
192
+ }
193
+ // Valida + persiste.
194
+ try {
195
+ const me = await apiRequest('/api/cli/v1/whoami', { token: accessToken });
196
+ const path = await saveToken(accessToken, me.email);
197
+ // Compat: legacy commands podem usar Conf — mantemos o token lá também.
198
+ config.set('neetruApiKey', accessToken);
199
+ if (json) {
200
+ emitJson({ ok: true, email: me.email, role: me.role, path });
201
+ }
202
+ else {
203
+ console.log();
204
+ log.success(`Logado como ${chalk.bold(me.email)} (role: ${chalk.bold(me.role)})`);
205
+ log.dim(`Token salvo em ${path}`);
206
+ }
207
+ process.exit(0);
208
+ }
209
+ catch (err) {
210
+ handleFatalAuthError(err, json);
211
+ }
212
+ }
213
+ function handleFatalAuthError(err, json) {
214
+ if (err instanceof CliApiError) {
215
+ if (json)
216
+ emitJson({ ok: false, status: err.status, error: err.code, message: err.message });
217
+ else
218
+ log.error(`Servidor retornou ${err.status}: ${err.message}`);
219
+ process.exit(err.status === 401 || err.status === 403 ? 1 : 2);
220
+ }
221
+ if (err instanceof CliNetworkError) {
222
+ if (json)
223
+ emitJson({ ok: false, error: 'network', message: err.message });
224
+ else
225
+ log.error(err.message);
226
+ process.exit(2);
227
+ }
228
+ if (json)
229
+ emitJson({ ok: false, error: 'unknown', message: err.message });
230
+ else
231
+ log.error(err.message);
232
+ process.exit(2);
103
233
  }
104
234
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runLogout(): Promise<void>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `neetru logout` — limpa credenciais locais.
3
+ *
4
+ * Sprint 1: arquivo canônico é ~/.config/neetru-cli/auth.json.
5
+ * Mantemos cleanup do Conf storage legado por compat com sessões antigas.
6
+ */
7
+ import { config } from '../lib/config.js';
8
+ import { clearToken, getAuthFilePath } from '../lib/auth.js';
9
+ import { log } from '../utils/logger.js';
10
+ export async function runLogout() {
11
+ let removed = false;
12
+ try {
13
+ if (await clearToken())
14
+ removed = true;
15
+ }
16
+ catch (err) {
17
+ log.warn(`Falha ao remover ${getAuthFilePath()}: ${err.message}`);
18
+ }
19
+ if (config.get('neetruApiKey')) {
20
+ config.delete('neetruApiKey');
21
+ removed = true;
22
+ }
23
+ if (removed)
24
+ log.success('Sessão local apagada.');
25
+ else
26
+ log.warn('Nenhuma sessão ativa.');
27
+ }
28
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,CAAC;QACH,IAAI,MAAM,UAAU,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,oBAAoB,eAAe,EAAE,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO;QAAE,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;;QAC7C,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACzC,CAAC"}
@@ -1,3 +1,14 @@
1
- import { Command } from 'commander';
2
- export declare function logsCommand(): Command;
3
- //# sourceMappingURL=logs.d.ts.map
1
+ export interface LogsOptions {
2
+ clientId?: string;
3
+ follow?: boolean;
4
+ lines?: string;
5
+ since?: string;
6
+ level?: string;
7
+ /** v1.3 — filtrar por productId (corresponde a `logs/{productId}/...`). */
8
+ product?: string;
9
+ /** v1.3 — filtrar por channel (`stdout` | `stderr` | `app` etc). */
10
+ channel?: string;
11
+ /** v1.3 — buscar logs com `correlationId == <uuid>`. */
12
+ correlationId?: string;
13
+ }
14
+ export declare function runLogs(opts: LogsOptions): Promise<void>;