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,438 @@
1
+ import { AGENT_SWARM_MANAGER_VAR } from '@ninedeploy/sdk';
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.16 T8: multi-node surfaces (the routes shipped in 0.15.2-0.15.4).
7
+ *
8
+ * ninedeploy servers list | roles <id> [--build-server on|off] [--build-concurrency <n>]
9
+ * ninedeploy services placement <id> [--build-on target|panel|server] [--build-server <id|none>]
10
+ * [--push-registry <sourceId|none> --push-repo <repo>] [--orchestrator container|swarm]
11
+ * ninedeploy services transfers <id> [--limit <n>] | swarm <id>
12
+ * ninedeploy swarm status | init --advertise-addr <ip> | enable | disable | join <serverId> | leave <serverId> [-y]
13
+ * ninedeploy volumes create <name> [--server <id>] (list and rm take --server too)
14
+ * ninedeploy sources allow-on-nodes <id> on|off
15
+ * ninedeploy sources pin-host-keys <id> on|off | reset-host-keys <id> | host-keys <id>
16
+ *
17
+ * Every route here is operator only except the service reads. Step-up
18
+ * passwords (swarm init, swarm enable, allow-on-nodes on) are read with a
19
+ * hidden prompt, never from argv. Server-provided strings go through the
20
+ * F1011 sanitiser.
21
+ */
22
+ const message = (err) => plain(err instanceof Error ? err.message : String(err));
23
+ const codeOf = (err) => {
24
+ const code = err?.code;
25
+ return typeof code === 'string' ? code : undefined;
26
+ };
27
+ /** F537: canonical decimal ids only (`0x10`, `1e1` and `""` are refused, never reinterpreted). */
28
+ function positiveInt(raw, what) {
29
+ const n = raw !== undefined && /^[1-9]\d*$/.test(raw) ? Number(raw) : Number.NaN;
30
+ if (!Number.isSafeInteger(n)) {
31
+ error(`${what} must be a positive integer`);
32
+ return null;
33
+ }
34
+ return n;
35
+ }
36
+ /** `on` / `off` (also true/false, yes/no); null after printing the usage error. */
37
+ function onOff(raw, what) {
38
+ const v = raw?.trim().toLowerCase();
39
+ if (v === 'on' || v === 'true' || v === 'yes')
40
+ return true;
41
+ if (v === 'off' || v === 'false' || v === 'no')
42
+ return false;
43
+ error(`${what} must be on or off`);
44
+ return null;
45
+ }
46
+ function warn(warnings) {
47
+ for (const w of warnings ?? [])
48
+ console.log(` ${c.yellow('!')} ${c.yellow(plain(w))}`);
49
+ }
50
+ /** Step-up for a sensitive change: an empty answer leaves it to a recent sign-in (SSO-only accounts). */
51
+ async function stepUpPassword() {
52
+ return (await promptHidden('Your password (step-up re-check)')) || undefined;
53
+ }
54
+ // ── servers ───────────────────────────────────────────────────────────────
55
+ /** `ninedeploy servers list` */
56
+ export async function serversList(client) {
57
+ try {
58
+ const rows = await spinner('Loading servers', () => client.servers.list());
59
+ header('Servers');
60
+ if (rows.length === 0)
61
+ return info('No servers registered. Add one in the panel (Servers) or with the bootstrap script.');
62
+ table(rows.map((s) => ({
63
+ id: s.id,
64
+ name: plain(s.name),
65
+ host: `${plain(s.host)}:${s.port}`,
66
+ status: s.status,
67
+ agent: s.agent?.version ? plain(s.agent.version) : c.gray('—'),
68
+ build: s.isBuildServer ? `on (${s.buildConcurrency ?? 1})` : c.gray('off'),
69
+ databases: s.databases ?? 0,
70
+ swarm: s.swarmNodeId ? (s.swarmRole ?? 'member') : c.gray('—'),
71
+ })), ['id', 'name', 'host', 'status', 'agent', 'build', 'databases', 'swarm']);
72
+ for (const s of rows) {
73
+ if (s.features?.reason)
74
+ info(`${plain(s.name)}: ${plain(s.features.reason)}`);
75
+ }
76
+ }
77
+ catch (err) {
78
+ error(message(err));
79
+ }
80
+ }
81
+ /** `ninedeploy servers roles <id> [--build-server on|off] [--build-concurrency <n>]` */
82
+ export async function serversRoles(client, idRaw, opts = {}) {
83
+ const id = positiveInt(idRaw, 'Server id');
84
+ if (id === null)
85
+ return;
86
+ if (opts.buildServer === undefined && opts.buildConcurrency === undefined) {
87
+ return error('Usage: ninedeploy servers roles <id> [--build-server on|off] [--build-concurrency 1-8]');
88
+ }
89
+ const isBuildServer = opts.buildServer === undefined ? undefined : onOff(opts.buildServer, '--build-server');
90
+ if (isBuildServer === null)
91
+ return;
92
+ let buildConcurrency;
93
+ if (opts.buildConcurrency !== undefined) {
94
+ const n = /^[1-8]$/.test(opts.buildConcurrency) ? Number(opts.buildConcurrency) : Number.NaN;
95
+ if (Number.isNaN(n))
96
+ return error('--build-concurrency must be an integer from 1 to 8');
97
+ buildConcurrency = n;
98
+ }
99
+ try {
100
+ const res = await spinner('Saving the role', () => client.servers.update(id, { ...(isBuildServer !== undefined ? { isBuildServer } : {}), ...(buildConcurrency !== undefined ? { buildConcurrency } : {}) }));
101
+ success(`${plain(res.name)}: build server ${res.isBuildServer ? `on (concurrency ${res.buildConcurrency})` : 'off'}`);
102
+ if (!res.isBuildServer && res.buildServiceIds.length > 0) {
103
+ info(`Services still set to build here fail their next deploy until moved: ${res.buildServiceIds.join(', ')}`);
104
+ }
105
+ }
106
+ catch (err) {
107
+ error(message(err));
108
+ }
109
+ }
110
+ const BUILD_ON = ['target', 'panel', 'server'];
111
+ const ORCHESTRATORS = ['container', 'swarm'];
112
+ function printPlacement(p) {
113
+ kv('Build on', p.buildOn ?? 'target (default)');
114
+ kv('Build server', p.buildServerId === null ? null : `#${p.buildServerId}`);
115
+ kv('Push registry', p.pushRegistrySourceId === null ? 'none (stream relay)' : `source #${p.pushRegistrySourceId} → ${plain(p.pushRepository)}`);
116
+ kv('Orchestrator', p.orchestrator ?? 'container (default)');
117
+ }
118
+ /** The PUT body from the flags; null after printing the error. */
119
+ export function placementInput(opts) {
120
+ const input = {};
121
+ if (opts.buildOn !== undefined) {
122
+ if (!BUILD_ON.includes(opts.buildOn)) {
123
+ error(`--build-on must be one of ${BUILD_ON.join(', ')}`);
124
+ return null;
125
+ }
126
+ input.buildOn = opts.buildOn;
127
+ }
128
+ if (opts.buildServer !== undefined) {
129
+ if (opts.buildServer === 'none')
130
+ input.buildServerId = null;
131
+ else {
132
+ const id = positiveInt(opts.buildServer, '--build-server');
133
+ if (id === null)
134
+ return null;
135
+ input.buildServerId = id;
136
+ }
137
+ }
138
+ if (opts.pushRegistry !== undefined) {
139
+ if (opts.pushRegistry === 'none') {
140
+ input.pushRegistrySourceId = null;
141
+ input.pushRepository = null;
142
+ }
143
+ else {
144
+ const id = positiveInt(opts.pushRegistry, '--push-registry');
145
+ if (id === null)
146
+ return null;
147
+ if (!opts.pushRepo) {
148
+ error('--push-registry needs --push-repo <repository> (for example team/app)');
149
+ return null;
150
+ }
151
+ input.pushRegistrySourceId = id;
152
+ input.pushRepository = opts.pushRepo;
153
+ }
154
+ }
155
+ else if (opts.pushRepo !== undefined) {
156
+ error('--push-repo needs --push-registry <sourceId>');
157
+ return null;
158
+ }
159
+ if (opts.orchestrator !== undefined) {
160
+ if (!ORCHESTRATORS.includes(opts.orchestrator)) {
161
+ error(`--orchestrator must be one of ${ORCHESTRATORS.join(', ')}`);
162
+ return null;
163
+ }
164
+ input.orchestrator = opts.orchestrator;
165
+ }
166
+ return input;
167
+ }
168
+ /** `ninedeploy services placement <id> [flags]`: show, or (operator) change, the build placement. */
169
+ export async function servicesPlacement(client, idRaw, opts = {}) {
170
+ const id = positiveInt(idRaw, 'Service id');
171
+ if (id === null)
172
+ return;
173
+ const input = placementInput(opts);
174
+ if (input === null)
175
+ return;
176
+ try {
177
+ if (Object.keys(input).length === 0) {
178
+ const view = await spinner('Loading the placement', () => client.services.placement.get(id));
179
+ header(`Service #${id} placement`);
180
+ printPlacement(view);
181
+ return;
182
+ }
183
+ const view = await spinner('Saving the placement', () => client.services.placement.set(id, input));
184
+ success(`Placement of service #${id} saved; the next deploy uses it.`);
185
+ printPlacement(view);
186
+ }
187
+ catch (err) {
188
+ error(message(err));
189
+ }
190
+ }
191
+ function transferHost(id) {
192
+ return id === null ? 'panel' : `#${id}`;
193
+ }
194
+ /** `ninedeploy services transfers <id> [--limit <n>]` */
195
+ export async function servicesTransfers(client, idRaw, opts = {}) {
196
+ const id = positiveInt(idRaw, 'Service id');
197
+ if (id === null)
198
+ return;
199
+ let limit;
200
+ if (opts.limit !== undefined) {
201
+ const n = /^[1-9]\d{0,2}$/.test(opts.limit) ? Number(opts.limit) : Number.NaN;
202
+ if (Number.isNaN(n) || n > 100)
203
+ return error('--limit must be an integer from 1 to 100');
204
+ limit = n;
205
+ }
206
+ try {
207
+ const rows = await spinner('Loading image transfers', () => client.services.imageTransfers(id, limit === undefined ? undefined : { limit }));
208
+ header(`Image transfers of service #${id}`);
209
+ if (rows.length === 0)
210
+ return info('No image transfers yet: the service builds where it runs.');
211
+ table(rows.map((t) => ({
212
+ id: t.id,
213
+ deploy: t.deploymentId ?? '—',
214
+ method: t.method,
215
+ route: `${transferHost(t.sourceServerId)} → ${transferHost(t.targetServerId)}`,
216
+ size: fmtBytes(t.bytes),
217
+ time: t.durationMs === null ? '—' : `${(t.durationMs / 1000).toFixed(1)}s`,
218
+ status: t.status,
219
+ started: fmtTime(t.startedAt),
220
+ error: t.error ? plain(t.error).slice(0, 80) : '',
221
+ })), ['id', 'deploy', 'method', 'route', 'size', 'time', 'status', 'started', 'error']);
222
+ }
223
+ catch (err) {
224
+ error(message(err));
225
+ }
226
+ }
227
+ /** `ninedeploy services swarm <id>` */
228
+ export async function servicesSwarm(client, idRaw) {
229
+ const id = positiveInt(idRaw, 'Service id');
230
+ if (id === null)
231
+ return;
232
+ try {
233
+ const view = await spinner('Loading Swarm tasks', () => client.services.swarm(id));
234
+ header(`Service #${id} on Swarm`);
235
+ if (view.stack === null)
236
+ return info('Not on Swarm (or not deployed yet). Switch with: ninedeploy services placement <id> --orchestrator swarm');
237
+ kv('Stack', plain(view.stack));
238
+ kv('Replicas', `${view.running} running / ${view.desired} desired`);
239
+ table(view.tasks.map((t) => ({ node: plain(t.node), status: plain(t.state), image: plain(t.image), error: t.error ? plain(t.error) : '' })), ['node', 'status', 'image', 'error']);
240
+ }
241
+ catch (err) {
242
+ error(message(err));
243
+ }
244
+ }
245
+ // ── swarm ─────────────────────────────────────────────────────────────────
246
+ function printSwarm(s) {
247
+ kv('Swarm deploys', s.enabled ? c.green('enabled') : 'disabled');
248
+ kv('Panel host', plain(s.localState));
249
+ kv('Manager', s.controlAvailable ? 'yes' : 'no');
250
+ kv('Join address', s.managerAddr === null ? null : plain(s.managerAddr));
251
+ if (s.nodes.length > 0) {
252
+ console.log();
253
+ table(s.nodes.map((n) => ({
254
+ id: plain(n.id).slice(0, 12),
255
+ hostname: plain(n.hostname),
256
+ role: n.role,
257
+ availability: plain(n.availability),
258
+ status: plain(n.state),
259
+ server: n.serverId === null ? c.gray('—') : `#${n.serverId}`,
260
+ })), ['id', 'hostname', 'role', 'availability', 'status', 'server']);
261
+ for (const n of s.nodes)
262
+ warn(n.warnings);
263
+ }
264
+ warn(s.warnings);
265
+ }
266
+ /** `ninedeploy swarm status` */
267
+ export async function swarmStatus(client) {
268
+ try {
269
+ const s = await spinner('Loading Swarm status', () => client.swarm.get());
270
+ header('Swarm');
271
+ printSwarm(s);
272
+ }
273
+ catch (err) {
274
+ error(message(err));
275
+ }
276
+ }
277
+ /** `ninedeploy swarm init --advertise-addr <ip>`: asks for the password (step-up). */
278
+ export async function swarmInit(client, opts = {}) {
279
+ const advertiseAddr = opts.advertiseAddr?.trim();
280
+ if (!advertiseAddr)
281
+ return error('Usage: ninedeploy swarm init --advertise-addr <ip> (the address the nodes reach the panel host on)');
282
+ const password = await stepUpPassword();
283
+ try {
284
+ const s = await spinner('Initialising Swarm on the panel host', () => client.swarm.init({ advertiseAddr, ...(password ? { password } : {}) }));
285
+ success('Swarm initialised on the panel host. Enable Swarm deploys with: ninedeploy swarm enable');
286
+ printSwarm(s);
287
+ }
288
+ catch (err) {
289
+ error(message(err));
290
+ }
291
+ }
292
+ /** `ninedeploy swarm enable|disable`: enabling asks for the password (step-up). */
293
+ export async function swarmSetEnabled(client, enabled) {
294
+ const password = enabled ? await stepUpPassword() : undefined;
295
+ try {
296
+ const s = await spinner(enabled ? 'Enabling Swarm deploys' : 'Disabling Swarm deploys', () => client.swarm.settings({ enabled, ...(password ? { password } : {}) }));
297
+ success(enabled ? 'Swarm deploys enabled.' : 'Swarm deploys disabled; running stacks keep running.');
298
+ printSwarm(s);
299
+ }
300
+ catch (err) {
301
+ error(message(err));
302
+ }
303
+ }
304
+ /** `ninedeploy swarm join <serverId>` */
305
+ export async function swarmJoin(client, idRaw) {
306
+ const id = positiveInt(idRaw, 'Server id');
307
+ if (id === null)
308
+ return;
309
+ try {
310
+ const res = await spinner(`Joining server #${id} to the swarm`, () => client.servers.swarmJoin(id));
311
+ success(`Server #${res.serverId} joined the swarm as a ${res.role} (node ${plain(res.nodeId).slice(0, 12)}).`);
312
+ warn(res.warnings);
313
+ }
314
+ catch (err) {
315
+ error(message(err));
316
+ if (codeOf(err) === 'node_swarm_not_enabled') {
317
+ info(`Swarm membership is opt-in on the node: set ${AGENT_SWARM_MANAGER_VAR}=<panel advertise address>:2377 in the agent's environment, restart the agent, and run this again.`);
318
+ }
319
+ }
320
+ }
321
+ /** `ninedeploy swarm leave <serverId> [-y]`: drains the node first (up to 5 minutes). */
322
+ export async function swarmLeave(client, idRaw, opts = {}) {
323
+ const id = positiveInt(idRaw, 'Server id');
324
+ if (id === null)
325
+ return;
326
+ if (!opts.yes) {
327
+ const answer = await prompt(`Drain server #${id} and take it out of the swarm? Its Swarm tasks move to other nodes. Type "yes" to confirm`);
328
+ if (answer.trim().toLowerCase() !== 'yes')
329
+ return info('Cancelled');
330
+ }
331
+ try {
332
+ const res = await spinner(`Draining server #${id} and leaving the swarm`, () => client.servers.swarmLeave(id));
333
+ success(`Server #${res.serverId} left the swarm.`);
334
+ if (!res.drained)
335
+ info('Its tasks had not moved within 5 minutes; Swarm reschedules them on the remaining nodes.');
336
+ warn(res.warnings);
337
+ }
338
+ catch (err) {
339
+ error(message(err));
340
+ }
341
+ }
342
+ // ── volumes on a node ─────────────────────────────────────────────────────
343
+ /** The `--server <id>` of the volume commands; undefined = the panel host, null = invalid (error printed). */
344
+ export function serverOption(raw) {
345
+ return raw === undefined ? undefined : positiveInt(raw, '--server');
346
+ }
347
+ /** `ninedeploy volumes create <name> [--server <id>]` */
348
+ export async function volumesCreate(client, name, opts = {}) {
349
+ if (!name)
350
+ return error('Usage: ninedeploy volumes create <nd-svc-…|nd-db-…> [--server <id>]');
351
+ const serverId = serverOption(opts.server);
352
+ if (serverId === null)
353
+ return;
354
+ try {
355
+ const res = await spinner('Creating the volume', () => client.volumes.create({ name, ...(serverId !== undefined ? { serverId } : {}) }));
356
+ success(`Volume ${c.cyan(plain(res.name))} created on ${res.serverId === null ? 'the panel host' : `server #${res.serverId}`}.`);
357
+ }
358
+ catch (err) {
359
+ error(message(err));
360
+ }
361
+ }
362
+ // ── sources on nodes ─────────────────────────────────────────────────────
363
+ /** `ninedeploy sources allow-on-nodes <id> on|off`: turning it on asks for the password (step-up). */
364
+ export async function sourcesAllowOnNodes(client, idRaw, value) {
365
+ const id = positiveInt(idRaw, 'Source id');
366
+ if (id === null)
367
+ return;
368
+ const allow = onOff(value, 'The setting');
369
+ if (allow === null)
370
+ return;
371
+ if (allow)
372
+ info('The PAT or deploy key will be sent (sealed) to a node for each clone there. A node refuses it with NINEDEPLOY_AGENT_STATIC_CREDENTIALS=off.');
373
+ const password = allow ? await stepUpPassword() : undefined;
374
+ try {
375
+ const src = await spinner('Saving', () => client.sources.update(id, { allowOnNodes: allow, ...(password ? { password } : {}) }));
376
+ success(`${plain(src.name)}: ${allow ? 'allowed on nodes' : 'panel host only'}`);
377
+ }
378
+ catch (err) {
379
+ error(message(err));
380
+ }
381
+ }
382
+ // ── source host key pinning (0.15.8) ─────────────────────────────────────
383
+ /** `ninedeploy sources pin-host-keys <id> on|off`: off asks for the password (step-up); on only tightens. */
384
+ export async function sourcesPinHostKeys(client, idRaw, value) {
385
+ const id = positiveInt(idRaw, 'Source id');
386
+ if (id === null)
387
+ return;
388
+ const pin = onOff(value, 'The setting');
389
+ if (pin === null)
390
+ return;
391
+ if (pin)
392
+ info('The first clone after this learns the git host keys; every later clone refuses a host whose key changed. Applies to clones the panel makes with the SSH deploy key; a node keeps its per-job policy.');
393
+ const password = pin ? undefined : await stepUpPassword();
394
+ try {
395
+ const src = await spinner('Saving', () => client.sources.update(id, { pinHostKeys: pin, ...(password ? { password } : {}) }));
396
+ success(`${plain(src.name)}: host key pinning ${pin ? 'on' : 'off'}`);
397
+ }
398
+ catch (err) {
399
+ error(message(err));
400
+ }
401
+ }
402
+ /** `ninedeploy sources reset-host-keys <id>`: forget the pinned keys so the next clone learns them again (step-up). */
403
+ export async function sourcesResetHostKeys(client, idRaw) {
404
+ const id = positiveInt(idRaw, 'Source id');
405
+ if (id === null)
406
+ return;
407
+ const password = await stepUpPassword();
408
+ try {
409
+ const src = await spinner('Resetting', () => client.sources.update(id, { resetHostKeys: true, ...(password ? { password } : {}) }));
410
+ success(`${plain(src.name)}: pinned host keys forgotten; the next clone learns them again`);
411
+ }
412
+ catch (err) {
413
+ error(message(err));
414
+ }
415
+ }
416
+ /** `ninedeploy sources host-keys <id>`: the fingerprints a source has pinned. */
417
+ export async function sourcesHostKeys(client, idRaw) {
418
+ const id = positiveInt(idRaw, 'Source id');
419
+ if (id === null)
420
+ return;
421
+ try {
422
+ const all = await spinner('Loading sources', () => client.sources.list());
423
+ const src = all.find((s) => s.id === id);
424
+ if (!src)
425
+ return error(`No source #${id}`);
426
+ header(`${plain(src.name)}: host keys`);
427
+ if (!src.pinHostKeys)
428
+ return info('This source is not pinning host keys (sources pin-host-keys <id> on).');
429
+ const keys = src.pinnedHostKeys ?? [];
430
+ if (keys.length === 0)
431
+ return info('Pinning is on; the first clone will learn the host keys.');
432
+ table(keys.map((k) => ({ host: plain(k.host), type: plain(k.type), fingerprint: plain(k.fingerprint ?? '(unreadable)') })), ['host', 'type', 'fingerprint']);
433
+ }
434
+ catch (err) {
435
+ error(message(err));
436
+ }
437
+ }
438
+ //# sourceMappingURL=multiNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiNode.js","sourceRoot":"","sources":["../../src/commands/multiNode.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * `ninedeploy notifications {list,create-webhook,test,rm}` — operator
3
3
  * UI for the notification channel registry. PR #49 (G-06) adds
4
4
  * the HMAC + body-template fields for the `webhook` channel type;
5
- * the other types (slack, discord, telegram, ntfy, email) keep
5
+ * the other types (slack, discord, telegram, teams, ntfy, email, resend) keep
6
6
  * their existing surface and accept an opaque `configJson` blob.
7
7
  */
8
8
  import type { NineDeployClient } from '../client.js';
@@ -0,0 +1,89 @@
1
+ import type { CreateTerminalSessionInput, TerminalSocketFactory } from '@ninedeploy/sdk';
2
+ import type { NineDeployClient } from '../client.js';
3
+ export interface TerminalsListOptions {
4
+ status?: string;
5
+ target?: string;
6
+ limit?: string;
7
+ before?: string;
8
+ }
9
+ /** `ninedeploy terminals list [--status] [--target] [--limit] [--before]` */
10
+ export declare function terminalsList(client: NineDeployClient, opts?: TerminalsListOptions): Promise<void>;
11
+ /** `ninedeploy terminals show <id>` */
12
+ export declare function terminalsShow(client: NineDeployClient, idRaw: string): Promise<void>;
13
+ /** `ninedeploy terminals kill <id> [--yes]` */
14
+ export declare function terminalsKill(client: NineDeployClient, idRaw: string, opts?: {
15
+ yes?: boolean;
16
+ }): Promise<void>;
17
+ /** The process streams the interactive terminal drives (injectable for tests). */
18
+ export interface TerminalIo {
19
+ stdin: NodeJS.ReadStream;
20
+ stdout: NodeJS.WriteStream;
21
+ stderr: NodeJS.WriteStream;
22
+ /** Builds the attach socket; defaults to the `ws` package (sends no Origin). */
23
+ socketFactory?: TerminalSocketFactory;
24
+ }
25
+ export interface TerminalOpenOptions {
26
+ replica?: string;
27
+ node?: string;
28
+ client?: boolean;
29
+ }
30
+ /** Build the session target from `terminal <kind> <ref>`; prints the usage error and returns null when invalid. */
31
+ export declare function terminalTarget(kind: string, ref: string | undefined, opts?: TerminalOpenOptions): CreateTerminalSessionInput['target'] | null;
32
+ /**
33
+ * `ninedeploy terminal <kind> <ref>`: an interactive shell over protocol v1.
34
+ * The local terminal is put in raw mode, window resizes are forwarded, and
35
+ * the shell's exit code becomes the CLI's.
36
+ */
37
+ export declare function terminalOpen(client: NineDeployClient, kind: string, ref: string | undefined, opts?: TerminalOpenOptions, io?: TerminalIo): Promise<void>;
38
+ /** `ninedeploy traffic settings [--enable|--disable] [--retention <days>] [--yes]` */
39
+ export declare function trafficSettings(client: NineDeployClient, opts?: {
40
+ enable?: boolean;
41
+ disable?: boolean;
42
+ retention?: string;
43
+ yes?: boolean;
44
+ }): Promise<void>;
45
+ /** `ninedeploy traffic summary [--range] [--top]` */
46
+ export declare function trafficSummary(client: NineDeployClient, opts?: {
47
+ range?: string;
48
+ top?: string;
49
+ }): Promise<void>;
50
+ /** `ninedeploy traffic service <id> [--range]` */
51
+ export declare function trafficService(client: NineDeployClient, idRaw: string, opts?: {
52
+ range?: string;
53
+ }): Promise<void>;
54
+ /** `ninedeploy access grants list --workspace <id> [--user <id>] [--project <id>]` */
55
+ export declare function accessGrantsList(client: NineDeployClient, opts?: {
56
+ workspace?: string;
57
+ user?: string;
58
+ project?: string;
59
+ environment?: string;
60
+ }): Promise<void>;
61
+ /** `ninedeploy access grants add --workspace <id> (--email|--user) (--project|--environment) --role <role>` */
62
+ export declare function accessGrantsAdd(client: NineDeployClient, opts?: {
63
+ workspace?: string;
64
+ email?: string;
65
+ user?: string;
66
+ project?: string;
67
+ environment?: string;
68
+ role?: string;
69
+ }): Promise<void>;
70
+ /**
71
+ * `ninedeploy access grants update <grantId> --workspace <id> [--role <role>] [--suspend | --reinstate]`
72
+ *
73
+ * A suspended grant stays listed but gives no access; `--reinstate` makes it
74
+ * count again (refused while the user's identity provider has them suspended).
75
+ */
76
+ export declare function accessGrantsUpdate(client: NineDeployClient, grantRaw: string, opts?: {
77
+ workspace?: string;
78
+ role?: string;
79
+ suspend?: boolean;
80
+ reinstate?: boolean;
81
+ }): Promise<void>;
82
+ /** `ninedeploy access grants remove <grantId> --workspace <id> [--yes]` */
83
+ export declare function accessGrantsRemove(client: NineDeployClient, grantRaw: string, opts?: {
84
+ workspace?: string;
85
+ yes?: boolean;
86
+ }): Promise<void>;
87
+ /** `ninedeploy access me` */
88
+ export declare function accessMe(client: NineDeployClient): Promise<void>;
89
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/commands/operations.ts"],"names":[],"mappings":"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"}