@zincapp/znvault-cli 2.26.4 → 2.29.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 (62) hide show
  1. package/dist/commands/group.d.ts +3 -0
  2. package/dist/commands/group.d.ts.map +1 -0
  3. package/dist/commands/group.js +319 -0
  4. package/dist/commands/group.js.map +1 -0
  5. package/dist/commands/host/bootstrap-token.d.ts.map +1 -1
  6. package/dist/commands/host/bootstrap-token.js +28 -10
  7. package/dist/commands/host/bootstrap-token.js.map +1 -1
  8. package/dist/commands/host/index.d.ts.map +1 -1
  9. package/dist/commands/host/index.js +4 -0
  10. package/dist/commands/host/index.js.map +1 -1
  11. package/dist/commands/host/link-agent.d.ts +26 -0
  12. package/dist/commands/host/link-agent.d.ts.map +1 -0
  13. package/dist/commands/host/link-agent.js +110 -0
  14. package/dist/commands/host/link-agent.js.map +1 -0
  15. package/dist/commands/host/types.d.ts +5 -0
  16. package/dist/commands/host/types.d.ts.map +1 -1
  17. package/dist/commands/ssh-ca/ca.d.ts +14 -0
  18. package/dist/commands/ssh-ca/ca.d.ts.map +1 -0
  19. package/dist/commands/ssh-ca/ca.js +169 -0
  20. package/dist/commands/ssh-ca/ca.js.map +1 -0
  21. package/dist/commands/ssh-ca/certificates.d.ts +7 -0
  22. package/dist/commands/ssh-ca/certificates.d.ts.map +1 -0
  23. package/dist/commands/ssh-ca/certificates.js +131 -0
  24. package/dist/commands/ssh-ca/certificates.js.map +1 -0
  25. package/dist/commands/ssh-ca/helpers.d.ts +37 -0
  26. package/dist/commands/ssh-ca/helpers.d.ts.map +1 -0
  27. package/dist/commands/ssh-ca/helpers.js +104 -0
  28. package/dist/commands/ssh-ca/helpers.js.map +1 -0
  29. package/dist/commands/ssh-ca/index.d.ts +7 -0
  30. package/dist/commands/ssh-ca/index.d.ts.map +1 -0
  31. package/dist/commands/ssh-ca/index.js +180 -0
  32. package/dist/commands/ssh-ca/index.js.map +1 -0
  33. package/dist/commands/ssh-ca/mappings.d.ts +11 -0
  34. package/dist/commands/ssh-ca/mappings.d.ts.map +1 -0
  35. package/dist/commands/ssh-ca/mappings.js +178 -0
  36. package/dist/commands/ssh-ca/mappings.js.map +1 -0
  37. package/dist/commands/ssh-ca/server-groups.d.ts +21 -0
  38. package/dist/commands/ssh-ca/server-groups.d.ts.map +1 -0
  39. package/dist/commands/ssh-ca/server-groups.js +252 -0
  40. package/dist/commands/ssh-ca/server-groups.js.map +1 -0
  41. package/dist/commands/ssh-ca/sign.d.ts +3 -0
  42. package/dist/commands/ssh-ca/sign.d.ts.map +1 -0
  43. package/dist/commands/ssh-ca/sign.js +79 -0
  44. package/dist/commands/ssh-ca/sign.js.map +1 -0
  45. package/dist/commands/ssh-ca/types.d.ts +135 -0
  46. package/dist/commands/ssh-ca/types.d.ts.map +1 -0
  47. package/dist/commands/ssh-ca/types.js +3 -0
  48. package/dist/commands/ssh-ca/types.js.map +1 -0
  49. package/dist/commands/ssh-ca.d.ts +7 -0
  50. package/dist/commands/ssh-ca.d.ts.map +1 -0
  51. package/dist/commands/ssh-ca.js +7 -0
  52. package/dist/commands/ssh-ca.js.map +1 -0
  53. package/dist/commands/ssh.d.ts +3 -0
  54. package/dist/commands/ssh.d.ts.map +1 -0
  55. package/dist/commands/ssh.js +814 -0
  56. package/dist/commands/ssh.js.map +1 -0
  57. package/dist/index.js +6 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/client/tenants.d.ts.map +1 -1
  60. package/dist/lib/client/tenants.js +3 -6
  61. package/dist/lib/client/tenants.js.map +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import { type Command } from 'commander';
2
+ export declare function registerGroupCommands(program: Command): void;
3
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/commands/group.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAyEzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8W5D"}
@@ -0,0 +1,319 @@
1
+ // Path: znvault-cli/src/commands/group.ts
2
+ import ora from 'ora';
3
+ import { client } from '../lib/client.js';
4
+ import { promptConfirm } from '../lib/prompts.js';
5
+ import * as output from '../lib/output.js';
6
+ // ============================================================================
7
+ // Commands
8
+ // ============================================================================
9
+ export function registerGroupCommands(program) {
10
+ const group = program
11
+ .command('group')
12
+ .description('SSO group management');
13
+ // ---------------------------------------------------------------------------
14
+ // List Groups
15
+ // ---------------------------------------------------------------------------
16
+ group
17
+ .command('list')
18
+ .description('List SSO groups')
19
+ .option('--tenant <id>', 'Filter by tenant (superadmin only)')
20
+ .option('--json', 'Output as JSON')
21
+ .action(async (options) => {
22
+ const spinner = ora('Fetching groups...').start();
23
+ try {
24
+ const params = new URLSearchParams();
25
+ if (options.tenant) {
26
+ params.set('tenantId', options.tenant);
27
+ }
28
+ const queryString = params.toString() ? `?${params.toString()}` : '';
29
+ const data = await client.get(`/v1/sso/groups${queryString}`);
30
+ spinner.stop();
31
+ if (options.json) {
32
+ output.json(data);
33
+ return;
34
+ }
35
+ if (data.items.length === 0) {
36
+ output.info('No groups found');
37
+ return;
38
+ }
39
+ output.table(['Name', 'Display Name', 'Members', 'Created'], data.items.map((g) => [
40
+ g.name,
41
+ g.displayName ?? '-',
42
+ g.memberCount ?? 0,
43
+ new Date(g.createdAt).toLocaleDateString(),
44
+ ]));
45
+ output.info(`Total: ${data.pagination.total} group(s)`);
46
+ }
47
+ catch (err) {
48
+ spinner.fail('Error fetching groups');
49
+ output.error(err instanceof Error ? err.message : 'Unknown error');
50
+ process.exit(1);
51
+ }
52
+ });
53
+ // ---------------------------------------------------------------------------
54
+ // Create Group
55
+ // ---------------------------------------------------------------------------
56
+ group
57
+ .command('create <name>')
58
+ .description('Create a new SSO group')
59
+ .option('--display-name <name>', 'Human-readable display name')
60
+ .option('--description <text>', 'Group description')
61
+ .option('--json', 'Output as JSON')
62
+ .action(async (name, options) => {
63
+ const spinner = ora('Creating group...').start();
64
+ try {
65
+ const body = {
66
+ name,
67
+ };
68
+ if (options.displayName) {
69
+ body.display_name = options.displayName;
70
+ }
71
+ if (options.description) {
72
+ body.description = options.description;
73
+ }
74
+ const data = await client.post('/v1/sso/groups', body);
75
+ spinner.succeed('Group created successfully');
76
+ if (options.json) {
77
+ output.json(data);
78
+ return;
79
+ }
80
+ output.keyValue({
81
+ 'ID': data.id,
82
+ 'Name': data.name,
83
+ 'Display Name': data.displayName ?? '-',
84
+ 'Description': data.description ?? '-',
85
+ });
86
+ }
87
+ catch (err) {
88
+ spinner.fail('Error creating group');
89
+ output.error(err instanceof Error ? err.message : 'Unknown error');
90
+ process.exit(1);
91
+ }
92
+ });
93
+ // ---------------------------------------------------------------------------
94
+ // Get Group
95
+ // ---------------------------------------------------------------------------
96
+ group
97
+ .command('get <id>')
98
+ .description('Get group details')
99
+ .option('--json', 'Output as JSON')
100
+ .action(async (id, options) => {
101
+ const spinner = ora('Fetching group...').start();
102
+ try {
103
+ const data = await client.get(`/v1/sso/groups/${id}`);
104
+ spinner.stop();
105
+ if (options.json) {
106
+ output.json(data);
107
+ return;
108
+ }
109
+ output.keyValue({
110
+ 'ID': data.id,
111
+ 'Tenant': data.tenantId,
112
+ 'Name': data.name,
113
+ 'Display Name': data.displayName ?? '-',
114
+ 'Description': data.description ?? '-',
115
+ 'Members': data.memberCount ?? 'N/A',
116
+ 'Created By': data.createdByUsername ?? data.createdBy ?? '-',
117
+ 'Created At': new Date(data.createdAt).toLocaleString(),
118
+ 'Updated At': new Date(data.updatedAt).toLocaleString(),
119
+ });
120
+ }
121
+ catch (err) {
122
+ spinner.fail('Error fetching group');
123
+ output.error(err instanceof Error ? err.message : 'Unknown error');
124
+ process.exit(1);
125
+ }
126
+ });
127
+ // ---------------------------------------------------------------------------
128
+ // Update Group
129
+ // ---------------------------------------------------------------------------
130
+ group
131
+ .command('update <id>')
132
+ .description('Update group')
133
+ .option('--name <name>', 'New group name')
134
+ .option('--display-name <name>', 'New display name')
135
+ .option('--description <text>', 'New description')
136
+ .option('--json', 'Output as JSON')
137
+ .action(async (id, options) => {
138
+ const spinner = ora('Updating group...').start();
139
+ try {
140
+ const body = {};
141
+ if (options.name) {
142
+ body.name = options.name;
143
+ }
144
+ if (options.displayName !== undefined) {
145
+ body.display_name = options.displayName || null;
146
+ }
147
+ if (options.description !== undefined) {
148
+ body.description = options.description || null;
149
+ }
150
+ if (Object.keys(body).length === 0) {
151
+ spinner.fail('No updates specified');
152
+ output.error('Use --name, --display-name, or --description to specify updates');
153
+ process.exit(1);
154
+ }
155
+ const data = await client.patch(`/v1/sso/groups/${id}`, body);
156
+ spinner.succeed('Group updated successfully');
157
+ if (options.json) {
158
+ output.json(data);
159
+ return;
160
+ }
161
+ output.keyValue({
162
+ 'ID': data.id,
163
+ 'Name': data.name,
164
+ 'Display Name': data.displayName ?? '-',
165
+ 'Description': data.description ?? '-',
166
+ });
167
+ }
168
+ catch (err) {
169
+ spinner.fail('Error updating group');
170
+ output.error(err instanceof Error ? err.message : 'Unknown error');
171
+ process.exit(1);
172
+ }
173
+ });
174
+ // ---------------------------------------------------------------------------
175
+ // Delete Group
176
+ // ---------------------------------------------------------------------------
177
+ group
178
+ .command('delete <id>')
179
+ .description('Delete group')
180
+ .option('-y, --yes', 'Skip confirmation')
181
+ .action(async (id, options) => {
182
+ try {
183
+ // Get group info for confirmation
184
+ const groupData = await client.get(`/v1/sso/groups/${id}`);
185
+ if (!options.yes) {
186
+ const confirmed = await promptConfirm(`Delete group "${groupData.name}"? This will remove all members.`);
187
+ if (!confirmed) {
188
+ output.info('Cancelled');
189
+ return;
190
+ }
191
+ }
192
+ const spinner = ora('Deleting group...').start();
193
+ await client.delete(`/v1/sso/groups/${id}`);
194
+ spinner.succeed(`Group "${groupData.name}" deleted`);
195
+ }
196
+ catch (err) {
197
+ output.error(err instanceof Error ? err.message : 'Unknown error');
198
+ process.exit(1);
199
+ }
200
+ });
201
+ // ---------------------------------------------------------------------------
202
+ // Members Subcommand
203
+ // ---------------------------------------------------------------------------
204
+ const members = group
205
+ .command('members')
206
+ .description('Manage group members');
207
+ // List members
208
+ members
209
+ .command('list <groupId>')
210
+ .description('List group members')
211
+ .option('--json', 'Output as JSON')
212
+ .action(async (groupId, options) => {
213
+ const spinner = ora('Fetching members...').start();
214
+ try {
215
+ const data = await client.get(`/v1/sso/groups/${groupId}/members`);
216
+ spinner.stop();
217
+ if (options.json) {
218
+ output.json(data);
219
+ return;
220
+ }
221
+ if (data.items.length === 0) {
222
+ output.info('No members found');
223
+ return;
224
+ }
225
+ output.table(['User ID', 'Username', 'Email', 'Added At'], data.items.map((m) => [
226
+ m.userId,
227
+ m.username,
228
+ m.email ?? '-',
229
+ new Date(m.addedAt).toLocaleDateString(),
230
+ ]));
231
+ output.info(`Total: ${data.pagination.total} member(s)`);
232
+ }
233
+ catch (err) {
234
+ spinner.fail('Error fetching members');
235
+ output.error(err instanceof Error ? err.message : 'Unknown error');
236
+ process.exit(1);
237
+ }
238
+ });
239
+ // Add member
240
+ members
241
+ .command('add <groupId> <userId>')
242
+ .description('Add user to group')
243
+ .action(async (groupId, userId) => {
244
+ const spinner = ora('Adding member...').start();
245
+ try {
246
+ const data = await client.post(`/v1/sso/groups/${groupId}/members`, {
247
+ user_id: userId,
248
+ });
249
+ spinner.succeed('Member added successfully');
250
+ output.keyValue({
251
+ 'User ID': data.userId,
252
+ 'Username': data.username,
253
+ 'Added At': new Date(data.addedAt).toLocaleString(),
254
+ });
255
+ }
256
+ catch (err) {
257
+ spinner.fail('Error adding member');
258
+ output.error(err instanceof Error ? err.message : 'Unknown error');
259
+ process.exit(1);
260
+ }
261
+ });
262
+ // Remove member
263
+ members
264
+ .command('remove <groupId> <userId>')
265
+ .description('Remove user from group')
266
+ .option('-y, --yes', 'Skip confirmation')
267
+ .action(async (groupId, userId, options) => {
268
+ try {
269
+ if (!options.yes) {
270
+ const confirmed = await promptConfirm(`Remove user ${userId} from group?`);
271
+ if (!confirmed) {
272
+ output.info('Cancelled');
273
+ return;
274
+ }
275
+ }
276
+ const spinner = ora('Removing member...').start();
277
+ await client.delete(`/v1/sso/groups/${groupId}/members/${userId}`);
278
+ spinner.succeed('Member removed successfully');
279
+ }
280
+ catch (err) {
281
+ output.error(err instanceof Error ? err.message : 'Unknown error');
282
+ process.exit(1);
283
+ }
284
+ });
285
+ // ---------------------------------------------------------------------------
286
+ // My Groups
287
+ // ---------------------------------------------------------------------------
288
+ group
289
+ .command('my-groups')
290
+ .description('List groups you belong to')
291
+ .option('--json', 'Output as JSON')
292
+ .action(async (options) => {
293
+ const spinner = ora('Fetching your groups...').start();
294
+ try {
295
+ const data = await client.get('/v1/sso/my-groups');
296
+ spinner.stop();
297
+ if (options.json) {
298
+ output.json(data);
299
+ return;
300
+ }
301
+ if (data.groups.length === 0) {
302
+ output.info('You are not a member of any groups');
303
+ return;
304
+ }
305
+ output.table(['ID', 'Name', 'Display Name'], data.groups.map((g) => [
306
+ g.id,
307
+ g.name,
308
+ g.displayName ?? '-',
309
+ ]));
310
+ output.info(`Total: ${data.groups.length} group(s)`);
311
+ }
312
+ catch (err) {
313
+ spinner.fail('Error fetching groups');
314
+ output.error(err instanceof Error ? err.message : 'Unknown error');
315
+ process.exit(1);
316
+ }
317
+ });
318
+ }
319
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/commands/group.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-token.d.ts","sourceRoot":"","sources":["../../../src/commands/host/bootstrap-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA8EtE"}
1
+ {"version":3,"file":"bootstrap-token.d.ts","sourceRoot":"","sources":["../../../src/commands/host/bootstrap-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAiGtE"}
@@ -13,6 +13,7 @@ export function registerBootstrapTokenCommand(parentCmd) {
13
13
  .alias('token')
14
14
  .description('Generate a bootstrap token for a host')
15
15
  .option('-e, --expires <duration>', 'Token expiration (e.g., 1h, 24h, 7d)', '24h')
16
+ .option('-a, --agent-hostname <hostname>', 'Agent hostname (for multi-host templates, defaults to host config name)')
16
17
  .option('--json', 'Output as JSON')
17
18
  .action(async (hostname, options) => {
18
19
  // Parse expiration
@@ -27,35 +28,52 @@ export function registerBootstrapTokenCommand(parentCmd) {
27
28
  }
28
29
  const spinner = ora('Generating bootstrap token...').start();
29
30
  try {
30
- const response = await mode.apiPost(`/v1/hosts/${encodeURIComponent(hostname)}/bootstrap-token`, { expiresAt });
31
+ // Build request body
32
+ const body = { expiresAt };
33
+ if (options.agentHostname) {
34
+ body.agentHostname = options.agentHostname;
35
+ }
36
+ const response = await mode.apiPost(`/v1/hosts/${encodeURIComponent(hostname)}/bootstrap-token`, body);
31
37
  spinner.succeed('Bootstrap token generated');
32
38
  if (options.json) {
33
39
  output.json(response);
34
40
  return;
35
41
  }
36
- // Build the one-command URL
37
- const oneCommandUrl = `${response.bootstrapUrl}?token=${response.token}`;
42
+ // Use bootstrapUrl directly (now includes token and hostname)
43
+ const bootstrapUrl = response.bootstrapUrl;
44
+ const agentHostname = response.agentHostname;
45
+ const isMultiHost = agentHostname !== hostname;
38
46
  console.log();
39
- output.section('Bootstrap Token for ' + hostname);
47
+ if (isMultiHost) {
48
+ output.section(`Bootstrap Token for ${agentHostname} (template: ${hostname})`);
49
+ }
50
+ else {
51
+ output.section('Bootstrap Token for ' + hostname);
52
+ }
40
53
  console.log();
41
- output.keyValue({
54
+ const tokenInfo = {
42
55
  'Token': response.token,
43
56
  'Expires': new Date(response.expiresAt).toLocaleString(),
44
- });
57
+ };
58
+ if (isMultiHost) {
59
+ tokenInfo['Host Config'] = hostname;
60
+ tokenInfo['Agent Hostname'] = agentHostname;
61
+ }
62
+ output.keyValue(tokenInfo);
45
63
  console.log();
46
64
  output.section('Quick Start (One Command)');
47
65
  console.log();
48
66
  console.log(' Run this on the target server to install and configure the agent:');
49
67
  console.log();
50
- console.log(` curl -sL "${oneCommandUrl}" | sudo bash`);
68
+ console.log(` curl -sL "${bootstrapUrl}" | sudo bash`);
51
69
  console.log();
52
70
  output.section('Review First (Recommended)');
53
71
  console.log();
54
72
  console.log(' Download the script, review it, then run:');
55
73
  console.log();
56
- console.log(` curl -sL "${oneCommandUrl}" -o bootstrap-${hostname}.sh`);
57
- console.log(` less bootstrap-${hostname}.sh`);
58
- console.log(` sudo bash bootstrap-${hostname}.sh`);
74
+ console.log(` curl -sL "${bootstrapUrl}" -o bootstrap-${agentHostname}.sh`);
75
+ console.log(` less bootstrap-${agentHostname}.sh`);
76
+ console.log(` sudo bash bootstrap-${agentHostname}.sh`);
59
77
  console.log();
60
78
  output.section('Alternative: Manual Installation');
61
79
  console.log();
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-token.js","sourceRoot":"","sources":["../../../src/commands/host/bootstrap-token.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap-token.js","sourceRoot":"","sources":["../../../src/commands/host/bootstrap-token.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/host/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB3D;AAGD,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/host/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B3D;AAGD,cAAc,YAAY,CAAC"}
@@ -7,6 +7,7 @@ import { registerConfigCommand } from './config.js';
7
7
  import { registerDeleteCommand } from './delete.js';
8
8
  import { registerBootstrapTokenCommand } from './bootstrap-token.js';
9
9
  import { registerSyncCommand } from './sync.js';
10
+ import { registerLinkAgentCommand, registerUnlinkAgentCommand } from './link-agent.js';
10
11
  /**
11
12
  * Register all host management commands
12
13
  */
@@ -26,6 +27,9 @@ export function registerHostCommands(program) {
26
27
  // Bootstrap and sync
27
28
  registerBootstrapTokenCommand(hostCmd);
28
29
  registerSyncCommand(hostCmd);
30
+ // Agent linking
31
+ registerLinkAgentCommand(hostCmd);
32
+ registerUnlinkAgentCommand(hostCmd);
29
33
  // Utility commands
30
34
  registerOutdatedAgentsCommand(hostCmd);
31
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/host/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,wDAAwD;AAGxD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,OAAO,CAAC;SACd,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,iBAAiB;IACjB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,kBAAkB;IAClB,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,qBAAqB;IACrB,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE7B,mBAAmB;IACnB,6BAA6B,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,kBAAkB;AAClB,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/host/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,wDAAwD;AAGxD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEvF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,OAAO,CAAC;SACd,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,iBAAiB;IACjB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,kBAAkB;IAClB,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,qBAAqB;IACrB,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE7B,gBAAgB;IAChB,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAEpC,mBAAmB;IACnB,6BAA6B,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,kBAAkB;AAClB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Command } from 'commander';
2
+ /**
3
+ * Command options for link-agent
4
+ */
5
+ export interface LinkAgentOptions {
6
+ agent?: string;
7
+ agentId?: string;
8
+ json?: boolean;
9
+ }
10
+ /**
11
+ * Command options for unlink-agent
12
+ */
13
+ export interface UnlinkAgentOptions {
14
+ agent?: string;
15
+ agentId?: string;
16
+ json?: boolean;
17
+ }
18
+ /**
19
+ * Register the link-agent command
20
+ */
21
+ export declare function registerLinkAgentCommand(parentCmd: Command): void;
22
+ /**
23
+ * Register the unlink-agent command
24
+ */
25
+ export declare function registerUnlinkAgentCommand(parentCmd: Command): void;
26
+ //# sourceMappingURL=link-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-agent.d.ts","sourceRoot":"","sources":["../../../src/commands/host/link-agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAsBD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAwDjE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAmDnE"}
@@ -0,0 +1,110 @@
1
+ // Path: src/commands/host/link-agent.ts
2
+ // Link/unlink agents to host configurations
3
+ import ora from 'ora';
4
+ import * as mode from '../../lib/mode.js';
5
+ import * as output from '../../lib/output.js';
6
+ /**
7
+ * Register the link-agent command
8
+ */
9
+ export function registerLinkAgentCommand(parentCmd) {
10
+ parentCmd
11
+ .command('link-agent <hostname>')
12
+ .description('Link an agent to a host configuration')
13
+ .option('-a, --agent <hostname>', 'Agent hostname to link')
14
+ .option('-i, --agent-id <id>', 'Agent ID to link (e.g., agent_abc123)')
15
+ .option('--json', 'Output as JSON')
16
+ .action(async (hostname, options) => {
17
+ // Validate options
18
+ if (!options.agent && !options.agentId) {
19
+ output.error('Either --agent <hostname> or --agent-id <id> is required');
20
+ console.log('\nExamples:');
21
+ console.log(' znvault host link-agent payara-staging --agent payara-staging-1');
22
+ console.log(' znvault host link-agent payara-staging --agent-id agent_e8ca2d55b0cf');
23
+ process.exit(1);
24
+ }
25
+ const spinner = ora('Linking agent to host config...').start();
26
+ try {
27
+ const body = {};
28
+ if (options.agentId) {
29
+ body.agentId = options.agentId;
30
+ }
31
+ else if (options.agent) {
32
+ body.agentHostname = options.agent;
33
+ }
34
+ const response = await mode.apiPost(`/v1/hosts/${encodeURIComponent(hostname)}/link-agent`, body);
35
+ spinner.succeed('Agent linked successfully');
36
+ if (options.json) {
37
+ output.json(response);
38
+ return;
39
+ }
40
+ console.log();
41
+ output.keyValue({
42
+ 'Agent ID': response.agentId,
43
+ 'Agent Hostname': response.agentHostname,
44
+ 'Host Config': response.hostConfigName,
45
+ 'Host Config ID': response.hostConfigId,
46
+ });
47
+ console.log();
48
+ output.success(`Agent "${response.agentHostname}" is now linked to host config "${hostname}"`);
49
+ }
50
+ catch (err) {
51
+ spinner.fail('Failed to link agent');
52
+ output.error(err instanceof Error ? err.message : String(err));
53
+ process.exit(1);
54
+ }
55
+ finally {
56
+ await mode.closeLocalClient();
57
+ }
58
+ });
59
+ }
60
+ /**
61
+ * Register the unlink-agent command
62
+ */
63
+ export function registerUnlinkAgentCommand(parentCmd) {
64
+ parentCmd
65
+ .command('unlink-agent <hostname>')
66
+ .description('Unlink an agent from a host configuration')
67
+ .option('-a, --agent <hostname>', 'Agent hostname to unlink')
68
+ .option('-i, --agent-id <id>', 'Agent ID to unlink (e.g., agent_abc123)')
69
+ .option('--json', 'Output as JSON')
70
+ .action(async (hostname, options) => {
71
+ // Validate options
72
+ if (!options.agent && !options.agentId) {
73
+ output.error('Either --agent <hostname> or --agent-id <id> is required');
74
+ process.exit(1);
75
+ }
76
+ const spinner = ora('Unlinking agent from host config...').start();
77
+ try {
78
+ // Build query params
79
+ const params = new URLSearchParams();
80
+ if (options.agentId) {
81
+ params.set('agentId', options.agentId);
82
+ }
83
+ else if (options.agent) {
84
+ params.set('agentHostname', options.agent);
85
+ }
86
+ const response = await mode.apiDelete(`/v1/hosts/${encodeURIComponent(hostname)}/link-agent?${params.toString()}`);
87
+ spinner.succeed('Agent unlinked successfully');
88
+ if (options.json) {
89
+ output.json(response);
90
+ return;
91
+ }
92
+ console.log();
93
+ output.keyValue({
94
+ 'Agent ID': response.agentId,
95
+ 'Agent Hostname': response.agentHostname,
96
+ });
97
+ console.log();
98
+ output.success(`Agent "${response.agentHostname}" has been unlinked from host config "${hostname}"`);
99
+ }
100
+ catch (err) {
101
+ spinner.fail('Failed to unlink agent');
102
+ output.error(err instanceof Error ? err.message : String(err));
103
+ process.exit(1);
104
+ }
105
+ finally {
106
+ await mode.closeLocalClient();
107
+ }
108
+ });
109
+ }
110
+ //# sourceMappingURL=link-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-agent.js","sourceRoot":"","sources":["../../../src/commands/host/link-agent.ts"],"names":[],"mappings":"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"}
@@ -156,7 +156,10 @@ export interface BootstrapTokenResponse {
156
156
  expiresAt: string;
157
157
  bootstrapUrl: string;
158
158
  hostConfigId: string;
159
+ /** Host config name (template) */
159
160
  hostname: string;
161
+ /** Agent hostname (may differ from config name for multi-host templates) */
162
+ agentHostname: string;
160
163
  }
161
164
  /**
162
165
  * Sync response
@@ -206,6 +209,8 @@ export interface DeleteOptions {
206
209
  }
207
210
  export interface BootstrapTokenOptions {
208
211
  expires?: string;
212
+ /** Agent hostname (for multi-host templates, defaults to host config name) */
213
+ agentHostname?: string;
209
214
  json?: boolean;
210
215
  }
211
216
  export interface SyncOptions {