@zincapp/znvault-cli 2.29.1 → 2.29.3

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 (271) hide show
  1. package/dist/commands/agent/direct/update-all.d.ts.map +1 -1
  2. package/dist/commands/agent/direct/update-all.js +13 -8
  3. package/dist/commands/agent/direct/update-all.js.map +1 -1
  4. package/dist/commands/agent/helpers.d.ts +3 -6
  5. package/dist/commands/agent/helpers.d.ts.map +1 -1
  6. package/dist/commands/agent/helpers.js +13 -21
  7. package/dist/commands/agent/helpers.js.map +1 -1
  8. package/dist/commands/apikey/helpers.d.ts +1 -2
  9. package/dist/commands/apikey/helpers.d.ts.map +1 -1
  10. package/dist/commands/apikey/helpers.js +2 -12
  11. package/dist/commands/apikey/helpers.js.map +1 -1
  12. package/dist/commands/backup/helpers.d.ts +1 -3
  13. package/dist/commands/backup/helpers.d.ts.map +1 -1
  14. package/dist/commands/backup/helpers.js +2 -23
  15. package/dist/commands/backup/helpers.js.map +1 -1
  16. package/dist/commands/cluster.d.ts.map +1 -1
  17. package/dist/commands/cluster.js +3 -1
  18. package/dist/commands/cluster.js.map +1 -1
  19. package/dist/commands/device.d.ts.map +1 -1
  20. package/dist/commands/device.js +10 -6
  21. package/dist/commands/device.js.map +1 -1
  22. package/dist/commands/dynamic-secrets/helpers.d.ts +3 -2
  23. package/dist/commands/dynamic-secrets/helpers.d.ts.map +1 -1
  24. package/dist/commands/dynamic-secrets/helpers.js +6 -15
  25. package/dist/commands/dynamic-secrets/helpers.js.map +1 -1
  26. package/dist/commands/kms/crud.d.ts +6 -0
  27. package/dist/commands/kms/crud.d.ts.map +1 -0
  28. package/dist/commands/kms/crud.js +226 -0
  29. package/dist/commands/kms/crud.js.map +1 -0
  30. package/dist/commands/kms/crypto.d.ts +6 -0
  31. package/dist/commands/kms/crypto.d.ts.map +1 -0
  32. package/dist/commands/kms/crypto.js +190 -0
  33. package/dist/commands/kms/crypto.js.map +1 -0
  34. package/dist/commands/kms/helpers.d.ts +10 -0
  35. package/dist/commands/kms/helpers.d.ts.map +1 -0
  36. package/dist/commands/kms/helpers.js +44 -0
  37. package/dist/commands/kms/helpers.js.map +1 -0
  38. package/dist/commands/kms/index.d.ts +13 -0
  39. package/dist/commands/kms/index.d.ts.map +1 -0
  40. package/dist/commands/kms/index.js +18 -0
  41. package/dist/commands/kms/index.js.map +1 -0
  42. package/dist/commands/kms/lifecycle.d.ts +6 -0
  43. package/dist/commands/kms/lifecycle.d.ts.map +1 -0
  44. package/dist/commands/kms/lifecycle.js +124 -0
  45. package/dist/commands/kms/lifecycle.js.map +1 -0
  46. package/dist/commands/kms/types.d.ts +102 -0
  47. package/dist/commands/kms/types.d.ts.map +1 -0
  48. package/dist/commands/kms/types.js +3 -0
  49. package/dist/commands/kms/types.js.map +1 -0
  50. package/dist/commands/plugin/enable-disable.d.ts +6 -0
  51. package/dist/commands/plugin/enable-disable.d.ts.map +1 -0
  52. package/dist/commands/plugin/enable-disable.js +64 -0
  53. package/dist/commands/plugin/enable-disable.js.map +1 -0
  54. package/dist/commands/plugin/helpers.d.ts +63 -0
  55. package/dist/commands/plugin/helpers.d.ts.map +1 -0
  56. package/dist/commands/plugin/helpers.js +204 -0
  57. package/dist/commands/plugin/helpers.js.map +1 -0
  58. package/dist/commands/plugin/index.d.ts +10 -0
  59. package/dist/commands/plugin/index.d.ts.map +1 -0
  60. package/dist/commands/plugin/index.js +24 -0
  61. package/dist/commands/plugin/index.js.map +1 -0
  62. package/dist/commands/plugin/info.d.ts +6 -0
  63. package/dist/commands/plugin/info.d.ts.map +1 -0
  64. package/dist/commands/plugin/info.js +108 -0
  65. package/dist/commands/plugin/info.js.map +1 -0
  66. package/dist/commands/plugin/install.d.ts +6 -0
  67. package/dist/commands/plugin/install.d.ts.map +1 -0
  68. package/dist/commands/plugin/install.js +96 -0
  69. package/dist/commands/plugin/install.js.map +1 -0
  70. package/dist/commands/plugin/list.d.ts +6 -0
  71. package/dist/commands/plugin/list.d.ts.map +1 -0
  72. package/dist/commands/plugin/list.js +60 -0
  73. package/dist/commands/plugin/list.js.map +1 -0
  74. package/dist/commands/plugin/types.d.ts +37 -0
  75. package/dist/commands/plugin/types.d.ts.map +1 -0
  76. package/dist/commands/plugin/types.js +7 -0
  77. package/dist/commands/plugin/types.js.map +1 -0
  78. package/dist/commands/plugin/uninstall.d.ts +6 -0
  79. package/dist/commands/plugin/uninstall.d.ts.map +1 -0
  80. package/dist/commands/plugin/uninstall.js +50 -0
  81. package/dist/commands/plugin/uninstall.js.map +1 -0
  82. package/dist/commands/plugin/update.d.ts +6 -0
  83. package/dist/commands/plugin/update.d.ts.map +1 -0
  84. package/dist/commands/plugin/update.js +84 -0
  85. package/dist/commands/plugin/update.js.map +1 -0
  86. package/dist/commands/policy/attachments.d.ts.map +1 -1
  87. package/dist/commands/policy/attachments.js +14 -20
  88. package/dist/commands/policy/attachments.js.map +1 -1
  89. package/dist/commands/policy/crud.d.ts.map +1 -1
  90. package/dist/commands/policy/crud.js +13 -23
  91. package/dist/commands/policy/crud.js.map +1 -1
  92. package/dist/commands/policy/io.d.ts.map +1 -1
  93. package/dist/commands/policy/io.js +4 -5
  94. package/dist/commands/policy/io.js.map +1 -1
  95. package/dist/commands/policy/list.d.ts.map +1 -1
  96. package/dist/commands/policy/list.js +7 -8
  97. package/dist/commands/policy/list.js.map +1 -1
  98. package/dist/commands/quarantine.d.ts.map +1 -1
  99. package/dist/commands/quarantine.js +1 -9
  100. package/dist/commands/quarantine.js.map +1 -1
  101. package/dist/commands/role.d.ts.map +1 -1
  102. package/dist/commands/role.js +4 -10
  103. package/dist/commands/role.js.map +1 -1
  104. package/dist/commands/secret/helpers.d.ts +1 -2
  105. package/dist/commands/secret/helpers.d.ts.map +1 -1
  106. package/dist/commands/secret/helpers.js +2 -14
  107. package/dist/commands/secret/helpers.js.map +1 -1
  108. package/dist/commands/secret/list.d.ts.map +1 -1
  109. package/dist/commands/secret/list.js +3 -4
  110. package/dist/commands/secret/list.js.map +1 -1
  111. package/dist/commands/ssh/bookmark.d.ts +11 -0
  112. package/dist/commands/ssh/bookmark.d.ts.map +1 -0
  113. package/dist/commands/ssh/bookmark.js +210 -0
  114. package/dist/commands/ssh/bookmark.js.map +1 -0
  115. package/dist/commands/ssh/ca.d.ts +6 -0
  116. package/dist/commands/ssh/ca.d.ts.map +1 -0
  117. package/dist/commands/ssh/ca.js +162 -0
  118. package/dist/commands/ssh/ca.js.map +1 -0
  119. package/dist/commands/ssh/cert.d.ts +6 -0
  120. package/dist/commands/ssh/cert.d.ts.map +1 -0
  121. package/dist/commands/ssh/cert.js +303 -0
  122. package/dist/commands/ssh/cert.js.map +1 -0
  123. package/dist/commands/ssh/config.d.ts +6 -0
  124. package/dist/commands/ssh/config.d.ts.map +1 -0
  125. package/dist/commands/ssh/config.js +95 -0
  126. package/dist/commands/ssh/config.js.map +1 -0
  127. package/dist/commands/ssh/connect.d.ts +12 -0
  128. package/dist/commands/ssh/connect.d.ts.map +1 -0
  129. package/dist/commands/ssh/connect.js +226 -0
  130. package/dist/commands/ssh/connect.js.map +1 -0
  131. package/dist/commands/ssh/exec.d.ts +6 -0
  132. package/dist/commands/ssh/exec.d.ts.map +1 -0
  133. package/dist/commands/ssh/exec.js +218 -0
  134. package/dist/commands/ssh/exec.js.map +1 -0
  135. package/dist/commands/ssh/helpers.d.ts +46 -0
  136. package/dist/commands/ssh/helpers.d.ts.map +1 -0
  137. package/dist/commands/ssh/helpers.js +175 -0
  138. package/dist/commands/ssh/helpers.js.map +1 -0
  139. package/dist/commands/ssh/hosts.d.ts +6 -0
  140. package/dist/commands/ssh/hosts.d.ts.map +1 -0
  141. package/dist/commands/ssh/hosts.js +101 -0
  142. package/dist/commands/ssh/hosts.js.map +1 -0
  143. package/dist/commands/ssh/index.d.ts +24 -0
  144. package/dist/commands/ssh/index.d.ts.map +1 -0
  145. package/dist/commands/ssh/index.js +109 -0
  146. package/dist/commands/ssh/index.js.map +1 -0
  147. package/dist/commands/ssh/mapping.d.ts +6 -0
  148. package/dist/commands/ssh/mapping.d.ts.map +1 -0
  149. package/dist/commands/ssh/mapping.js +130 -0
  150. package/dist/commands/ssh/mapping.js.map +1 -0
  151. package/dist/commands/ssh/scp.d.ts +6 -0
  152. package/dist/commands/ssh/scp.d.ts.map +1 -0
  153. package/dist/commands/ssh/scp.js +219 -0
  154. package/dist/commands/ssh/scp.js.map +1 -0
  155. package/dist/commands/ssh/server-group.d.ts +6 -0
  156. package/dist/commands/ssh/server-group.d.ts.map +1 -0
  157. package/dist/commands/ssh/server-group.js +249 -0
  158. package/dist/commands/ssh/server-group.js.map +1 -0
  159. package/dist/commands/ssh/types.d.ts +150 -0
  160. package/dist/commands/ssh/types.d.ts.map +1 -0
  161. package/dist/commands/ssh/types.js +3 -0
  162. package/dist/commands/ssh/types.js.map +1 -0
  163. package/dist/commands/ssh-ca/helpers.d.ts +1 -8
  164. package/dist/commands/ssh-ca/helpers.d.ts.map +1 -1
  165. package/dist/commands/ssh-ca/helpers.js +2 -23
  166. package/dist/commands/ssh-ca/helpers.js.map +1 -1
  167. package/dist/commands/sso/crud.d.ts +6 -0
  168. package/dist/commands/sso/crud.d.ts.map +1 -0
  169. package/dist/commands/sso/crud.js +360 -0
  170. package/dist/commands/sso/crud.js.map +1 -0
  171. package/dist/commands/sso/helpers.d.ts +9 -0
  172. package/dist/commands/sso/helpers.d.ts.map +1 -0
  173. package/dist/commands/sso/helpers.js +13 -0
  174. package/dist/commands/sso/helpers.js.map +1 -0
  175. package/dist/commands/sso/index.d.ts +13 -0
  176. package/dist/commands/sso/index.d.ts.map +1 -0
  177. package/dist/commands/sso/index.js +16 -0
  178. package/dist/commands/sso/index.js.map +1 -0
  179. package/dist/commands/sso/types.d.ts +119 -0
  180. package/dist/commands/sso/types.d.ts.map +1 -0
  181. package/dist/commands/sso/types.js +3 -0
  182. package/dist/commands/sso/types.js.map +1 -0
  183. package/dist/commands/sso/users.d.ts +6 -0
  184. package/dist/commands/sso/users.d.ts.map +1 -0
  185. package/dist/commands/sso/users.js +128 -0
  186. package/dist/commands/sso/users.js.map +1 -0
  187. package/dist/commands/unseal.d.ts.map +1 -1
  188. package/dist/commands/unseal.js +10 -20
  189. package/dist/commands/unseal.js.map +1 -1
  190. package/dist/index.js +4 -4
  191. package/dist/index.js.map +1 -1
  192. package/dist/lib/cli-update.d.ts.map +1 -1
  193. package/dist/lib/cli-update.js +18 -14
  194. package/dist/lib/cli-update.js.map +1 -1
  195. package/dist/lib/client/http.d.ts +3 -1
  196. package/dist/lib/client/http.d.ts.map +1 -1
  197. package/dist/lib/client/http.js +41 -8
  198. package/dist/lib/client/http.js.map +1 -1
  199. package/dist/lib/config/autounseal.d.ts +4 -0
  200. package/dist/lib/config/autounseal.d.ts.map +1 -1
  201. package/dist/lib/config/autounseal.js +102 -6
  202. package/dist/lib/config/autounseal.js.map +1 -1
  203. package/dist/lib/config/credentials.d.ts.map +1 -1
  204. package/dist/lib/config/credentials.js +3 -2
  205. package/dist/lib/config/credentials.js.map +1 -1
  206. package/dist/lib/config/index.d.ts +2 -1
  207. package/dist/lib/config/index.d.ts.map +1 -1
  208. package/dist/lib/config/index.js +3 -1
  209. package/dist/lib/config/index.js.map +1 -1
  210. package/dist/lib/config/keychain.d.ts +27 -0
  211. package/dist/lib/config/keychain.d.ts.map +1 -0
  212. package/dist/lib/config/keychain.js +194 -0
  213. package/dist/lib/config/keychain.js.map +1 -0
  214. package/dist/lib/config/types.d.ts +12 -0
  215. package/dist/lib/config/types.d.ts.map +1 -1
  216. package/dist/lib/config/types.js +3 -2
  217. package/dist/lib/config/types.js.map +1 -1
  218. package/dist/lib/constants.d.ts +24 -0
  219. package/dist/lib/constants.d.ts.map +1 -1
  220. package/dist/lib/constants.js +34 -1
  221. package/dist/lib/constants.js.map +1 -1
  222. package/dist/lib/db/health.d.ts.map +1 -1
  223. package/dist/lib/db/health.js +14 -7
  224. package/dist/lib/db/health.js.map +1 -1
  225. package/dist/lib/debug.d.ts +17 -0
  226. package/dist/lib/debug.d.ts.map +1 -0
  227. package/dist/lib/debug.js +50 -0
  228. package/dist/lib/debug.js.map +1 -0
  229. package/dist/lib/format-helpers.d.ts +43 -0
  230. package/dist/lib/format-helpers.d.ts.map +1 -1
  231. package/dist/lib/format-helpers.js +85 -0
  232. package/dist/lib/format-helpers.js.map +1 -1
  233. package/dist/lib/local.d.ts.map +1 -1
  234. package/dist/lib/local.js +12 -8
  235. package/dist/lib/local.js.map +1 -1
  236. package/dist/lib/mode.d.ts.map +1 -1
  237. package/dist/lib/mode.js +2 -1
  238. package/dist/lib/mode.js.map +1 -1
  239. package/dist/lib/output.d.ts +10 -0
  240. package/dist/lib/output.d.ts.map +1 -1
  241. package/dist/lib/output.js +21 -0
  242. package/dist/lib/output.js.map +1 -1
  243. package/dist/services/auto-update-daemon.d.ts.map +1 -1
  244. package/dist/services/auto-update-daemon.js +10 -6
  245. package/dist/services/auto-update-daemon.js.map +1 -1
  246. package/dist/services/update-checker.d.ts.map +1 -1
  247. package/dist/services/update-checker.js +2 -1
  248. package/dist/services/update-checker.js.map +1 -1
  249. package/dist/services/update-installer.d.ts +8 -0
  250. package/dist/services/update-installer.d.ts.map +1 -1
  251. package/dist/services/update-installer.js +47 -18
  252. package/dist/services/update-installer.js.map +1 -1
  253. package/dist/types/index.d.ts +11 -0
  254. package/dist/types/index.d.ts.map +1 -1
  255. package/package.json +4 -4
  256. package/dist/commands/kms.d.ts +0 -3
  257. package/dist/commands/kms.d.ts.map +0 -1
  258. package/dist/commands/kms.js +0 -555
  259. package/dist/commands/kms.js.map +0 -1
  260. package/dist/commands/plugin.d.ts +0 -8
  261. package/dist/commands/plugin.d.ts.map +0 -1
  262. package/dist/commands/plugin.js +0 -637
  263. package/dist/commands/plugin.js.map +0 -1
  264. package/dist/commands/ssh.d.ts +0 -3
  265. package/dist/commands/ssh.d.ts.map +0 -1
  266. package/dist/commands/ssh.js +0 -814
  267. package/dist/commands/ssh.js.map +0 -1
  268. package/dist/commands/sso.d.ts +0 -3
  269. package/dist/commands/sso.d.ts.map +0 -1
  270. package/dist/commands/sso.js +0 -486
  271. package/dist/commands/sso.js.map +0 -1
@@ -0,0 +1,175 @@
1
+ // Path: src/commands/ssh/helpers.ts
2
+ /**
3
+ * SSH CA command helper functions
4
+ */
5
+ import { client } from '../../lib/client.js';
6
+ import { formatTtl, parseTtl } from '../../lib/format-helpers.js';
7
+ // Re-export common formatters from centralized location
8
+ export { formatTtl, parseTtl };
9
+ /**
10
+ * Get path to the default SSH key
11
+ */
12
+ export async function getDefaultKeyPath() {
13
+ const fs = await import('fs');
14
+ const path = await import('path');
15
+ const os = await import('os');
16
+ const sshDir = path.join(os.homedir(), '.ssh');
17
+ const keyTypes = ['id_ed25519', 'id_ecdsa', 'id_rsa'];
18
+ for (const keyType of keyTypes) {
19
+ const keyPath = path.join(sshDir, keyType);
20
+ const pubPath = path.join(sshDir, `${keyType}.pub`);
21
+ if (fs.existsSync(keyPath) && fs.existsSync(pubPath)) {
22
+ return keyPath;
23
+ }
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Get the certificate path for a given key path
29
+ */
30
+ export async function getCertificatePath(keyPath) {
31
+ const path = await import('path');
32
+ const dir = path.dirname(keyPath);
33
+ const base = path.basename(keyPath);
34
+ return path.join(dir, `${base}-cert.pub`);
35
+ }
36
+ /**
37
+ * Check if a certificate is valid (exists and not expired)
38
+ */
39
+ export async function isCertificateValid(certPath) {
40
+ const fs = await import('fs');
41
+ const { execSync } = await import('child_process');
42
+ if (!fs.existsSync(certPath)) {
43
+ return { valid: false, reason: 'Certificate does not exist' };
44
+ }
45
+ try {
46
+ // Use ssh-keygen -L to inspect the certificate
47
+ const output = execSync(`ssh-keygen -L -f "${certPath}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
48
+ // Parse "Valid: from YYYY-MM-DDTHH:MM:SS to YYYY-MM-DDTHH:MM:SS"
49
+ const validMatch = output.match(/Valid:\s+from\s+(\S+)\s+to\s+(\S+)/);
50
+ if (!validMatch) {
51
+ return { valid: false, reason: 'Could not parse certificate validity' };
52
+ }
53
+ const validBefore = new Date(validMatch[2]);
54
+ const now = new Date();
55
+ // Check if expired (with 5 minute buffer)
56
+ if (validBefore.getTime() - now.getTime() < 5 * 60 * 1000) {
57
+ return { valid: false, reason: 'Certificate expired or expiring soon' };
58
+ }
59
+ return { valid: true };
60
+ }
61
+ catch {
62
+ return { valid: false, reason: 'Failed to inspect certificate' };
63
+ }
64
+ }
65
+ /**
66
+ * Sign a certificate using the vault API
67
+ */
68
+ export async function signCertificate(publicKeyPath, certPath, principals, ttl, tenant) {
69
+ const fs = await import('fs');
70
+ const publicKey = fs.readFileSync(publicKeyPath, 'utf8').trim();
71
+ const query = tenant ? `?tenantId=${encodeURIComponent(tenant)}` : '';
72
+ const body = { publicKey };
73
+ if (ttl) {
74
+ body.ttlSeconds = parseTtl(ttl);
75
+ }
76
+ if (principals) {
77
+ body.principals = principals.split(',').map(p => p.trim());
78
+ }
79
+ const result = await client.post(`/v1/ssh/sign${query}`, body);
80
+ fs.writeFileSync(certPath, result.certificate + '\n');
81
+ }
82
+ /**
83
+ * Check if a certificate is expired
84
+ */
85
+ export function isExpired(validBefore) {
86
+ return new Date(validBefore) < new Date();
87
+ }
88
+ /**
89
+ * Build tenant query string parameter
90
+ */
91
+ export function buildTenantQuery(tenant) {
92
+ return tenant ? `?tenantId=${encodeURIComponent(tenant)}` : '';
93
+ }
94
+ /**
95
+ * Parse local certificate details using ssh-keygen
96
+ */
97
+ export async function parseCertificateInfo(certPath) {
98
+ const fs = await import('fs');
99
+ const { execSync } = await import('child_process');
100
+ if (!fs.existsSync(certPath)) {
101
+ return {
102
+ valid: false,
103
+ principals: [],
104
+ validAfter: null,
105
+ validBefore: null,
106
+ fingerprint: null,
107
+ keyId: null,
108
+ serial: null,
109
+ };
110
+ }
111
+ try {
112
+ const output = execSync(`ssh-keygen -L -f "${certPath}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
113
+ // Parse principals
114
+ const principals = [];
115
+ const principalsMatch = output.match(/Principals:\s*([\s\S]*?)(?=\s+Critical Options:)/);
116
+ if (principalsMatch) {
117
+ const lines = principalsMatch[1].trim().split('\n');
118
+ for (const line of lines) {
119
+ const principal = line.trim();
120
+ if (principal) {
121
+ principals.push(principal);
122
+ }
123
+ }
124
+ }
125
+ // Parse validity
126
+ const validMatch = output.match(/Valid:\s+from\s+(\S+)\s+to\s+(\S+)/);
127
+ const validAfter = validMatch ? new Date(validMatch[1]) : null;
128
+ const validBefore = validMatch ? new Date(validMatch[2]) : null;
129
+ // Parse fingerprint
130
+ const fpMatch = output.match(/Public key:.*?(\S+:\S+)/);
131
+ const fingerprint = fpMatch ? fpMatch[1] : null;
132
+ // Parse key ID
133
+ const keyIdMatch = output.match(/Key ID:\s*"([^"]+)"/);
134
+ const keyId = keyIdMatch ? keyIdMatch[1] : null;
135
+ // Parse serial
136
+ const serialMatch = output.match(/Serial:\s*(\d+)/);
137
+ const serial = serialMatch ? serialMatch[1] : null;
138
+ // Check validity
139
+ const now = new Date();
140
+ const valid = validBefore ? validBefore.getTime() > now.getTime() : false;
141
+ return { valid, principals, validAfter, validBefore, fingerprint, keyId, serial };
142
+ }
143
+ catch {
144
+ return {
145
+ valid: false,
146
+ principals: [],
147
+ validAfter: null,
148
+ validBefore: null,
149
+ fingerprint: null,
150
+ keyId: null,
151
+ serial: null,
152
+ };
153
+ }
154
+ }
155
+ /**
156
+ * Format remaining time as human-readable string
157
+ */
158
+ export function formatRemainingTime(validBefore) {
159
+ const now = new Date();
160
+ const diff = validBefore.getTime() - now.getTime();
161
+ if (diff <= 0) {
162
+ return 'expired';
163
+ }
164
+ const hours = Math.floor(diff / (1000 * 60 * 60));
165
+ const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
166
+ if (hours > 24) {
167
+ const days = Math.floor(hours / 24);
168
+ return `${days}d ${hours % 24}h`;
169
+ }
170
+ if (hours > 0) {
171
+ return `${hours}h ${minutes}m`;
172
+ }
173
+ return `${minutes}m`;
174
+ }
175
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/ssh/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SSH host discovery from registered agents
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerHostsCommand(parent: Command): void;
6
+ //# sourceMappingURL=hosts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/hosts.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsF1D"}
@@ -0,0 +1,101 @@
1
+ // Path: src/commands/ssh/hosts.ts
2
+ import ora from 'ora';
3
+ import { client } from '../../lib/client.js';
4
+ import * as output from '../../lib/output.js';
5
+ export function registerHostsCommand(parent) {
6
+ parent
7
+ .command('hosts')
8
+ .description('List available hosts from registered agents')
9
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
10
+ .option('--online-only', 'Show only online agents')
11
+ .option('--json', 'Output as JSON')
12
+ .action(async (options) => {
13
+ const spinner = ora('Fetching hosts...').start();
14
+ try {
15
+ const params = new URLSearchParams();
16
+ if (options.tenant)
17
+ params.set('tenantId', options.tenant);
18
+ params.set('limit', '100');
19
+ const queryString = params.toString();
20
+ const url = queryString ? '/v1/agents?' + queryString : '/v1/agents';
21
+ const response = await client.get(url);
22
+ spinner.stop();
23
+ // Handle both array and paginated response formats
24
+ let agents;
25
+ if (Array.isArray(response)) {
26
+ agents = response;
27
+ }
28
+ else if (response && 'items' in response) {
29
+ agents = response.items ?? [];
30
+ }
31
+ else {
32
+ agents = [];
33
+ }
34
+ // Filter online only if requested
35
+ if (options.onlineOnly) {
36
+ agents = agents.filter(a => a.status === 'online');
37
+ }
38
+ if (options.json) {
39
+ output.json(agents.map(a => ({
40
+ id: a.id,
41
+ name: a.name,
42
+ hostname: a.hostname,
43
+ ip: a.ip,
44
+ status: a.status,
45
+ lastSeen: a.lastSeen,
46
+ hostConfig: a.hostConfigName,
47
+ })));
48
+ return;
49
+ }
50
+ if (agents.length === 0) {
51
+ output.info('No hosts found');
52
+ if (options.onlineOnly) {
53
+ output.info('Try without --online-only to see all hosts');
54
+ }
55
+ return;
56
+ }
57
+ output.section('Available Hosts');
58
+ output.table(['Name', 'Hostname', 'IP', 'Status', 'Last Seen', 'Config'], agents.map(a => [
59
+ a.name,
60
+ a.hostname ?? '-',
61
+ a.ip ?? '-',
62
+ a.status === 'online' ? '● Online' : a.status === 'offline' ? '○ Offline' : '? Unknown',
63
+ a.lastSeen ? formatLastSeen(a.lastSeen) : '-',
64
+ a.hostConfigName ?? '-',
65
+ ]));
66
+ output.info('Total: ' + agents.length + ' host(s)');
67
+ // Show connection hint
68
+ if (agents.some(a => a.ip)) {
69
+ console.log();
70
+ const firstWithIp = agents.find(a => a.ip);
71
+ if (firstWithIp) {
72
+ output.info('Connect: znvault ssh connect ' + firstWithIp.ip);
73
+ output.info('Or add a bookmark: znvault ssh bookmark add ' + firstWithIp.name + ' ' + firstWithIp.ip);
74
+ }
75
+ }
76
+ }
77
+ catch (err) {
78
+ spinner.fail('Failed to fetch hosts');
79
+ output.error(err instanceof Error ? err.message : String(err));
80
+ process.exit(1);
81
+ }
82
+ });
83
+ }
84
+ function formatLastSeen(lastSeen) {
85
+ const date = new Date(lastSeen);
86
+ const now = new Date();
87
+ const diff = now.getTime() - date.getTime();
88
+ const minutes = Math.floor(diff / (1000 * 60));
89
+ const hours = Math.floor(diff / (1000 * 60 * 60));
90
+ const days = Math.floor(diff / (1000 * 60 * 60 * 24));
91
+ if (minutes < 1)
92
+ return 'just now';
93
+ if (minutes < 60)
94
+ return minutes + 'm ago';
95
+ if (hours < 24)
96
+ return hours + 'h ago';
97
+ if (days < 7)
98
+ return days + 'd ago';
99
+ return date.toLocaleDateString();
100
+ }
101
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../../src/commands/ssh/hosts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SSH Certificate Authority commands
3
+ *
4
+ * This module provides comprehensive SSH CA management including:
5
+ * - CA lifecycle (init, status, delete, public-key)
6
+ * - Certificate signing and management
7
+ * - Principal mappings (SSO groups → SSH principals)
8
+ * - Server groups with access rules
9
+ * - Local SSH configuration and defaults
10
+ * - Host bookmarks for quick access
11
+ * - Host discovery from registered agents
12
+ * - SCP file transfer with certificate auth
13
+ * - Convenience connect command with auto-signing
14
+ *
15
+ * Quick connect shortcut:
16
+ * znvault ssh user@host # Direct connection
17
+ * znvault ssh my-bookmark # Connect via bookmark
18
+ */
19
+ import type { Command } from 'commander';
20
+ export declare function registerSSHCommands(program: Command): void;
21
+ export * from './types.js';
22
+ export { getDefaultKeyPath, getCertificatePath, isCertificateValid, signCertificate, formatTtl, parseTtl, isExpired, buildTenantQuery, parseCertificateInfo, formatRemainingTime, } from './helpers.js';
23
+ export { resolveBookmark } from './bookmark.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6DzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD1D;AAGD,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,109 @@
1
+ // Path: src/commands/ssh/index.ts
2
+ import { registerCACommands } from './ca.js';
3
+ import { registerCertCommands } from './cert.js';
4
+ import { registerMappingCommands } from './mapping.js';
5
+ import { registerServerGroupCommands } from './server-group.js';
6
+ import { registerConfigCommands } from './config.js';
7
+ import { registerConnectCommand, executeConnect } from './connect.js';
8
+ import { registerBookmarkCommands, resolveBookmark } from './bookmark.js';
9
+ import { registerSCPCommand } from './scp.js';
10
+ import { registerHostsCommand } from './hosts.js';
11
+ import { registerExecCommand } from './exec.js';
12
+ // Known subcommands that should NOT be treated as destinations
13
+ const SSH_SUBCOMMANDS = new Set([
14
+ 'ca', 'cert', 'mapping', 'server-group', 'config',
15
+ 'bookmark', 'bm', 'hosts', 'scp', 'connect', 'exec',
16
+ 'help', '--help', '-h',
17
+ ]);
18
+ /**
19
+ * Check if a string looks like an SSH destination rather than a subcommand
20
+ */
21
+ function looksLikeDestination(arg) {
22
+ // Known subcommand - definitely not a destination
23
+ if (SSH_SUBCOMMANDS.has(arg)) {
24
+ return false;
25
+ }
26
+ // Contains @ - it's user@host format
27
+ if (arg.includes('@')) {
28
+ return true;
29
+ }
30
+ // Is a bookmark
31
+ if (resolveBookmark(arg)) {
32
+ return true;
33
+ }
34
+ // Looks like an IP address (v4 or v6)
35
+ if (/^[\d.:]+$/.test(arg) || arg.startsWith('[')) {
36
+ return true;
37
+ }
38
+ // Contains dots - likely a hostname
39
+ if (arg.includes('.')) {
40
+ return true;
41
+ }
42
+ // Short hostname without dots - could be a bookmark or local host
43
+ // Only treat as destination if it doesn't look like a flag
44
+ if (!arg.startsWith('-') && /^[a-zA-Z0-9][\w-]*$/.test(arg)) {
45
+ // Could be an unknown subcommand or a simple hostname
46
+ // Be conservative: only treat as destination if it resolves to a bookmark
47
+ // This prevents `znvault ssh typo` from trying to connect
48
+ return false;
49
+ }
50
+ return false;
51
+ }
52
+ export function registerSSHCommands(program) {
53
+ const ssh = program
54
+ .command('ssh')
55
+ .description('SSH CA management and quick connect (znvault ssh user@host)')
56
+ .argument('[destination]', 'Host to connect to (user@host or bookmark name)')
57
+ .argument('[command...]', 'Remote command to execute')
58
+ .option('-i, --identity <file>', 'Path to SSH private key')
59
+ .option('-p, --port <port>', 'SSH port', '22')
60
+ .option('--principals <principals>', 'Principals for signing (comma-separated)')
61
+ .option('--ttl <ttl>', 'Certificate TTL (e.g., 8h, 1d)')
62
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
63
+ .option('--force-sign', 'Force re-signing even if certificate is valid')
64
+ .option('--dry-run', 'Show what would be done without executing SSH')
65
+ .option('-v, --verbose', 'Show verbose output')
66
+ .option('-t', 'Force pseudo-terminal allocation')
67
+ .option('-T', 'Disable pseudo-terminal allocation')
68
+ .allowUnknownOption(false)
69
+ .action(async (destination, remoteCommand, options) => {
70
+ // If no destination provided, show help
71
+ if (!destination) {
72
+ ssh.outputHelp();
73
+ return;
74
+ }
75
+ // Check if it looks like a destination
76
+ if (looksLikeDestination(destination)) {
77
+ await executeConnect(destination, remoteCommand, options);
78
+ }
79
+ else {
80
+ // Not a destination - might be a typo or unknown subcommand
81
+ // Show help with a hint
82
+ console.error(`Unknown subcommand or destination: ${destination}`);
83
+ console.error('');
84
+ console.error('For quick connect, use: znvault ssh user@host');
85
+ console.error('For subcommands, use: znvault ssh <command> --help');
86
+ console.error('');
87
+ ssh.outputHelp();
88
+ process.exit(1);
89
+ }
90
+ });
91
+ // Register all sub-command groups
92
+ registerCACommands(ssh);
93
+ registerCertCommands(ssh);
94
+ registerMappingCommands(ssh);
95
+ registerServerGroupCommands(ssh);
96
+ registerConfigCommands(ssh);
97
+ registerBookmarkCommands(ssh);
98
+ registerHostsCommand(ssh);
99
+ registerSCPCommand(ssh);
100
+ registerConnectCommand(ssh);
101
+ registerExecCommand(ssh);
102
+ }
103
+ // Re-export types for external use
104
+ export * from './types.js';
105
+ // Re-export helpers for potential reuse
106
+ export { getDefaultKeyPath, getCertificatePath, isCertificateValid, signCertificate, formatTtl, parseTtl, isExpired, buildTenantQuery, parseCertificateInfo, formatRemainingTime, } from './helpers.js';
107
+ // Re-export bookmark resolver
108
+ export { resolveBookmark } from './bookmark.js';
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ssh/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SSH principal mapping commands
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerMappingCommands(parent: Command): void;
6
+ //# sourceMappingURL=mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/mapping.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwI7D"}
@@ -0,0 +1,130 @@
1
+ // Path: src/commands/ssh/mapping.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
+ import { buildTenantQuery } from './helpers.js';
7
+ export function registerMappingCommands(parent) {
8
+ const mapping = parent
9
+ .command('mapping')
10
+ .description('SSH principal mapping management (SSO groups → SSH principals)');
11
+ // List Mappings
12
+ mapping
13
+ .command('list')
14
+ .description('List principal mappings')
15
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
16
+ .option('--json', 'Output as JSON')
17
+ .action(async (options) => {
18
+ const spinner = ora('Fetching mappings...').start();
19
+ try {
20
+ const query = buildTenantQuery(options.tenant);
21
+ const response = await client.get(`/v1/ssh/principal-mappings${query}`);
22
+ spinner.stop();
23
+ if (options.json) {
24
+ output.json(response.items);
25
+ return;
26
+ }
27
+ if (response.items.length === 0) {
28
+ output.info('No principal mappings found');
29
+ output.info('Use "znvault ssh mapping create" to create a mapping');
30
+ return;
31
+ }
32
+ output.table(['ID', 'Group', 'Principals', 'Created'], response.items.map(m => [
33
+ m.id.substring(0, 8) + '...',
34
+ m.groupDisplayName ?? m.groupName ?? m.groupId.substring(0, 8),
35
+ m.principals.join(', '),
36
+ output.formatDate(m.createdAt),
37
+ ]));
38
+ output.info(`Total: ${response.items.length} mapping(s)`);
39
+ }
40
+ catch (err) {
41
+ spinner.fail('Failed to list mappings');
42
+ output.error(err instanceof Error ? err.message : String(err));
43
+ process.exit(1);
44
+ }
45
+ });
46
+ // Create Mapping
47
+ mapping
48
+ .command('create <groupId> <principals...>')
49
+ .description('Create principal mapping (SSO group → SSH principals)')
50
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
51
+ .option('--json', 'Output as JSON')
52
+ .action(async (groupId, principals, options) => {
53
+ const spinner = ora('Creating mapping...').start();
54
+ try {
55
+ const query = buildTenantQuery(options.tenant);
56
+ const mappingResult = await client.post(`/v1/ssh/principal-mappings${query}`, {
57
+ groupId,
58
+ principals,
59
+ });
60
+ spinner.succeed('Mapping created successfully');
61
+ if (options.json) {
62
+ output.json(mappingResult);
63
+ return;
64
+ }
65
+ output.keyValue({
66
+ 'ID': mappingResult.id,
67
+ 'Group ID': mappingResult.groupId,
68
+ 'Principals': mappingResult.principals.join(', '),
69
+ 'Created': output.formatDate(mappingResult.createdAt),
70
+ });
71
+ }
72
+ catch (err) {
73
+ spinner.fail('Failed to create mapping');
74
+ output.error(err instanceof Error ? err.message : String(err));
75
+ process.exit(1);
76
+ }
77
+ });
78
+ // Update Mapping
79
+ mapping
80
+ .command('update <mappingId> <principals...>')
81
+ .description('Update principal mapping')
82
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
83
+ .action(async (mappingId, principals, options) => {
84
+ const spinner = ora('Updating mapping...').start();
85
+ try {
86
+ const query = buildTenantQuery(options.tenant);
87
+ await client.put(`/v1/ssh/principal-mappings/${encodeURIComponent(mappingId)}${query}`, {
88
+ principals,
89
+ });
90
+ spinner.succeed('Mapping updated successfully');
91
+ }
92
+ catch (err) {
93
+ spinner.fail('Failed to update mapping');
94
+ output.error(err instanceof Error ? err.message : String(err));
95
+ process.exit(1);
96
+ }
97
+ });
98
+ // Delete Mapping
99
+ mapping
100
+ .command('delete <mappingId>')
101
+ .description('Delete principal mapping')
102
+ .option('--tenant <id>', 'Tenant ID (superadmin only)')
103
+ .option('-y, --yes', 'Skip confirmation')
104
+ .action(async (mappingId, options) => {
105
+ try {
106
+ const query = buildTenantQuery(options.tenant);
107
+ if (!options.yes) {
108
+ const confirmed = await promptConfirm('Delete this mapping?');
109
+ if (!confirmed) {
110
+ output.info('Delete cancelled');
111
+ return;
112
+ }
113
+ }
114
+ const spinner = ora('Deleting mapping...').start();
115
+ try {
116
+ await client.delete(`/v1/ssh/principal-mappings/${encodeURIComponent(mappingId)}${query}`);
117
+ spinner.succeed('Mapping deleted successfully');
118
+ }
119
+ catch (err) {
120
+ spinner.fail('Failed to delete mapping');
121
+ throw err;
122
+ }
123
+ }
124
+ catch (err) {
125
+ output.error(err instanceof Error ? err.message : String(err));
126
+ process.exit(1);
127
+ }
128
+ });
129
+ }
130
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/commands/ssh/mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SCP file transfer with certificate authentication
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerSCPCommand(parent: Command): void;
6
+ //# sourceMappingURL=scp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scp.d.ts","sourceRoot":"","sources":["../../../src/commands/ssh/scp.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmEzC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA+LxD"}