@cig-technology/cli 0.1.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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/commands/bootstrap-reset.d.ts +14 -0
  4. package/dist/commands/bootstrap-reset.d.ts.map +1 -0
  5. package/dist/commands/bootstrap-reset.js +93 -0
  6. package/dist/commands/bootstrap-reset.js.map +1 -0
  7. package/dist/commands/bootstrap.d.ts +18 -0
  8. package/dist/commands/bootstrap.d.ts.map +1 -0
  9. package/dist/commands/bootstrap.js +106 -0
  10. package/dist/commands/bootstrap.js.map +1 -0
  11. package/dist/commands/connect.d.ts +4 -0
  12. package/dist/commands/connect.d.ts.map +1 -0
  13. package/dist/commands/connect.js +46 -0
  14. package/dist/commands/connect.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +11 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +57 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/enroll.d.ts +7 -0
  20. package/dist/commands/enroll.d.ts.map +1 -0
  21. package/dist/commands/enroll.js +13 -0
  22. package/dist/commands/enroll.js.map +1 -0
  23. package/dist/commands/enrollment.d.ts +12 -0
  24. package/dist/commands/enrollment.d.ts.map +1 -0
  25. package/dist/commands/enrollment.js +106 -0
  26. package/dist/commands/enrollment.js.map +1 -0
  27. package/dist/commands/install.d.ts +2 -0
  28. package/dist/commands/install.d.ts.map +1 -0
  29. package/dist/commands/install.js +219 -0
  30. package/dist/commands/install.js.map +1 -0
  31. package/dist/commands/login.d.ts +14 -0
  32. package/dist/commands/login.d.ts.map +1 -0
  33. package/dist/commands/login.js +120 -0
  34. package/dist/commands/login.js.map +1 -0
  35. package/dist/commands/logout.d.ts +10 -0
  36. package/dist/commands/logout.d.ts.map +1 -0
  37. package/dist/commands/logout.js +38 -0
  38. package/dist/commands/logout.js.map +1 -0
  39. package/dist/commands/open.d.ts +2 -0
  40. package/dist/commands/open.d.ts.map +1 -0
  41. package/dist/commands/open.js +17 -0
  42. package/dist/commands/open.js.map +1 -0
  43. package/dist/commands/permissions.d.ts +2 -0
  44. package/dist/commands/permissions.d.ts.map +1 -0
  45. package/dist/commands/permissions.js +17 -0
  46. package/dist/commands/permissions.js.map +1 -0
  47. package/dist/commands/status.d.ts +2 -0
  48. package/dist/commands/status.d.ts.map +1 -0
  49. package/dist/commands/status.js +31 -0
  50. package/dist/commands/status.js.map +1 -0
  51. package/dist/commands/uninstall.d.ts +2 -0
  52. package/dist/commands/uninstall.d.ts.map +1 -0
  53. package/dist/commands/uninstall.js +61 -0
  54. package/dist/commands/uninstall.js.map +1 -0
  55. package/dist/commands/upgrade.d.ts +2 -0
  56. package/dist/commands/upgrade.d.ts.map +1 -0
  57. package/dist/commands/upgrade.js +14 -0
  58. package/dist/commands/upgrade.js.map +1 -0
  59. package/dist/compose-generator.d.ts +23 -0
  60. package/dist/compose-generator.d.ts.map +1 -0
  61. package/dist/compose-generator.js +214 -0
  62. package/dist/compose-generator.js.map +1 -0
  63. package/dist/credentials.d.ts +69 -0
  64. package/dist/credentials.d.ts.map +1 -0
  65. package/dist/credentials.js +178 -0
  66. package/dist/credentials.js.map +1 -0
  67. package/dist/index.d.ts +3 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +151 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/managers/state-manager.d.ts +25 -0
  72. package/dist/managers/state-manager.d.ts.map +1 -0
  73. package/dist/managers/state-manager.js +76 -0
  74. package/dist/managers/state-manager.js.map +1 -0
  75. package/dist/platform.d.ts +20 -0
  76. package/dist/platform.d.ts.map +1 -0
  77. package/dist/platform.js +95 -0
  78. package/dist/platform.js.map +1 -0
  79. package/dist/prereqs.d.ts +48 -0
  80. package/dist/prereqs.d.ts.map +1 -0
  81. package/dist/prereqs.js +242 -0
  82. package/dist/prereqs.js.map +1 -0
  83. package/dist/services/api-client.d.ts +24 -0
  84. package/dist/services/api-client.d.ts.map +1 -0
  85. package/dist/services/api-client.js +66 -0
  86. package/dist/services/api-client.js.map +1 -0
  87. package/dist/services/install-planner.d.ts +18 -0
  88. package/dist/services/install-planner.d.ts.map +1 -0
  89. package/dist/services/install-planner.js +32 -0
  90. package/dist/services/install-planner.js.map +1 -0
  91. package/dist/services/node-bundle-installer.d.ts +12 -0
  92. package/dist/services/node-bundle-installer.d.ts.map +1 -0
  93. package/dist/services/node-bundle-installer.js +65 -0
  94. package/dist/services/node-bundle-installer.js.map +1 -0
  95. package/dist/services/remote-executor.d.ts +5 -0
  96. package/dist/services/remote-executor.d.ts.map +1 -0
  97. package/dist/services/remote-executor.js +13 -0
  98. package/dist/services/remote-executor.js.map +1 -0
  99. package/dist/storage/paths.d.ts +16 -0
  100. package/dist/storage/paths.d.ts.map +1 -0
  101. package/dist/storage/paths.js +54 -0
  102. package/dist/storage/paths.js.map +1 -0
  103. package/dist/stores/cli-secret-store.d.ts +20 -0
  104. package/dist/stores/cli-secret-store.d.ts.map +1 -0
  105. package/dist/stores/cli-secret-store.js +105 -0
  106. package/dist/stores/cli-secret-store.js.map +1 -0
  107. package/dist/stores/connection-profile-store.d.ts +15 -0
  108. package/dist/stores/connection-profile-store.d.ts.map +1 -0
  109. package/dist/stores/connection-profile-store.js +104 -0
  110. package/dist/stores/connection-profile-store.js.map +1 -0
  111. package/dist/types/runtime.d.ts +46 -0
  112. package/dist/types/runtime.d.ts.map +1 -0
  113. package/dist/types/runtime.js +3 -0
  114. package/dist/types/runtime.js.map +1 -0
  115. package/dist/utils/crypto.d.ts +6 -0
  116. package/dist/utils/crypto.d.ts.map +1 -0
  117. package/dist/utils/crypto.js +54 -0
  118. package/dist/utils/crypto.js.map +1 -0
  119. package/dist/utils/systemd.d.ts +8 -0
  120. package/dist/utils/systemd.d.ts.map +1 -0
  121. package/dist/utils/systemd.js +24 -0
  122. package/dist/utils/systemd.js.map +1 -0
  123. package/dist/version.d.ts +2 -0
  124. package/dist/version.d.ts.map +1 -0
  125. package/dist/version.js +5 -0
  126. package/dist/version.js.map +1 -0
  127. package/dist/wizard.d.ts +14 -0
  128. package/dist/wizard.d.ts.map +1 -0
  129. package/dist/wizard.js +154 -0
  130. package/dist/wizard.js.map +1 -0
  131. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Edward Calderon
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @cig-technology/cli
2
+
3
+ Production-oriented CLI for Compute Intelligence Graph.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @cig-technology/cli
9
+ ```
10
+
11
+ Or run it directly:
12
+
13
+ ```bash
14
+ npx @cig-technology/cli login
15
+ ```
16
+
17
+ ## Core commands
18
+
19
+ ```bash
20
+ cig login
21
+ cig install --mode self-hosted
22
+ cig install --mode managed
23
+ cig enroll
24
+ cig connect aws --role-arn arn:aws:iam::123456789012:role/CIGDiscovery
25
+ cig connect gcp --service-account ./service-account.json
26
+ cig connect api --url https://app.cig.lat
27
+ cig permissions
28
+ cig status
29
+ cig open
30
+ cig upgrade
31
+ cig uninstall
32
+ ```
33
+
34
+ ## Release
35
+
36
+ Create a tag in the form `cli-vx.y.z` to trigger the npm publish workflow, or run:
37
+
38
+ ```bash
39
+ pnpm cli:release:patch
40
+ pnpm cli:release:minor
41
+ pnpm cli:release:major
42
+ ```
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Bootstrap Reset Command
3
+ *
4
+ * Generates a new Bootstrap_Token, saves it, and displays it.
5
+ * Used when the previous token has expired (30 minutes after generation).
6
+ *
7
+ * Requirement 5.12: THE CLI SHALL provide a `cig bootstrap-reset` command
8
+ * to generate and display a new token
9
+ */
10
+ /**
11
+ * Bootstrap reset command.
12
+ */
13
+ export declare function bootstrapReset(): Promise<void>;
14
+ //# sourceMappingURL=bootstrap-reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-reset.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCpD"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Bootstrap Reset Command
4
+ *
5
+ * Generates a new Bootstrap_Token, saves it, and displays it.
6
+ * Used when the previous token has expired (30 minutes after generation).
7
+ *
8
+ * Requirement 5.12: THE CLI SHALL provide a `cig bootstrap-reset` command
9
+ * to generate and display a new token
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.bootstrapReset = bootstrapReset;
46
+ const crypto = __importStar(require("crypto"));
47
+ const credentials_js_1 = require("../credentials.js");
48
+ /**
49
+ * Generate a cryptographically random 32-character bootstrap token.
50
+ */
51
+ function generateBootstrapToken() {
52
+ return crypto.randomBytes(16).toString('hex');
53
+ }
54
+ /**
55
+ * Bootstrap reset command.
56
+ */
57
+ async function bootstrapReset() {
58
+ const credentialManager = new credentials_js_1.CredentialManager();
59
+ console.log('\n╔════════════════════════════════════════════════════════════╗');
60
+ console.log('║ Bootstrap Token Reset ║');
61
+ console.log('╚════════════════════════════════════════════════════════════╝');
62
+ // Generate new bootstrap token
63
+ console.log('\nGenerating new bootstrap token...');
64
+ const token = generateBootstrapToken();
65
+ console.log('✓ New bootstrap token generated');
66
+ // Save to ~/.cig/bootstrap.json with permissions 0600
67
+ const bootstrapTokenData = {
68
+ token,
69
+ createdAt: new Date().toISOString(),
70
+ expiresAt: new Date(Date.now() + 30 * 60 * 1000).toISOString(), // 30 minutes
71
+ };
72
+ try {
73
+ credentialManager.saveBootstrapToken(bootstrapTokenData);
74
+ console.log('✓ New bootstrap token saved to ~/.cig/bootstrap.json');
75
+ }
76
+ catch (err) {
77
+ console.error('✗ Failed to save bootstrap token:', err instanceof Error ? err.message : String(err));
78
+ process.exit(1);
79
+ }
80
+ // Display new token prominently
81
+ console.log('\n╔════════════════════════════════════════════════════════════╗');
82
+ console.log('║ New Bootstrap Token ║');
83
+ console.log('╠════════════════════════════════════════════════════════════╣');
84
+ console.log('║ ║');
85
+ console.log(`║ ${token.padEnd(56)}║`);
86
+ console.log('║ ║');
87
+ console.log('║ This token is valid for 30 minutes. ║');
88
+ console.log('║ Use it to complete the bootstrap setup at: ║');
89
+ console.log('║ http://localhost:3000/bootstrap ║');
90
+ console.log('║ ║');
91
+ console.log('╚════════════════════════════════════════════════════════════╝\n');
92
+ }
93
+ //# sourceMappingURL=bootstrap-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-reset.js","sourceRoot":"","sources":["../../src/commands/bootstrap-reset.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeH,wCAuCC;AApDD,+CAAiC;AACjC,sDAAsE;AAEtE;;GAEG;AACH,SAAS,sBAAsB;IAC7B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc;IAClC,MAAM,iBAAiB,GAAG,IAAI,kCAAiB,EAAE,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,+BAA+B;IAC/B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,sDAAsD;IACtD,MAAM,kBAAkB,GAAmB;QACzC,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,aAAa;KAC9E,CAAC;IAEF,IAAI,CAAC;QACH,iBAAiB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Self-Hosted Bootstrap Sub-Flow
3
+ *
4
+ * Implements the bootstrap flow for self-hosted mode:
5
+ * 1. Generate cryptographically random 32-character Bootstrap_Token
6
+ * 2. Save to ~/.cig/bootstrap.json with permissions 0600
7
+ * 3. Display Dashboard URL and token prominently
8
+ * 4. Return minimal InstallManifest for compose generation
9
+ *
10
+ * Requirement 5: Self-Hosted Bootstrap Flow
11
+ */
12
+ import { InstallManifest } from '../compose-generator.js';
13
+ /**
14
+ * Bootstrap flow for self-hosted mode.
15
+ * Returns minimal InstallManifest for compose generation.
16
+ */
17
+ export declare function bootstrapFlow(): Promise<InstallManifest>;
18
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAS1D;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAkD9D"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * Self-Hosted Bootstrap Sub-Flow
4
+ *
5
+ * Implements the bootstrap flow for self-hosted mode:
6
+ * 1. Generate cryptographically random 32-character Bootstrap_Token
7
+ * 2. Save to ~/.cig/bootstrap.json with permissions 0600
8
+ * 3. Display Dashboard URL and token prominently
9
+ * 4. Return minimal InstallManifest for compose generation
10
+ *
11
+ * Requirement 5: Self-Hosted Bootstrap Flow
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.bootstrapFlow = bootstrapFlow;
48
+ const crypto = __importStar(require("crypto"));
49
+ const credentials_js_1 = require("../credentials.js");
50
+ /**
51
+ * Generate a cryptographically random 32-character bootstrap token.
52
+ */
53
+ function generateBootstrapToken() {
54
+ return crypto.randomBytes(16).toString('hex');
55
+ }
56
+ /**
57
+ * Bootstrap flow for self-hosted mode.
58
+ * Returns minimal InstallManifest for compose generation.
59
+ */
60
+ async function bootstrapFlow() {
61
+ const credentialManager = new credentials_js_1.CredentialManager();
62
+ // Step 1: Generate bootstrap token
63
+ console.log('Generating bootstrap token...');
64
+ const token = generateBootstrapToken();
65
+ console.log('✓ Bootstrap token generated');
66
+ // Step 2: Save to ~/.cig/bootstrap.json with permissions 0600
67
+ const bootstrapTokenData = {
68
+ token,
69
+ createdAt: new Date().toISOString(),
70
+ expiresAt: new Date(Date.now() + 30 * 60 * 1000).toISOString(), // 30 minutes
71
+ };
72
+ try {
73
+ credentialManager.saveBootstrapToken(bootstrapTokenData);
74
+ console.log('✓ Bootstrap token saved to ~/.cig/bootstrap.json');
75
+ }
76
+ catch (err) {
77
+ console.error('✗ Failed to save bootstrap token:', err instanceof Error ? err.message : String(err));
78
+ process.exit(1);
79
+ }
80
+ // Step 3: Display Dashboard URL and token prominently
81
+ console.log('\n╔════════════════════════════════════════════════════════════╗');
82
+ console.log('║ Self-Hosted Bootstrap Setup ║');
83
+ console.log('╠════════════════════════════════════════════════════════════╣');
84
+ console.log('║ ║');
85
+ console.log('║ Dashboard URL: ║');
86
+ console.log('║ http://localhost:3000 ║');
87
+ console.log('║ ║');
88
+ console.log('║ Bootstrap Token: ║');
89
+ console.log(`║ ${token.padEnd(56)}║`);
90
+ console.log('║ ║');
91
+ console.log('║ Keep this token safe! You will need it to complete ║');
92
+ console.log('║ the initial setup. ║');
93
+ console.log('║ ║');
94
+ console.log('╚════════════════════════════════════════════════════════════╝\n');
95
+ // Step 4: Return minimal InstallManifest for compose generation
96
+ const manifest = {
97
+ profile: 'core',
98
+ services: ['api', 'dashboard', 'neo4j', 'discovery', 'cartography'],
99
+ env_overrides: {
100
+ CIG_AUTH_MODE: 'self-hosted',
101
+ CIG_BOOTSTRAP_TOKEN: token,
102
+ },
103
+ };
104
+ return manifest;
105
+ }
106
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBH,sCAkDC;AApED,+CAAiC;AAIjC,sDAAsE;AAGtE;;GAEG;AACH,SAAS,sBAAsB;IAC7B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,aAAa;IACjC,MAAM,iBAAiB,GAAG,IAAI,kCAAiB,EAAE,CAAC;IAElD,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,8DAA8D;IAC9D,MAAM,kBAAkB,GAAmB;QACzC,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,aAAa;KAC9E,CAAC;IAEF,IAAI,CAAC;QACH,iBAAiB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAEhF,gEAAgE;IAChE,MAAM,QAAQ,GAAoB;QAChC,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC;QACnE,aAAa,EAAE;YACb,aAAa,EAAE,aAAa;YAC5B,mBAAmB,EAAE,KAAK;SAC3B;KACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function connectAws(roleArn: string): void;
2
+ export declare function connectGcp(serviceAccountPath: string): void;
3
+ export declare function connectApi(apiUrl: string, authMode?: 'managed' | 'self-hosted' | 'none' | string): void;
4
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,UAAU,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAe,GAC7D,IAAI,CA6BN"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.connectAws = connectAws;
4
+ exports.connectGcp = connectGcp;
5
+ exports.connectApi = connectApi;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const credentials_js_1 = require("../credentials.js");
8
+ const connection_profile_store_js_1 = require("../stores/connection-profile-store.js");
9
+ function connectAws(roleArn) {
10
+ const credentialManager = new credentials_js_1.CredentialManager();
11
+ credentialManager.save('aws', roleArn);
12
+ console.log(`✓ Saved AWS discovery role: ${roleArn}`);
13
+ }
14
+ function connectGcp(serviceAccountPath) {
15
+ const credentialManager = new credentials_js_1.CredentialManager();
16
+ credentialManager.save('gcp', serviceAccountPath);
17
+ console.log(`✓ Saved GCP service account reference: ${serviceAccountPath}`);
18
+ }
19
+ function connectApi(apiUrl, authMode = 'none') {
20
+ const profileStore = new connection_profile_store_js_1.ConnectionProfileStore();
21
+ const now = new Date().toISOString();
22
+ const resolvedAuthMode = authMode === 'managed' || authMode === 'self-hosted' || authMode === 'none'
23
+ ? authMode
24
+ : 'none';
25
+ const profile = {
26
+ id: (0, node_crypto_1.randomUUID)(),
27
+ name: apiUrl,
28
+ type: resolvedAuthMode === 'managed'
29
+ ? 'managed-cloud'
30
+ : resolvedAuthMode === 'self-hosted'
31
+ ? 'self-hosted'
32
+ : 'direct-api',
33
+ apiUrl,
34
+ authMode: resolvedAuthMode,
35
+ dashboardUrl: apiUrl.replace(/:8000$/, ':3000'),
36
+ createdAt: now,
37
+ updatedAt: now,
38
+ isDefault: profileStore.list().length === 0,
39
+ };
40
+ profileStore.save(profile);
41
+ if (profile.isDefault) {
42
+ profileStore.setDefault(profile.id);
43
+ }
44
+ console.log(`✓ Saved connection profile for ${apiUrl}`);
45
+ }
46
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":";;AAKA,gCAIC;AAED,gCAIC;AAED,gCAgCC;AAjDD,6CAAyC;AACzC,sDAAsD;AACtD,uFAA+E;AAG/E,SAAgB,UAAU,CAAC,OAAe;IACxC,MAAM,iBAAiB,GAAG,IAAI,kCAAiB,EAAE,CAAC;IAClD,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,UAAU,CAAC,kBAA0B;IACnD,MAAM,iBAAiB,GAAG,IAAI,kCAAiB,EAAE,CAAC;IAClD,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,0CAA0C,kBAAkB,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,UAAU,CACxB,MAAc,EACd,WAAwD,MAAM;IAE9D,MAAM,YAAY,GAAG,IAAI,oDAAsB,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,gBAAgB,GACpB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,MAAM;QACzE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,OAAO,GAAsB;QACjC,EAAE,EAAE,IAAA,wBAAU,GAAE;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EACF,gBAAgB,KAAK,SAAS;YAC5B,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,gBAAgB,KAAK,aAAa;gBAClC,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,YAAY;QACpB,MAAM;QACN,QAAQ,EAAE,gBAAgB;QAC1B,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC/C,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;KAC5C,CAAC;IAEF,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Doctor Command — Prerequisite Checks
3
+ *
4
+ * Runs all prerequisite checks and displays a readiness summary.
5
+ * Does not install anything; only verifies system requirements.
6
+ *
7
+ * Requirement 7.14: THE CLI SHALL provide a `cig doctor` command that runs
8
+ * all prerequisite checks and displays a readiness summary without installing
9
+ */
10
+ export declare function doctor(): Promise<void>;
11
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAkD5C"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Doctor Command — Prerequisite Checks
4
+ *
5
+ * Runs all prerequisite checks and displays a readiness summary.
6
+ * Does not install anything; only verifies system requirements.
7
+ *
8
+ * Requirement 7.14: THE CLI SHALL provide a `cig doctor` command that runs
9
+ * all prerequisite checks and displays a readiness summary without installing
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.doctor = doctor;
13
+ const prereqs_js_1 = require("../prereqs.js");
14
+ async function doctor() {
15
+ console.log('\n╔════════════════════════════════════════════════════════════╗');
16
+ console.log('║ CIG System Check ║');
17
+ console.log('╚════════════════════════════════════════════════════════════╝\n');
18
+ const results = await (0, prereqs_js_1.runAllChecks)();
19
+ const checkNames = [
20
+ 'Docker Engine',
21
+ 'Docker Compose v2.0+',
22
+ 'Free Memory (≥4 GB)',
23
+ 'Free Disk Space (≥10 GB)',
24
+ 'Port Availability',
25
+ ];
26
+ let allPassed = true;
27
+ for (let i = 0; i < results.length; i++) {
28
+ const result = results[i];
29
+ const name = checkNames[i];
30
+ const status = result.passed ? '✓' : '✗';
31
+ const statusColor = result.passed ? '\x1b[32m' : '\x1b[31m'; // Green or Red
32
+ const resetColor = '\x1b[0m';
33
+ console.log(`${statusColor}${status}${resetColor} ${name}`);
34
+ console.log(` ${result.message}`);
35
+ if (!result.passed && result.remediation) {
36
+ console.log(` Remediation: ${result.remediation}`);
37
+ allPassed = false;
38
+ }
39
+ console.log();
40
+ }
41
+ // Display overall readiness status
42
+ console.log('╔════════════════════════════════════════════════════════════╗');
43
+ if (allPassed) {
44
+ console.log('║ ✓ System is ready ║');
45
+ console.log('║ ║');
46
+ console.log('║ You can now run `cig install` to set up CIG. ║');
47
+ }
48
+ else {
49
+ console.log('║ ✗ System is not ready ║');
50
+ console.log('║ ║');
51
+ console.log('║ Please address the issues above and run `cig doctor` ║');
52
+ console.log('║ again to verify. ║');
53
+ }
54
+ console.log('╚════════════════════════════════════════════════════════════╝\n');
55
+ process.exit(allPassed ? 0 : 1);
56
+ }
57
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAIH,wBAkDC;AApDD,8CAA6C;AAEtC,KAAK,UAAU,MAAM;IAC1B,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAY,GAAE,CAAC;IAErC,MAAM,UAAU,GAAG;QACjB,eAAe;QACf,sBAAsB;QACtB,qBAAqB;QACrB,0BAA0B;QAC1B,mBAAmB;KACpB,CAAC;IAEF,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,eAAe;QAC5E,MAAM,UAAU,GAAG,SAAS,CAAC;QAE7B,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACpD,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAEhF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface EnrollCommandOptions {
2
+ apiUrl: string;
3
+ profile?: 'core' | 'full';
4
+ token?: string;
5
+ }
6
+ export declare function enroll(options: EnrollCommandOptions): Promise<void>;
7
+ //# sourceMappingURL=enroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enroll.d.ts","sourceRoot":"","sources":["../../src/commands/enroll.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzE"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enroll = enroll;
4
+ const enrollment_js_1 = require("./enrollment.js");
5
+ async function enroll(options) {
6
+ const { identity } = await (0, enrollment_js_1.enrollmentFlow)({
7
+ apiUrl: options.apiUrl,
8
+ profile: options.profile,
9
+ enrollmentToken: options.token,
10
+ });
11
+ console.log(`✓ Node enrolled successfully as ${identity.targetId}`);
12
+ }
13
+ //# sourceMappingURL=enroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enroll.js","sourceRoot":"","sources":["../../src/commands/enroll.ts"],"names":[],"mappings":";;AAQA,wBAQC;AAhBD,mDAAiD;AAQ1C,KAAK,UAAU,MAAM,CAAC,OAA6B;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,8BAAc,EAAC;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,KAAK;KAC/B,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,mCAAmC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { InstallManifest } from '../compose-generator.js';
2
+ import { TargetIdentity } from '../credentials.js';
3
+ export interface EnrollmentFlowOptions {
4
+ apiUrl: string;
5
+ profile?: 'core' | 'full';
6
+ enrollmentToken?: string;
7
+ }
8
+ export declare function enrollmentFlow(options: EnrollmentFlowOptions): Promise<{
9
+ manifest: InstallManifest;
10
+ identity: TargetIdentity;
11
+ }>;
12
+ //# sourceMappingURL=enrollment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrollment.d.ts","sourceRoot":"","sources":["../../src/commands/enrollment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAqB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA0BtE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiCD,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC5E,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC,CA8CD"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.enrollmentFlow = enrollmentFlow;
37
+ const os = __importStar(require("node:os"));
38
+ const credentials_js_1 = require("../credentials.js");
39
+ const api_client_js_1 = require("../services/api-client.js");
40
+ const crypto_js_1 = require("../utils/crypto.js");
41
+ function getPrimaryIpAddress() {
42
+ const interfaces = os.networkInterfaces();
43
+ for (const name of Object.keys(interfaces)) {
44
+ const ifaces = interfaces[name];
45
+ if (!ifaces)
46
+ continue;
47
+ for (const iface of ifaces) {
48
+ if (iface.family === 'IPv4' && !iface.internal) {
49
+ return iface.address;
50
+ }
51
+ }
52
+ }
53
+ return '127.0.0.1';
54
+ }
55
+ async function requestEnrollmentToken(apiClient) {
56
+ const response = await apiClient.post('/api/v1/targets/enrollment-token');
57
+ return response.enrollment_token;
58
+ }
59
+ function createTargetIdentity(targetId) {
60
+ const keyPair = (0, crypto_js_1.generateEd25519KeyPair)();
61
+ return {
62
+ targetId,
63
+ publicKey: keyPair.publicKey,
64
+ privateKey: keyPair.privateKey,
65
+ enrolledAt: new Date().toISOString(),
66
+ };
67
+ }
68
+ async function enrollmentFlow(options) {
69
+ const credentialManager = new credentials_js_1.CredentialManager();
70
+ const apiClient = new api_client_js_1.ApiClient({ baseUrl: options.apiUrl, accessToken: credentialManager.loadTokens()?.accessToken });
71
+ const profile = options.profile ?? 'core';
72
+ const enrollmentToken = options.enrollmentToken ?? await requestEnrollmentToken(apiClient);
73
+ console.log('Enrolling target...');
74
+ const provisionalIdentity = createTargetIdentity('pending');
75
+ const enrollResponse = await apiClient.post('/api/v1/targets/enroll', {
76
+ enrollment_token: enrollmentToken,
77
+ hostname: os.hostname(),
78
+ os: os.platform(),
79
+ architecture: os.arch(),
80
+ ip_address: getPrimaryIpAddress(),
81
+ profile,
82
+ public_key: provisionalIdentity.publicKey,
83
+ });
84
+ const identity = {
85
+ ...provisionalIdentity,
86
+ targetId: enrollResponse.target_id,
87
+ enrolledAt: enrollResponse.enrolled_at ?? new Date().toISOString(),
88
+ };
89
+ credentialManager.saveIdentity(identity);
90
+ const manifest = await apiClient.get(`/api/v1/targets/install-manifest?target_id=${encodeURIComponent(identity.targetId)}&profile=${profile}`);
91
+ return {
92
+ identity,
93
+ manifest: {
94
+ profile: manifest.profile,
95
+ services: manifest.services,
96
+ env_overrides: manifest.env_overrides,
97
+ node_identity: {
98
+ target_id: identity.targetId,
99
+ public_key: identity.publicKey,
100
+ private_key: identity.privateKey,
101
+ },
102
+ generated_secrets: manifest.generated_secrets,
103
+ },
104
+ };
105
+ }
106
+ //# sourceMappingURL=enrollment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrollment.js","sourceRoot":"","sources":["../../src/commands/enrollment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function install(apiUrl?: string, mode?: 'managed' | 'self-hosted', profile?: 'core' | 'full'): Promise<void>;
2
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAsGA,wBAAsB,OAAO,CAC3B,MAAM,SAA0B,EAChC,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,EAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Gf"}