ninedeploy 0.10.6 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1 -0
  3. package/dist/client.d.ts +34 -0
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +81 -22
  6. package/dist/client.js.map +1 -1
  7. package/dist/commands/backupPolicy.d.ts +29 -0
  8. package/dist/commands/backupPolicy.d.ts.map +1 -0
  9. package/dist/commands/backupPolicy.js +111 -0
  10. package/dist/commands/backupPolicy.js.map +1 -0
  11. package/dist/commands/certificates.d.ts +18 -7
  12. package/dist/commands/certificates.d.ts.map +1 -1
  13. package/dist/commands/certificates.js +121 -1
  14. package/dist/commands/certificates.js.map +1 -1
  15. package/dist/commands/databaseAccess.d.ts +37 -0
  16. package/dist/commands/databaseAccess.d.ts.map +1 -0
  17. package/dist/commands/databaseAccess.js +306 -0
  18. package/dist/commands/databaseAccess.js.map +1 -0
  19. package/dist/commands/deploy.d.ts.map +1 -1
  20. package/dist/commands/deploy.js +28 -7
  21. package/dist/commands/deploy.js.map +1 -1
  22. package/dist/commands/githubApps.d.ts +40 -0
  23. package/dist/commands/githubApps.d.ts.map +1 -0
  24. package/dist/commands/githubApps.js +278 -0
  25. package/dist/commands/githubApps.js.map +1 -0
  26. package/dist/commands/housekeeping.d.ts +7 -0
  27. package/dist/commands/housekeeping.d.ts.map +1 -1
  28. package/dist/commands/housekeeping.js +16 -0
  29. package/dist/commands/housekeeping.js.map +1 -1
  30. package/dist/commands/logs.d.ts.map +1 -1
  31. package/dist/commands/logs.js +17 -2
  32. package/dist/commands/logs.js.map +1 -1
  33. package/dist/commands/manage.d.ts +26 -10
  34. package/dist/commands/manage.d.ts.map +1 -1
  35. package/dist/commands/manage.js +219 -65
  36. package/dist/commands/manage.js.map +1 -1
  37. package/dist/commands/manifest.d.ts.map +1 -1
  38. package/dist/commands/manifest.js +9 -1
  39. package/dist/commands/manifest.js.map +1 -1
  40. package/dist/commands/misc.d.ts +4 -2
  41. package/dist/commands/misc.d.ts.map +1 -1
  42. package/dist/commands/misc.js +25 -11
  43. package/dist/commands/misc.js.map +1 -1
  44. package/dist/commands/multiNode.d.ts +55 -0
  45. package/dist/commands/multiNode.d.ts.map +1 -0
  46. package/dist/commands/multiNode.js +438 -0
  47. package/dist/commands/multiNode.js.map +1 -0
  48. package/dist/commands/notifications.d.ts +1 -1
  49. package/dist/commands/operations.d.ts +89 -0
  50. package/dist/commands/operations.d.ts.map +1 -0
  51. package/dist/commands/operations.js +468 -0
  52. package/dist/commands/operations.js.map +1 -0
  53. package/dist/commands/panelBackup.d.ts +28 -0
  54. package/dist/commands/panelBackup.d.ts.map +1 -0
  55. package/dist/commands/panelBackup.js +153 -0
  56. package/dist/commands/panelBackup.js.map +1 -0
  57. package/dist/commands/plugins.d.ts +1 -1
  58. package/dist/commands/plugins.d.ts.map +1 -1
  59. package/dist/commands/plugins.js +7 -3
  60. package/dist/commands/plugins.js.map +1 -1
  61. package/dist/commands/proxyConfig.d.ts +16 -0
  62. package/dist/commands/proxyConfig.d.ts.map +1 -0
  63. package/dist/commands/proxyConfig.js +122 -0
  64. package/dist/commands/proxyConfig.js.map +1 -0
  65. package/dist/commands/secretProviders.d.ts +59 -0
  66. package/dist/commands/secretProviders.d.ts.map +1 -0
  67. package/dist/commands/secretProviders.js +212 -0
  68. package/dist/commands/secretProviders.js.map +1 -0
  69. package/dist/commands/services.d.ts.map +1 -1
  70. package/dist/commands/services.js +3 -5
  71. package/dist/commands/services.js.map +1 -1
  72. package/dist/commands/setup.d.ts +3 -1
  73. package/dist/commands/setup.d.ts.map +1 -1
  74. package/dist/commands/setup.js +19 -3
  75. package/dist/commands/setup.js.map +1 -1
  76. package/dist/commands/sources.d.ts +10 -3
  77. package/dist/commands/sources.d.ts.map +1 -1
  78. package/dist/commands/sources.js +116 -18
  79. package/dist/commands/sources.js.map +1 -1
  80. package/dist/commands/templates.d.ts.map +1 -1
  81. package/dist/commands/templates.js +8 -1
  82. package/dist/commands/templates.js.map +1 -1
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js +2 -1
  85. package/dist/config.js.map +1 -1
  86. package/dist/index.js +427 -23
  87. package/dist/index.js.map +1 -1
  88. package/dist/lib/format.d.ts.map +1 -1
  89. package/dist/lib/format.js +5 -4
  90. package/dist/lib/format.js.map +1 -1
  91. package/dist/lib/panelBackupFile.d.ts +3 -0
  92. package/dist/lib/panelBackupFile.d.ts.map +1 -0
  93. package/dist/lib/panelBackupFile.js +71 -0
  94. package/dist/lib/panelBackupFile.js.map +1 -0
  95. package/dist/lib/serverRunner.d.ts +6 -0
  96. package/dist/lib/serverRunner.d.ts.map +1 -1
  97. package/dist/lib/serverRunner.js +18 -3
  98. package/dist/lib/serverRunner.js.map +1 -1
  99. package/dist/prompts.d.ts.map +1 -1
  100. package/dist/prompts.js +9 -2
  101. package/dist/prompts.js.map +1 -1
  102. package/package.json +6 -5
  103. package/src/client.ts +137 -0
  104. package/src/commands/backupPolicy.ts +123 -0
  105. package/src/commands/branding.ts +83 -0
  106. package/src/commands/buildCache.ts +72 -0
  107. package/src/commands/certificates.ts +208 -0
  108. package/src/commands/communityTemplates.ts +97 -0
  109. package/src/commands/configCenter.ts +71 -0
  110. package/src/commands/configPresets.ts +215 -0
  111. package/src/commands/databaseAccess.ts +333 -0
  112. package/src/commands/demo.ts +22 -0
  113. package/src/commands/deploy.ts +284 -0
  114. package/src/commands/doctor.ts +170 -0
  115. package/src/commands/domains.ts +170 -0
  116. package/src/commands/egress.ts +135 -0
  117. package/src/commands/emailTemplates.ts +112 -0
  118. package/src/commands/firewall.ts +82 -0
  119. package/src/commands/githubApps.ts +292 -0
  120. package/src/commands/housekeeping.ts +106 -0
  121. package/src/commands/login.ts +58 -0
  122. package/src/commands/logs.ts +91 -0
  123. package/src/commands/manage.ts +714 -0
  124. package/src/commands/manifest.ts +314 -0
  125. package/src/commands/metrics.ts +69 -0
  126. package/src/commands/misc.ts +307 -0
  127. package/src/commands/multiNode.ts +442 -0
  128. package/src/commands/notifications.ts +174 -0
  129. package/src/commands/operations.ts +519 -0
  130. package/src/commands/panelBackup.ts +167 -0
  131. package/src/commands/pgbouncer.ts +65 -0
  132. package/src/commands/plugins.ts +123 -0
  133. package/src/commands/proxyConfig.ts +117 -0
  134. package/src/commands/secretProviders.ts +228 -0
  135. package/src/commands/server.ts +126 -0
  136. package/src/commands/services.ts +249 -0
  137. package/src/commands/setup.ts +94 -0
  138. package/src/commands/sources.ts +317 -0
  139. package/src/commands/sso.ts +106 -0
  140. package/src/commands/templates.ts +158 -0
  141. package/src/commands/token.ts +66 -0
  142. package/src/commands/webhooks.ts +93 -0
  143. package/src/commands/workspaces.ts +63 -0
  144. package/src/config.ts +53 -0
  145. package/src/index.ts +1273 -0
  146. package/src/lib/format.ts +182 -0
  147. package/src/lib/panelBackupFile.ts +67 -0
  148. package/src/lib/serverRunner.ts +223 -0
  149. package/src/prompts.ts +238 -0
@@ -0,0 +1,468 @@
1
+ import process from 'node:process';
2
+ import { prompt, promptHidden } from '../prompts.js';
3
+ import { c, error, fmtBytes, fmtTime, header, info, kv, spinner, success, table } from '../lib/format.js';
4
+ import { plain } from './sources.js';
5
+ /**
6
+ * 0.15 operations surfaces:
7
+ *
8
+ * ninedeploy terminals list|show <id>|kill <id>
9
+ * ninedeploy terminal service <id> | db <id> [--client] | container <name> | host [serverId]
10
+ * ninedeploy traffic settings [--enable|--disable] [--retention <days>] | summary | service <id>
11
+ * ninedeploy access grants list|add|update <grantId> [--role|--suspend|--reinstate]|remove <grantId> --workspace <id>
12
+ * ninedeploy access me
13
+ *
14
+ * Terminals and the instance traffic routes are operator only on the
15
+ * server. The host-shell password is read with a hidden prompt, never from
16
+ * argv. Every server-provided string goes through the F1011 sanitiser.
17
+ */
18
+ const message = (err) => plain(err instanceof Error ? err.message : String(err));
19
+ function positiveInt(raw, what) {
20
+ const n = Number(raw);
21
+ if (!raw || !Number.isInteger(n) || n <= 0) {
22
+ error(`${what} must be a positive integer`);
23
+ return null;
24
+ }
25
+ return n;
26
+ }
27
+ const STATUSES = ['pending', 'active', 'ended', 'failed', 'expired'];
28
+ const KINDS = ['service', 'database', 'container', 'host'];
29
+ const RANGES = ['1h', '24h', '7d', '30d'];
30
+ const ROLES = ['viewer', 'member', 'admin'];
31
+ function duration(ms) {
32
+ if (ms === null)
33
+ return '—';
34
+ const s = Math.round(ms / 1000);
35
+ return s < 60 ? `${s}s` : s < 3600 ? `${Math.floor(s / 60)}m ${s % 60}s` : `${Math.floor(s / 3600)}h ${Math.floor((s % 3600) / 60)}m`;
36
+ }
37
+ /** `ninedeploy terminals list [--status] [--target] [--limit] [--before]` */
38
+ export async function terminalsList(client, opts = {}) {
39
+ if (opts.status && !STATUSES.includes(opts.status))
40
+ return error(`--status must be one of ${STATUSES.join(', ')}`);
41
+ if (opts.target && !KINDS.includes(opts.target))
42
+ return error(`--target must be one of ${KINDS.join(', ')}`);
43
+ const limit = opts.limit === undefined ? undefined : positiveInt(opts.limit, '--limit');
44
+ const before = opts.before === undefined ? undefined : positiveInt(opts.before, '--before');
45
+ if (limit === null || before === null)
46
+ return;
47
+ try {
48
+ const page = await spinner('Loading terminal sessions', () => client.terminals.list({
49
+ ...(opts.status ? { status: opts.status } : {}),
50
+ ...(opts.target ? { targetKind: opts.target } : {}),
51
+ ...(limit !== undefined ? { limit } : {}),
52
+ ...(before !== undefined ? { before } : {}),
53
+ }));
54
+ header('Terminal sessions');
55
+ table(page.items.map((s) => ({
56
+ id: s.id,
57
+ target: `${s.targetKind}: ${plain(s.targetLabel)}`,
58
+ user: plain(s.userEmail ?? '—'),
59
+ status: s.status,
60
+ started: fmtTime(s.startedAt ?? s.createdAt),
61
+ duration: duration(s.durationMs),
62
+ ended: s.endReason ? plain(s.endReason) : '',
63
+ })), ['id', 'target', 'user', 'status', 'started', 'duration', 'ended']);
64
+ if (page.nextBefore !== null)
65
+ info(`Older sessions: ninedeploy terminals list --before ${page.nextBefore}`);
66
+ }
67
+ catch (err) {
68
+ error(message(err));
69
+ }
70
+ }
71
+ function printSession(s) {
72
+ kv('Session', `#${s.id}`);
73
+ kv('Target', `${s.targetKind}: ${plain(s.targetLabel)}`);
74
+ kv('Node', s.serverId === null ? 'panel host' : `#${s.serverId}`);
75
+ kv('User', s.userEmail === null ? null : plain(s.userEmail));
76
+ kv('Status', s.status);
77
+ kv('Created', s.createdAt);
78
+ kv('Started', s.startedAt);
79
+ kv('Ended', s.endedAt);
80
+ kv('Duration', duration(s.durationMs));
81
+ kv('Bytes in/out', `${fmtBytes(s.bytesIn)} / ${fmtBytes(s.bytesOut)}`);
82
+ kv('End reason', s.endReason === null ? null : plain(s.endReason));
83
+ kv('Exit code', s.exitCode);
84
+ kv('Client IP', s.clientIp);
85
+ }
86
+ /** `ninedeploy terminals show <id>` */
87
+ export async function terminalsShow(client, idRaw) {
88
+ const id = positiveInt(idRaw, 'Session id');
89
+ if (id === null)
90
+ return;
91
+ try {
92
+ const s = await spinner('Loading the session', () => client.terminals.get(id));
93
+ header(`Terminal session #${s.id}`);
94
+ printSession(s);
95
+ }
96
+ catch (err) {
97
+ error(message(err));
98
+ }
99
+ }
100
+ /** `ninedeploy terminals kill <id> [--yes]` */
101
+ export async function terminalsKill(client, idRaw, opts = {}) {
102
+ const id = positiveInt(idRaw, 'Session id');
103
+ if (id === null)
104
+ return;
105
+ if (!opts.yes) {
106
+ const answer = await prompt(`Terminate terminal session #${id}? Type "yes" to confirm`);
107
+ if (answer.trim().toLowerCase() !== 'yes')
108
+ return info('Cancelled');
109
+ }
110
+ try {
111
+ const res = await spinner('Terminating', () => client.terminals.terminate(id));
112
+ success(res.wasLive ? `Session #${id} terminated` : `Pending session #${id} revoked`);
113
+ }
114
+ catch (err) {
115
+ error(message(err));
116
+ }
117
+ }
118
+ async function wsSocketFactory() {
119
+ const { WebSocket } = await import('ws');
120
+ return (url, protocols) => new WebSocket(url, protocols);
121
+ }
122
+ /** Build the session target from `terminal <kind> <ref>`; prints the usage error and returns null when invalid. */
123
+ export function terminalTarget(kind, ref, opts = {}) {
124
+ switch (kind) {
125
+ case 'service': {
126
+ const serviceId = positiveInt(ref, 'Service id');
127
+ if (serviceId === null)
128
+ return null;
129
+ const replica = opts.replica === undefined ? undefined : positiveInt(opts.replica, '--replica');
130
+ const serverId = opts.node === undefined ? undefined : positiveInt(opts.node, '--node');
131
+ if (replica === null || serverId === null)
132
+ return null;
133
+ return { kind: 'service', serviceId, ...(replica !== undefined ? { replica } : {}), ...(serverId !== undefined ? { serverId } : {}) };
134
+ }
135
+ case 'db': {
136
+ const databaseId = positiveInt(ref, 'Database id');
137
+ if (databaseId === null)
138
+ return null;
139
+ return { kind: 'database', databaseId, mode: opts.client ? 'client' : 'shell' };
140
+ }
141
+ case 'container':
142
+ if (!ref || !/^[a-zA-Z0-9][a-zA-Z0-9_.-]{1,127}$/.test(ref)) {
143
+ error('Usage: ninedeploy terminal container <name>');
144
+ return null;
145
+ }
146
+ return { kind: 'container', name: ref };
147
+ case 'host': {
148
+ if (ref === undefined)
149
+ return { kind: 'host', serverId: null };
150
+ const serverId = positiveInt(ref, 'Server id');
151
+ return serverId === null ? null : { kind: 'host', serverId };
152
+ }
153
+ default:
154
+ error('Usage: ninedeploy terminal service <id> | db <id> | container <name> | host [serverId]');
155
+ return null;
156
+ }
157
+ }
158
+ /**
159
+ * `ninedeploy terminal <kind> <ref>`: an interactive shell over protocol v1.
160
+ * The local terminal is put in raw mode, window resizes are forwarded, and
161
+ * the shell's exit code becomes the CLI's.
162
+ */
163
+ export async function terminalOpen(client, kind, ref, opts = {}, io = { stdin: process.stdin, stdout: process.stdout, stderr: process.stderr }) {
164
+ const target = terminalTarget(kind, ref, opts);
165
+ if (target === null)
166
+ return;
167
+ const { stdin, stdout, stderr } = io;
168
+ if (!stdin.isTTY || typeof stdin.setRawMode !== 'function') {
169
+ return error('An interactive terminal needs a TTY on stdin.');
170
+ }
171
+ let password;
172
+ if (target.kind === 'host') {
173
+ // Step-up for every host shell. SSO-only accounts: leave it empty within 10 minutes of signing in.
174
+ password = (await promptHidden('Your password (host shell re-check)')) || undefined;
175
+ }
176
+ let created;
177
+ try {
178
+ created = await client.terminals.create({
179
+ target,
180
+ cols: Math.min(500, Math.max(10, stdout.columns || 120)),
181
+ rows: Math.min(200, Math.max(5, stdout.rows || 32)),
182
+ ...(password ? { password } : {}),
183
+ });
184
+ }
185
+ catch (err) {
186
+ return error(message(err));
187
+ }
188
+ const socketFactory = io.socketFactory ?? (await wsSocketFactory());
189
+ await new Promise((resolve) => {
190
+ let exitCode = null;
191
+ const onInput = (chunk) => conn.write(typeof chunk === 'string' ? chunk : new Uint8Array(chunk));
192
+ const onResize = () => conn.resize(stdout.columns, stdout.rows);
193
+ const conn = client.terminals.connect(created, {
194
+ onReady: (ready) => {
195
+ stderr.write(c.dim(`Connected to ${plain(ready.target.label)} (session #${ready.sessionId}). The shell's exit closes it.\r\n`));
196
+ },
197
+ onData: (bytes) => stdout.write(bytes),
198
+ onNotice: (text) => stderr.write(`\r\n${c.yellow(plain(text))}\r\n`),
199
+ onExit: (exit) => {
200
+ exitCode = exit.code;
201
+ },
202
+ onClose: (close) => {
203
+ stdin.removeListener('data', onInput);
204
+ stdout.removeListener('resize', onResize);
205
+ stdin.setRawMode(false);
206
+ stdin.pause();
207
+ if (close.code === 1000) {
208
+ process.exitCode = exitCode ?? 0;
209
+ }
210
+ else {
211
+ stderr.write(`\r\n${c.red(close.message)}\r\n`);
212
+ process.exitCode = 1;
213
+ }
214
+ resolve();
215
+ },
216
+ }, { socketFactory });
217
+ stdin.setRawMode(true);
218
+ stdin.resume();
219
+ stdin.on('data', onInput);
220
+ stdout.on('resize', onResize);
221
+ });
222
+ }
223
+ // ── traffic ───────────────────────────────────────────────────────────────
224
+ function printTrafficSettings(v) {
225
+ kv('Enabled', v.enabled ? c.green('yes') : 'no');
226
+ kv('Status', v.status);
227
+ kv('Retention', `${v.retentionDays} days (hour rows; minute rows 48h)`);
228
+ kv('Last ingest', v.lastIngestAt ? fmtTime(v.lastIngestAt) : null);
229
+ kv('Log file', fmtBytes(v.logBytes));
230
+ kv('Malformed', v.malformedLines);
231
+ kv('Log driver', v.dockerLogDriver);
232
+ if (v.lastError)
233
+ kv('Last error', c.red(plain(v.lastError)));
234
+ }
235
+ /** `ninedeploy traffic settings [--enable|--disable] [--retention <days>] [--yes]` */
236
+ export async function trafficSettings(client, opts = {}) {
237
+ if (opts.enable && opts.disable)
238
+ return error('Use either --enable or --disable');
239
+ const retentionDays = opts.retention === undefined ? undefined : positiveInt(opts.retention, '--retention');
240
+ if (retentionDays === null)
241
+ return;
242
+ const enabled = opts.enable ? true : opts.disable ? false : undefined;
243
+ try {
244
+ if (enabled === undefined && retentionDays === undefined) {
245
+ const v = await spinner('Reading traffic settings', () => client.traffic.settings.get());
246
+ header('Traffic analytics');
247
+ printTrafficSettings(v);
248
+ return;
249
+ }
250
+ if (enabled !== undefined && !opts.yes) {
251
+ info('Turning analytics on or off recreates Traefik once: about 1–2 seconds of refused connections on every domain.');
252
+ const answer = await prompt('Continue? Type "yes" to confirm');
253
+ if (answer.trim().toLowerCase() !== 'yes')
254
+ return info('Cancelled');
255
+ }
256
+ const v = await spinner('Saving traffic settings', () => client.traffic.settings.set({ ...(enabled !== undefined ? { enabled } : {}), ...(retentionDays !== undefined ? { retentionDays } : {}) }));
257
+ success('Traffic settings saved');
258
+ printTrafficSettings(v);
259
+ }
260
+ catch (err) {
261
+ error(message(err));
262
+ // A recreate can cut this very connection: say how to read the real state.
263
+ if (enabled !== undefined)
264
+ info('Check the current state with `ninedeploy traffic settings`.');
265
+ }
266
+ }
267
+ function parseRange(raw) {
268
+ if (raw === undefined)
269
+ return undefined;
270
+ if (RANGES.includes(raw))
271
+ return raw;
272
+ error(`--range must be one of ${RANGES.join(', ')}`);
273
+ return null;
274
+ }
275
+ const ms = (v) => (v === null ? '—' : `${Math.round(v)}ms`);
276
+ const scopeRows = (rows) => rows.map((r) => ({
277
+ host: plain(r.host ?? r.scopeKey),
278
+ requests: r.requests,
279
+ '5xx': r.status5xx,
280
+ p95: ms(r.p95Ms),
281
+ sent: fmtBytes(r.bytesOut),
282
+ }));
283
+ /** `ninedeploy traffic summary [--range] [--top]` */
284
+ export async function trafficSummary(client, opts = {}) {
285
+ const range = parseRange(opts.range);
286
+ const top = opts.top === undefined ? undefined : positiveInt(opts.top, '--top');
287
+ if (range === null || top === null)
288
+ return;
289
+ try {
290
+ const s = await spinner('Loading traffic', () => client.traffic.summary({ ...(range ? { range } : {}), ...(top !== undefined ? { top } : {}) }));
291
+ header(`Traffic (${s.range})`);
292
+ if (!s.enabled)
293
+ info('Traffic analytics is off. Turn it on with `ninedeploy traffic settings --enable`.');
294
+ kv('Requests', s.totals.requests);
295
+ kv('2xx / 4xx / 5xx', `${s.totals.status2xx} / ${s.totals.status4xx} / ${s.totals.status5xx}`);
296
+ kv('p50 / p95 / p99', `${ms(s.totals.p50Ms)} / ${ms(s.totals.p95Ms)} / ${ms(s.totals.p99Ms)}`);
297
+ kv('Sent', fmtBytes(s.totals.bytesOut));
298
+ console.log();
299
+ table(scopeRows([...s.topDomains, ...[s.panel, s.custom].filter((r) => r !== null)]), ['host', 'requests', '5xx', 'p95', 'sent']);
300
+ }
301
+ catch (err) {
302
+ error(message(err));
303
+ }
304
+ }
305
+ /** `ninedeploy traffic service <id> [--range]` */
306
+ export async function trafficService(client, idRaw, opts = {}) {
307
+ const id = positiveInt(idRaw, 'Service id');
308
+ const range = parseRange(opts.range);
309
+ if (id === null || range === null)
310
+ return;
311
+ try {
312
+ const s = await spinner('Loading traffic', () => client.traffic.service(id, range ? { range } : {}));
313
+ header(`Service #${id} traffic (${s.range})`);
314
+ if (!s.enabled)
315
+ return info('Traffic analytics is off on this panel.');
316
+ kv('Requests', s.totals.requests);
317
+ kv('5xx', s.totals.status5xx);
318
+ kv('p50 / p95 / p99', `${ms(s.totals.p50Ms)} / ${ms(s.totals.p95Ms)} / ${ms(s.totals.p99Ms)}`);
319
+ console.log();
320
+ table(scopeRows(s.domains), ['host', 'requests', '5xx', 'p95', 'sent']);
321
+ }
322
+ catch (err) {
323
+ error(message(err));
324
+ }
325
+ }
326
+ // ── access grants ─────────────────────────────────────────────────────────
327
+ const grantTarget = (g) => [g.project ? `project ${plain(g.project.name)}` : null, g.environment ? `env ${plain(g.environment.name)}` : null].filter(Boolean).join(' · ');
328
+ function printGrants(grants) {
329
+ table(grants.map((g) => ({
330
+ id: g.id,
331
+ workspace: g.workspaceId,
332
+ user: plain(g.user.email),
333
+ target: grantTarget(g),
334
+ role: g.role,
335
+ flags: [g.isGuest ? 'guest' : '', g.suspended ? 'suspended' : ''].filter(Boolean).join(','),
336
+ })), ['id', 'workspace', 'user', 'target', 'role', 'flags']);
337
+ }
338
+ function parseRole(raw) {
339
+ if (raw && ROLES.includes(raw))
340
+ return raw;
341
+ error(`--role must be one of ${ROLES.join(', ')}`);
342
+ return null;
343
+ }
344
+ /** `ninedeploy access grants list --workspace <id> [--user <id>] [--project <id>]` */
345
+ export async function accessGrantsList(client, opts = {}) {
346
+ const workspaceId = positiveInt(opts.workspace, '--workspace');
347
+ if (workspaceId === null)
348
+ return;
349
+ const filters = {};
350
+ for (const [flag, key] of [['user', 'userId'], ['project', 'projectId'], ['environment', 'environmentId']]) {
351
+ if (opts[flag] === undefined)
352
+ continue;
353
+ const v = positiveInt(opts[flag], `--${flag}`);
354
+ if (v === null)
355
+ return;
356
+ filters[key] = v;
357
+ }
358
+ try {
359
+ const grants = await spinner('Loading access grants', () => client.accessGrants.list(workspaceId, filters));
360
+ header(`Access grants in workspace #${workspaceId}`);
361
+ printGrants(grants);
362
+ }
363
+ catch (err) {
364
+ error(message(err));
365
+ }
366
+ }
367
+ /** `ninedeploy access grants add --workspace <id> (--email|--user) (--project|--environment) --role <role>` */
368
+ export async function accessGrantsAdd(client, opts = {}) {
369
+ const workspaceId = positiveInt(opts.workspace, '--workspace');
370
+ if (workspaceId === null)
371
+ return;
372
+ if ((opts.email === undefined) === (opts.user === undefined))
373
+ return error('Name the user with exactly one of --email or --user');
374
+ if (opts.project === undefined && opts.environment === undefined)
375
+ return error('A grant needs --project, --environment, or both');
376
+ const role = parseRole(opts.role);
377
+ if (role === null)
378
+ return;
379
+ const input = { role };
380
+ if (opts.email !== undefined)
381
+ input.email = opts.email.trim().toLowerCase();
382
+ for (const [flag, key] of [['user', 'userId'], ['project', 'projectId'], ['environment', 'environmentId']]) {
383
+ if (opts[flag] === undefined)
384
+ continue;
385
+ const v = positiveInt(opts[flag], `--${flag}`);
386
+ if (v === null)
387
+ return;
388
+ input[key] = v;
389
+ }
390
+ try {
391
+ const g = await spinner('Granting access', () => client.accessGrants.create(workspaceId, input));
392
+ success(`Grant #${g.id}: ${plain(g.user.email)} is ${g.role} on ${grantTarget(g)}${g.isGuest ? ' (guest)' : ''}`);
393
+ }
394
+ catch (err) {
395
+ error(message(err));
396
+ }
397
+ }
398
+ /**
399
+ * `ninedeploy access grants update <grantId> --workspace <id> [--role <role>] [--suspend | --reinstate]`
400
+ *
401
+ * A suspended grant stays listed but gives no access; `--reinstate` makes it
402
+ * count again (refused while the user's identity provider has them suspended).
403
+ */
404
+ export async function accessGrantsUpdate(client, grantRaw, opts = {}) {
405
+ const workspaceId = positiveInt(opts.workspace, '--workspace');
406
+ const grantId = workspaceId === null ? null : positiveInt(grantRaw, 'Grant id');
407
+ if (workspaceId === null || grantId === null)
408
+ return;
409
+ if (opts.suspend && opts.reinstate)
410
+ return error('Pass only one of --suspend or --reinstate');
411
+ const suspended = opts.suspend ? true : opts.reinstate ? false : undefined;
412
+ if (opts.role === undefined && suspended === undefined)
413
+ return error('Pass --role, --suspend or --reinstate');
414
+ const input = {};
415
+ if (opts.role !== undefined) {
416
+ const role = parseRole(opts.role);
417
+ if (role === null)
418
+ return;
419
+ input.role = role;
420
+ }
421
+ if (suspended !== undefined)
422
+ input.suspended = suspended;
423
+ try {
424
+ const g = await spinner(suspended === undefined ? 'Changing the role' : 'Updating the grant', () => client.accessGrants.update(workspaceId, grantId, input));
425
+ if (suspended === undefined)
426
+ success(`Grant #${g.id} is now ${g.role}`);
427
+ else
428
+ success(`Grant #${g.id} is now ${input.role !== undefined ? `${g.role}, ` : ''}${g.suspended ? 'suspended' : 'active'}`);
429
+ }
430
+ catch (err) {
431
+ error(message(err));
432
+ }
433
+ }
434
+ /** `ninedeploy access grants remove <grantId> --workspace <id> [--yes]` */
435
+ export async function accessGrantsRemove(client, grantRaw, opts = {}) {
436
+ const workspaceId = positiveInt(opts.workspace, '--workspace');
437
+ const grantId = workspaceId === null ? null : positiveInt(grantRaw, 'Grant id');
438
+ if (workspaceId === null || grantId === null)
439
+ return;
440
+ if (!opts.yes) {
441
+ const answer = await prompt(`Revoke grant #${grantId}? Type "yes" to confirm`);
442
+ if (answer.trim().toLowerCase() !== 'yes')
443
+ return info('Cancelled');
444
+ }
445
+ try {
446
+ await spinner('Revoking', () => client.accessGrants.delete(workspaceId, grantId));
447
+ success(`Grant #${grantId} revoked`);
448
+ }
449
+ catch (err) {
450
+ error(message(err));
451
+ }
452
+ }
453
+ /** `ninedeploy access me` */
454
+ export async function accessMe(client) {
455
+ try {
456
+ const me = await spinner('Loading your access', () => client.access.me());
457
+ header('Your access grants');
458
+ printGrants(me.grants);
459
+ if (me.guestWorkspaces.length > 0) {
460
+ header('Guest workspaces (reached through grants only)');
461
+ table(me.guestWorkspaces.map((w) => ({ id: w.id, name: plain(w.name), slug: plain(w.slug) })), ['id', 'name', 'slug']);
462
+ }
463
+ }
464
+ catch (err) {
465
+ error(message(err));
466
+ }
467
+ }
468
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/commands/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `ninedeploy system panel-backup {status,set,now,list,decrypt}` — the panel's
3
+ * own scheduled, passphrase-sealed backup (0.12). `decrypt` works offline: it
4
+ * is the restore path on a new server (decrypt, then `ninedeploy system import`).
5
+ */
6
+ import type { PanelBackupSettingsPatch } from '@ninedeploy/sdk';
7
+ import type { NineDeployClient } from '../client.js';
8
+ export declare function panelBackupStatusAction(client: NineDeployClient): Promise<void>;
9
+ export interface PanelBackupSetOptions {
10
+ enable?: boolean;
11
+ disable?: boolean;
12
+ cron?: string;
13
+ destination?: string;
14
+ retain?: string;
15
+ passphrase?: boolean;
16
+ }
17
+ /** Build the PUT body from flags; returns an error string for bad input. */
18
+ export declare function panelBackupSetBody(opts: PanelBackupSetOptions, ask?: (msg: string) => Promise<string>): Promise<PanelBackupSettingsPatch | string>;
19
+ export declare function panelBackupSetAction(client: NineDeployClient, opts: PanelBackupSetOptions): Promise<void>;
20
+ export declare function panelBackupNowAction(client: NineDeployClient, opts: {
21
+ wait?: boolean;
22
+ }, sleep?: (ms: number) => Promise<void>): Promise<void>;
23
+ export declare function panelBackupListAction(client: NineDeployClient, opts: {
24
+ destination?: string;
25
+ }): Promise<void>;
26
+ /** Offline: open a downloaded `.ndpb` into the `.tar.gz` that `system import` takes. */
27
+ export declare function panelBackupDecryptAction(file: string, out: string | undefined, ask?: (msg: string) => Promise<string>): Promise<void>;
28
+ //# sourceMappingURL=panelBackup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panelBackup.d.ts","sourceRoot":"","sources":["../../src/commands/panelBackup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,wBAAwB,EAAqB,MAAM,iBAAiB,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA4BrD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrF;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,4EAA4E;AAC5E,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,qBAAqB,EAC3B,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAgB,GACnD,OAAO,CAAC,wBAAwB,GAAG,MAAM,CAAC,CAyB5C;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/G;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACxB,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAiD,GACnF,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnH;AAED,wFAAwF;AACxF,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAgB,GACnD,OAAO,CAAC,IAAI,CAAC,CAYf"}