@neetru/cli 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/commands/agent-release.d.ts +13 -0
  2. package/dist/commands/agent-release.js +204 -0
  3. package/dist/commands/agent-release.js.map +1 -0
  4. package/dist/commands/agent-write.d.ts +12 -0
  5. package/dist/commands/agent-write.js +94 -0
  6. package/dist/commands/agent-write.js.map +1 -0
  7. package/dist/commands/api-catalog.d.ts +20 -0
  8. package/dist/commands/api-catalog.js +126 -0
  9. package/dist/commands/api-catalog.js.map +1 -0
  10. package/dist/commands/audit.d.ts +8 -0
  11. package/dist/commands/audit.js +69 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/billing.d.ts +6 -0
  14. package/dist/commands/billing.js +69 -0
  15. package/dist/commands/billing.js.map +1 -0
  16. package/dist/commands/build.js +10 -3
  17. package/dist/commands/build.js.map +1 -1
  18. package/dist/commands/cloud-run.d.ts +11 -0
  19. package/dist/commands/cloud-run.js +87 -0
  20. package/dist/commands/cloud-run.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +7 -0
  22. package/dist/commands/deploy.js +150 -17
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/deployments.d.ts +11 -0
  25. package/dist/commands/deployments.js +69 -0
  26. package/dist/commands/deployments.js.map +1 -0
  27. package/dist/commands/dr.d.ts +11 -0
  28. package/dist/commands/dr.js +79 -0
  29. package/dist/commands/dr.js.map +1 -0
  30. package/dist/commands/infra-read.d.ts +9 -0
  31. package/dist/commands/infra-read.js +113 -0
  32. package/dist/commands/infra-read.js.map +1 -0
  33. package/dist/commands/init.d.ts +13 -1
  34. package/dist/commands/init.js +327 -70
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/products-db.d.ts +37 -0
  37. package/dist/commands/products-db.js +230 -0
  38. package/dist/commands/products-db.js.map +1 -0
  39. package/dist/commands/products.d.ts +12 -0
  40. package/dist/commands/products.js +97 -0
  41. package/dist/commands/products.js.map +1 -0
  42. package/dist/commands/servers.d.ts +23 -0
  43. package/dist/commands/servers.js +166 -0
  44. package/dist/commands/servers.js.map +1 -0
  45. package/dist/commands/support.d.ts +25 -0
  46. package/dist/commands/support.js +184 -0
  47. package/dist/commands/support.js.map +1 -0
  48. package/dist/commands/surface-status.d.ts +5 -0
  49. package/dist/commands/surface-status.js +63 -0
  50. package/dist/commands/surface-status.js.map +1 -0
  51. package/dist/commands/tenants.d.ts +34 -0
  52. package/dist/commands/tenants.js +179 -0
  53. package/dist/commands/tenants.js.map +1 -0
  54. package/dist/commands/workspaces.d.ts +15 -0
  55. package/dist/commands/workspaces.js +72 -0
  56. package/dist/commands/workspaces.js.map +1 -0
  57. package/dist/index.js +775 -6
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/api-client.d.ts +18 -0
  60. package/dist/lib/api-client.js +124 -4
  61. package/dist/lib/api-client.js.map +1 -1
  62. package/dist/lib/cli-read.d.ts +13 -0
  63. package/dist/lib/cli-read.js +103 -0
  64. package/dist/lib/cli-read.js.map +1 -0
  65. package/dist/lib/cli-write.d.ts +47 -0
  66. package/dist/lib/cli-write.js +137 -0
  67. package/dist/lib/cli-write.js.map +1 -0
  68. package/dist/lib/config-schema.d.ts +10 -10
  69. package/dist/lib/render.d.ts +16 -0
  70. package/dist/lib/render.js +74 -0
  71. package/dist/lib/render.js.map +1 -0
  72. package/package.json +4 -4
@@ -0,0 +1,230 @@
1
+ /**
2
+ * `neetru products db ...` — per-product database management (Phase A).
3
+ *
4
+ * Sub-comandos: list, create, get, status, retry, rotate, delete, engines.
5
+ * Endpoints: /api/cli/v1/db/*
6
+ */
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import { apiRequest } from '../lib/api-client.js';
10
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
11
+ import { renderTable } from '../lib/render.js';
12
+ import { log } from '../utils/logger.js';
13
+ function colorStatus(s) {
14
+ if (s === 'active')
15
+ return chalk.green(s);
16
+ if (s === 'failed')
17
+ return chalk.red(s);
18
+ if (s === 'degraded')
19
+ return chalk.yellow(s);
20
+ if (s === 'archived')
21
+ return chalk.dim(s);
22
+ if (s === 'provisioning')
23
+ return chalk.cyan(s);
24
+ return s;
25
+ }
26
+ export async function runDbList(opts) {
27
+ const token = await requireToken(opts.json);
28
+ const params = new URLSearchParams();
29
+ if (opts.productId)
30
+ params.set('productId', opts.productId);
31
+ if (opts.engine)
32
+ params.set('engine', opts.engine);
33
+ if (opts.status)
34
+ params.set('status', opts.status);
35
+ const qs = params.toString();
36
+ const spinner = opts.json ? null : ora({ text: 'Buscando bancos…', color: 'blue' }).start();
37
+ let res;
38
+ try {
39
+ res = await apiRequest(`/api/cli/v1/db/list${qs ? `?${qs}` : ''}`, { token });
40
+ spinner?.stop();
41
+ }
42
+ catch (error) {
43
+ spinner?.fail('Falha ao buscar bancos.');
44
+ handleApiError(error, opts.json);
45
+ }
46
+ if (opts.json) {
47
+ console.log(JSON.stringify(res));
48
+ return;
49
+ }
50
+ log.heading(`Bancos de dados (${res.count})`);
51
+ renderTable([
52
+ { header: 'ID', value: (r) => r.id, maxWidth: 20 },
53
+ { header: 'PRODUTO', value: (r) => r.productId, maxWidth: 18 },
54
+ { header: 'LABEL', value: (r) => r.label, maxWidth: 22 },
55
+ { header: 'ENGINE', value: (r) => r.engine, maxWidth: 20 },
56
+ { header: 'ENV', value: (r) => r.environment },
57
+ { header: 'STATUS', value: (r) => colorStatus(r.status) },
58
+ ], res.databases);
59
+ }
60
+ export async function runDbCreate(opts) {
61
+ const token = await requireToken(opts.json);
62
+ let provisioning;
63
+ if (opts.engine === 'firestore-instance') {
64
+ provisioning = {
65
+ engine: opts.engine,
66
+ config: { locationId: opts.region, type: 'regional' },
67
+ };
68
+ }
69
+ else if (opts.engine.startsWith('cloud-sql-')) {
70
+ provisioning = {
71
+ engine: opts.engine,
72
+ config: {
73
+ region: opts.region,
74
+ tier: 'db-custom-2-7680',
75
+ storageGb: 50,
76
+ highAvailability: opts.environment === 'production',
77
+ },
78
+ };
79
+ }
80
+ else {
81
+ provisioning = {
82
+ engine: opts.engine,
83
+ config: {
84
+ region: opts.region,
85
+ zone: `${opts.region}-a`,
86
+ machineType: 'e2-standard-4',
87
+ diskGb: 100,
88
+ ...(opts.engine.endsWith('-cluster')
89
+ ? { replicaCount: Number(opts.replicaCount ?? '2') || 2 }
90
+ : {}),
91
+ },
92
+ };
93
+ }
94
+ const body = {
95
+ productId: opts.productId,
96
+ label: opts.label,
97
+ engine: opts.engine,
98
+ environment: opts.environment,
99
+ provisioning,
100
+ ...(opts.serverId ? { serverId: opts.serverId } : {}),
101
+ };
102
+ const spinner = opts.json ? null : ora({ text: 'Criando banco…', color: 'blue' }).start();
103
+ try {
104
+ const res = await apiRequest('/api/cli/v1/db/create', {
105
+ token,
106
+ method: 'POST',
107
+ body,
108
+ });
109
+ spinner?.stop();
110
+ if (opts.json) {
111
+ console.log(JSON.stringify(res));
112
+ return;
113
+ }
114
+ log.success(`Banco criado: ${chalk.cyan(res.id)} (status: requested)`);
115
+ }
116
+ catch (error) {
117
+ spinner?.fail('Falha ao criar banco.');
118
+ handleApiError(error, opts.json);
119
+ }
120
+ }
121
+ // ─── get ─────────────────────────────────────────────────────────────────────
122
+ export async function runDbGet(id, opts) {
123
+ const token = await requireToken(opts.json);
124
+ try {
125
+ const res = await apiRequest(`/api/cli/v1/db/${encodeURIComponent(id)}/get`, { token });
126
+ if (opts.json) {
127
+ console.log(JSON.stringify(res));
128
+ return;
129
+ }
130
+ log.heading(`Banco ${res.database.id}`);
131
+ log.info(`Produto: ${res.database.productId}`);
132
+ log.info(`Label: ${res.database.label}`);
133
+ log.info(`Engine: ${res.database.engine}`);
134
+ log.info(`Env: ${res.database.environment}`);
135
+ log.info(`Status: ${colorStatus(res.database.status)}`);
136
+ if (res.database.endpoint)
137
+ log.info(`Endpoint: ${String(res.database.endpoint)}`);
138
+ if (res.database.serverId)
139
+ log.info(`Server: ${String(res.database.serverId)}`);
140
+ }
141
+ catch (error) {
142
+ handleApiError(error, opts.json);
143
+ }
144
+ }
145
+ // ─── status / retry / rotate / delete ────────────────────────────────────────
146
+ export async function runDbStatus(id, status, opts) {
147
+ const token = await requireToken(opts.json);
148
+ try {
149
+ const res = await apiRequest(`/api/cli/v1/db/${encodeURIComponent(id)}/status`, {
150
+ token,
151
+ method: 'POST',
152
+ body: { status, reason: opts.reason },
153
+ });
154
+ if (opts.json) {
155
+ console.log(JSON.stringify(res));
156
+ return;
157
+ }
158
+ log.success(`Status atualizado: ${chalk.cyan(status)}`);
159
+ }
160
+ catch (error) {
161
+ handleApiError(error, opts.json);
162
+ }
163
+ }
164
+ export async function runDbRetry(id, opts) {
165
+ const token = await requireToken(opts.json);
166
+ try {
167
+ const res = await apiRequest(`/api/cli/v1/db/${encodeURIComponent(id)}/retry`, {
168
+ token,
169
+ method: 'POST',
170
+ body: {},
171
+ });
172
+ if (opts.json) {
173
+ console.log(JSON.stringify(res));
174
+ return;
175
+ }
176
+ log.success('Reprovisionamento solicitado.');
177
+ }
178
+ catch (error) {
179
+ handleApiError(error, opts.json);
180
+ }
181
+ }
182
+ export async function runDbRotate(id, opts) {
183
+ const token = await requireToken(opts.json);
184
+ try {
185
+ const res = await apiRequest(`/api/cli/v1/db/${encodeURIComponent(id)}/rotate-credentials`, { token, method: 'POST', body: {} });
186
+ if (opts.json) {
187
+ console.log(JSON.stringify(res));
188
+ return;
189
+ }
190
+ log.success(`Rotação registrada. Secret ref: ${chalk.cyan(res.secretRef)}`);
191
+ }
192
+ catch (error) {
193
+ handleApiError(error, opts.json);
194
+ }
195
+ }
196
+ export async function runDbDelete(id, opts) {
197
+ const token = await requireToken(opts.json);
198
+ try {
199
+ const res = await apiRequest(`/api/cli/v1/db/${encodeURIComponent(id)}/delete`, {
200
+ token,
201
+ method: 'POST',
202
+ body: {},
203
+ });
204
+ if (opts.json) {
205
+ console.log(JSON.stringify(res));
206
+ return;
207
+ }
208
+ log.success('Banco arquivado.');
209
+ }
210
+ catch (error) {
211
+ handleApiError(error, opts.json);
212
+ }
213
+ }
214
+ export async function runDbEngines(opts) {
215
+ const token = await requireToken(opts.json);
216
+ try {
217
+ const res = await apiRequest('/api/cli/v1/db/engines', { token });
218
+ if (opts.json) {
219
+ console.log(JSON.stringify(res));
220
+ return;
221
+ }
222
+ log.heading('Engines suportados');
223
+ for (const e of res.engines)
224
+ console.log(` · ${e}`);
225
+ }
226
+ catch (error) {
227
+ handleApiError(error, opts.json);
228
+ }
229
+ }
230
+ //# sourceMappingURL=products-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products-db.js","sourceRoot":"","sources":["../../src/commands/products-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface ProductsListOptions {
2
+ status?: string;
3
+ limit?: string;
4
+ json?: boolean;
5
+ }
6
+ export declare function runProductsList(opts: ProductsListOptions): Promise<void>;
7
+ export declare function runProductsPublish(slug: string, opts: {
8
+ json?: boolean;
9
+ }): Promise<void>;
10
+ export declare function runProductsUnpublish(slug: string, opts: {
11
+ json?: boolean;
12
+ }): Promise<void>;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `neetru products list` — produtos SaaS internos (registry `products/`).
3
+ *
4
+ * Endpoint: GET /api/cli/v1/products (filtro --status)
5
+ *
6
+ * Distinto de `neetru publish` (catálogo público `public_products`): aqui é o
7
+ * registry interno de produtos (Product-OS).
8
+ *
9
+ * Saída: tabela (default) ou `--json`.
10
+ */
11
+ import chalk from 'chalk';
12
+ import ora from 'ora';
13
+ import { apiRequest } from '../lib/api-client.js';
14
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
15
+ import { printWriteResult } from '../lib/cli-write.js';
16
+ import { renderTable } from '../lib/render.js';
17
+ import { log } from '../utils/logger.js';
18
+ function colorStatus(s) {
19
+ if (!s)
20
+ return chalk.dim('—');
21
+ if (s === 'ativo')
22
+ return chalk.green(s);
23
+ if (s === 'descontinuado')
24
+ return chalk.red(s);
25
+ if (s === 'beta')
26
+ return chalk.yellow(s);
27
+ return chalk.cyan(s);
28
+ }
29
+ export async function runProductsList(opts) {
30
+ const token = await requireToken(opts.json);
31
+ const params = new URLSearchParams();
32
+ if (opts.status)
33
+ params.set('status', opts.status);
34
+ if (opts.limit)
35
+ params.set('limit', opts.limit);
36
+ const qs = params.toString();
37
+ const spinner = opts.json ? null : ora({ text: 'Buscando produtos…', color: 'blue' }).start();
38
+ let res;
39
+ try {
40
+ res = await apiRequest(`/api/cli/v1/products${qs ? `?${qs}` : ''}`, { token });
41
+ spinner?.stop();
42
+ }
43
+ catch (error) {
44
+ spinner?.fail('Falha ao buscar produtos.');
45
+ handleApiError(error, opts.json);
46
+ }
47
+ if (opts.json) {
48
+ console.log(JSON.stringify(res));
49
+ return;
50
+ }
51
+ log.heading(`Produtos (${res.count})`);
52
+ renderTable([
53
+ { header: 'ID', value: (r) => r.id, maxWidth: 22 },
54
+ { header: 'NOME', value: (r) => r.name ?? '—', maxWidth: 26 },
55
+ { header: 'SLUG', value: (r) => r.slug ?? '—', maxWidth: 22 },
56
+ { header: 'STATUS', value: (r) => colorStatus(r.status) },
57
+ { header: 'TIME', value: (r) => r.ownerTeam ?? '—', maxWidth: 18 },
58
+ { header: 'REPO', value: (r) => r.repoUrl ?? '—', maxWidth: 36 },
59
+ ], res.products);
60
+ console.log();
61
+ }
62
+ // ─── Write commands — toggle do catálogo público ──────────────────────────
63
+ //
64
+ // `neetru products publish <slug>` / `neetru products unpublish <slug>` —
65
+ // toggle de `published` em `public_products/{slug}`. Distinto de
66
+ // `neetru publish` (upsert completo a partir do neetru.config.json local):
67
+ // estes só ligam/desligam a visibilidade de um produto já cadastrado.
68
+ async function runProductsPublishToggle(slug, published, opts) {
69
+ if (!slug) {
70
+ log.error(`Uso: neetru products ${published ? 'publish' : 'unpublish'} <slug>`);
71
+ process.exit(1);
72
+ }
73
+ const token = await requireToken(opts.json);
74
+ const spinner = opts.json
75
+ ? null
76
+ : ora({
77
+ text: `${published ? 'Publicando' : 'Despublicando'} "${slug}"…`,
78
+ color: 'blue',
79
+ }).start();
80
+ let res;
81
+ try {
82
+ res = await apiRequest(`/api/cli/v1/products/${encodeURIComponent(slug)}/publish?published=${published}`, { method: 'POST', token });
83
+ spinner?.stop();
84
+ }
85
+ catch (error) {
86
+ spinner?.fail(`Falha ao ${published ? 'publicar' : 'despublicar'} produto.`);
87
+ handleApiError(error, opts.json);
88
+ }
89
+ printWriteResult({ slug: res.slug, published: res.published }, `Produto ${res.slug} → ${res.published ? 'publicado' : 'despublicado'}`, opts.json);
90
+ }
91
+ export async function runProductsPublish(slug, opts) {
92
+ return runProductsPublishToggle(slug, true, opts);
93
+ }
94
+ export async function runProductsUnpublish(slug, opts) {
95
+ return runProductsPublishToggle(slug, false, opts);
96
+ }
97
+ //# sourceMappingURL=products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../src/commands/products.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type StepUpOptions } from '../lib/cli-write.js';
2
+ export interface ServersListOptions {
3
+ status?: string;
4
+ provider?: string;
5
+ capacity?: boolean;
6
+ json?: boolean;
7
+ }
8
+ export declare function runServersList(opts: ServersListOptions): Promise<void>;
9
+ export interface ServersProvisionOptions {
10
+ name: string;
11
+ zone: string;
12
+ machineType: string;
13
+ tenant?: string;
14
+ customer?: string;
15
+ json?: boolean;
16
+ }
17
+ export declare function runServersProvision(opts: ServersProvisionOptions): Promise<void>;
18
+ export declare function runServersDeactivate(id: string, opts: StepUpOptions): Promise<void>;
19
+ export interface ServersDispatchOptions {
20
+ params?: string;
21
+ json?: boolean;
22
+ }
23
+ export declare function runServersDispatch(id: string, commandType: string, opts: ServersDispatchOptions): Promise<void>;
@@ -0,0 +1,166 @@
1
+ /**
2
+ * `neetru servers list` — inventário lógico de servers do Core.
3
+ *
4
+ * Endpoint: GET /api/cli/v1/servers
5
+ * filtros: --status online, --provider <p>, --capacity (RAM/CPU/disco)
6
+ *
7
+ * Saída: tabela (default) ou `--json`.
8
+ */
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import { apiRequest } from '../lib/api-client.js';
12
+ import { requireToken, handleApiError } from '../lib/cli-read.js';
13
+ import { confirmDestructive, printWriteResult, resolveStepUp, } from '../lib/cli-write.js';
14
+ import { renderTable } from '../lib/render.js';
15
+ import { log } from '../utils/logger.js';
16
+ function colorStatus(s) {
17
+ if (!s)
18
+ return chalk.dim('—');
19
+ if (s === 'operacional' || s === 'online')
20
+ return chalk.green(s);
21
+ if (s === 'suspenso' || s === 'desativado' || s === 'offline')
22
+ return chalk.red(s);
23
+ if (s === 'em provisionamento')
24
+ return chalk.yellow(s);
25
+ return chalk.cyan(s);
26
+ }
27
+ export async function runServersList(opts) {
28
+ const token = await requireToken(opts.json);
29
+ const params = new URLSearchParams();
30
+ if (opts.status)
31
+ params.set('status', opts.status);
32
+ if (opts.provider)
33
+ params.set('provider', opts.provider);
34
+ if (opts.capacity)
35
+ params.set('capacity', 'true');
36
+ const qs = params.toString();
37
+ const spinner = opts.json ? null : ora({ text: 'Buscando servers…', color: 'blue' }).start();
38
+ let res;
39
+ try {
40
+ res = await apiRequest(`/api/cli/v1/servers${qs ? `?${qs}` : ''}`, { token });
41
+ spinner?.stop();
42
+ }
43
+ catch (error) {
44
+ spinner?.fail('Falha ao buscar servers.');
45
+ handleApiError(error, opts.json);
46
+ }
47
+ if (opts.json) {
48
+ console.log(JSON.stringify(res));
49
+ return;
50
+ }
51
+ log.heading(`Servers (${res.count})`);
52
+ const columns = [
53
+ { header: 'ID', value: (r) => r.id, maxWidth: 22 },
54
+ { header: 'NOME', value: (r) => r.name ?? '—', maxWidth: 24 },
55
+ { header: 'PROVIDER', value: (r) => r.provider ?? '—' },
56
+ { header: 'REGIÃO', value: (r) => r.region ?? '—' },
57
+ { header: 'STATUS', value: (r) => colorStatus(r.status) },
58
+ { header: 'IP', value: (r) => r.ipAddress ?? '—', maxWidth: 18 },
59
+ ];
60
+ if (opts.capacity) {
61
+ columns.push({
62
+ header: 'RAM (livre/total)',
63
+ value: (r) => r.totalRamMb != null
64
+ ? `${r.availableRamMb ?? '?'}/${r.totalRamMb}MB`
65
+ : '—',
66
+ }, {
67
+ header: 'CPU',
68
+ value: (r) => (r.cpuLoad != null ? `${r.cpuLoad}` : '—'),
69
+ });
70
+ }
71
+ renderTable(columns, res.servers);
72
+ console.log();
73
+ }
74
+ export async function runServersProvision(opts) {
75
+ const token = await requireToken(opts.json);
76
+ const spinner = opts.json
77
+ ? null
78
+ : ora({ text: `Provisionando VM ${opts.name} (${opts.zone})…`, color: 'blue' }).start();
79
+ let res;
80
+ try {
81
+ res = await apiRequest('/api/cli/v1/servers/provision', {
82
+ method: 'POST',
83
+ token,
84
+ body: {
85
+ name: opts.name,
86
+ zone: opts.zone,
87
+ machineType: opts.machineType,
88
+ tenantId: opts.tenant,
89
+ customerId: opts.customer,
90
+ },
91
+ });
92
+ spinner?.stop();
93
+ }
94
+ catch (error) {
95
+ spinner?.fail('Falha ao provisionar servidor.');
96
+ handleApiError(error, opts.json);
97
+ }
98
+ if (opts.json) {
99
+ console.log(JSON.stringify(res));
100
+ return;
101
+ }
102
+ log.success(`Servidor provisionado: ${res.serverId}`);
103
+ log.dim(`IP: ${res.ipAddress ?? '(ainda subindo)'} · GCP id: ${res.externalId ?? '—'}`);
104
+ log.warn('Registration token (single-use, expira em 30min):');
105
+ console.log(` ${chalk.yellow(res.token)}`);
106
+ }
107
+ export async function runServersDeactivate(id, opts) {
108
+ if (!id) {
109
+ log.error('Uso: neetru servers deactivate <serverId>');
110
+ process.exit(1);
111
+ }
112
+ const token = await requireToken(opts.json);
113
+ await confirmDestructive(`Desativar o servidor ${id}? O agente para de receber comandos.`, opts);
114
+ const { headers } = await resolveStepUp(opts);
115
+ const spinner = opts.json
116
+ ? null
117
+ : ora({ text: `Desativando servidor ${id}…`, color: 'blue' }).start();
118
+ let res;
119
+ try {
120
+ res = await apiRequest(`/api/cli/v1/servers/${encodeURIComponent(id)}/deactivate${opts.dryRun ? '?dryRun=true' : ''}`, { method: 'POST', token, headers });
121
+ spinner?.stop();
122
+ }
123
+ catch (error) {
124
+ spinner?.fail('Falha ao desativar servidor.');
125
+ handleApiError(error, opts.json);
126
+ }
127
+ printWriteResult(res.dryRun ? res : { serverId: res.serverId, status: res.status }, `Servidor ${res.serverId} → ${res.status}`, opts.json);
128
+ }
129
+ export async function runServersDispatch(id, commandType, opts) {
130
+ if (!id || !commandType) {
131
+ log.error('Uso: neetru servers dispatch <serverId> <commandType> [--params \'{"k":"v"}\']');
132
+ process.exit(1);
133
+ }
134
+ const token = await requireToken(opts.json);
135
+ let params;
136
+ if (opts.params) {
137
+ try {
138
+ const parsed = JSON.parse(opts.params);
139
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
140
+ params = parsed;
141
+ }
142
+ else {
143
+ log.error('--params precisa ser um objeto JSON.');
144
+ process.exit(1);
145
+ }
146
+ }
147
+ catch {
148
+ log.error('--params não é JSON válido.');
149
+ process.exit(1);
150
+ }
151
+ }
152
+ const spinner = opts.json
153
+ ? null
154
+ : ora({ text: `Enfileirando comando "${commandType}" no servidor ${id}…`, color: 'blue' }).start();
155
+ let res;
156
+ try {
157
+ res = await apiRequest(`/api/cli/v1/servers/${encodeURIComponent(id)}/dispatch`, { method: 'POST', token, body: { commandType, params } });
158
+ spinner?.stop();
159
+ }
160
+ catch (error) {
161
+ spinner?.fail('Falha ao despachar comando.');
162
+ handleApiError(error, opts.json);
163
+ }
164
+ printWriteResult({ commandId: res.commandId }, `Comando enfileirado: ${res.commandId}`, opts.json);
165
+ }
166
+ //# sourceMappingURL=servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../src/commands/servers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface SupportListOptions {
2
+ status?: string;
3
+ severity?: string;
4
+ product?: string;
5
+ customer?: string;
6
+ breached?: boolean;
7
+ limit?: string;
8
+ json?: boolean;
9
+ }
10
+ export declare function runSupportTicketsList(opts: SupportListOptions): Promise<void>;
11
+ export declare function runSupportTicketsDescribe(id: string, opts: {
12
+ json?: boolean;
13
+ }): Promise<void>;
14
+ export declare function runSupportTicketsReply(id: string, opts: {
15
+ message: string;
16
+ json?: boolean;
17
+ }): Promise<void>;
18
+ export declare function runSupportTicketsAssign(id: string, opts: {
19
+ to: string;
20
+ json?: boolean;
21
+ }): Promise<void>;
22
+ export declare function runSupportTicketsStatus(id: string, opts: {
23
+ to: string;
24
+ json?: boolean;
25
+ }): Promise<void>;