@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":";;AAEA,0BAUC;AAZD,mEAA4D;AAErD,KAAK,UAAU,OAAO;IAC3B,MAAM,YAAY,GAAG,IAAI,+BAAY,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;AACvG,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Docker Compose Generator for CIG Installation
3
+ *
4
+ * Generates docker-compose.yml and .env files from InstallManifest.
5
+ * Requirement 7: CLI Install Flow (Compose Generation)
6
+ */
7
+ export interface InstallManifest {
8
+ profile: 'core' | 'full';
9
+ services: string[];
10
+ env_overrides?: Record<string, string>;
11
+ node_identity?: {
12
+ target_id: string;
13
+ private_key: string;
14
+ public_key: string;
15
+ };
16
+ generated_secrets?: Record<string, string>;
17
+ }
18
+ /**
19
+ * Generate docker-compose.yml and .env files from InstallManifest.
20
+ * Writes .env with permissions 0600 for security.
21
+ */
22
+ export declare function generateCompose(manifest: InstallManifest, outputDir: string): Promise<void>;
23
+ //# sourceMappingURL=compose-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-generator.d.ts","sourceRoot":"","sources":["../src/compose-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAyLD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBjG"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * Docker Compose Generator for CIG Installation
4
+ *
5
+ * Generates docker-compose.yml and .env files from InstallManifest.
6
+ * Requirement 7: CLI Install Flow (Compose Generation)
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.generateCompose = generateCompose;
43
+ const crypto = __importStar(require("crypto"));
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ /**
47
+ * Generate a cryptographically random secret of specified length.
48
+ * Uses crypto.randomBytes for secure random generation.
49
+ */
50
+ function generateSecret(length = 32) {
51
+ return crypto.randomBytes(length).toString('hex');
52
+ }
53
+ /**
54
+ * Generate environment variables for services.
55
+ * Includes service-specific secrets and any overrides from manifest.
56
+ */
57
+ function generateEnvVars(manifest) {
58
+ const env = {};
59
+ // Generate secrets for each service
60
+ for (const service of manifest.services) {
61
+ const secretKey = `${service.toUpperCase()}_SECRET`;
62
+ env[secretKey] = generateSecret(32);
63
+ }
64
+ // Add node identity if present
65
+ if (manifest.node_identity) {
66
+ env['NODE_TARGET_ID'] = manifest.node_identity.target_id;
67
+ env['NODE_PUBLIC_KEY'] = manifest.node_identity.public_key;
68
+ env['NODE_PRIVATE_KEY'] = manifest.node_identity.private_key;
69
+ }
70
+ // Apply any environment overrides
71
+ if (manifest.env_overrides) {
72
+ Object.assign(env, manifest.env_overrides);
73
+ }
74
+ return env;
75
+ }
76
+ /**
77
+ * Generate service configuration for docker-compose.yml.
78
+ */
79
+ function generateServiceConfig(serviceName, profile) {
80
+ const configs = {
81
+ core: {
82
+ api: {
83
+ image: 'cig/api:latest',
84
+ ports: ['8000:8000'],
85
+ environment: {
86
+ PORT: '8000',
87
+ LOG_LEVEL: 'info',
88
+ },
89
+ healthcheck: {
90
+ test: ['CMD', 'curl', '-f', 'http://localhost:8000/health'],
91
+ interval: '10s',
92
+ timeout: '5s',
93
+ retries: 3,
94
+ },
95
+ },
96
+ neo4j: {
97
+ image: 'neo4j:5.0',
98
+ ports: ['7474:7474', '7687:7687'],
99
+ environment: {
100
+ NEO4J_AUTH: 'neo4j/password',
101
+ },
102
+ volumes: ['neo4j_data:/data'],
103
+ healthcheck: {
104
+ test: ['CMD', 'cypher-shell', '-u', 'neo4j', '-p', 'password', 'RETURN 1'],
105
+ interval: '10s',
106
+ timeout: '5s',
107
+ retries: 3,
108
+ },
109
+ },
110
+ },
111
+ full: {
112
+ dashboard: {
113
+ image: 'cig/dashboard:latest',
114
+ ports: ['3000:3000'],
115
+ environment: {
116
+ PORT: '3000',
117
+ },
118
+ healthcheck: {
119
+ test: ['CMD', 'curl', '-f', 'http://localhost:3000/health'],
120
+ interval: '10s',
121
+ timeout: '5s',
122
+ retries: 3,
123
+ },
124
+ },
125
+ discovery: {
126
+ image: 'cig/discovery:latest',
127
+ ports: ['8080:8080'],
128
+ environment: {
129
+ PORT: '8080',
130
+ },
131
+ healthcheck: {
132
+ test: ['CMD', 'curl', '-f', 'http://localhost:8080/health'],
133
+ interval: '10s',
134
+ timeout: '5s',
135
+ retries: 3,
136
+ },
137
+ },
138
+ cartography: {
139
+ image: 'cig/cartography:latest',
140
+ environment: {
141
+ LOG_LEVEL: 'info',
142
+ },
143
+ depends_on: {
144
+ neo4j: { condition: 'service_healthy' },
145
+ },
146
+ },
147
+ },
148
+ };
149
+ // Return service config or a minimal default
150
+ const profileConfigs = configs[profile] || {};
151
+ return (profileConfigs[serviceName] || {
152
+ image: `cig/${serviceName}:latest`,
153
+ environment: {},
154
+ });
155
+ }
156
+ /**
157
+ * Generate docker-compose.yml content.
158
+ */
159
+ function generateComposeYml(manifest) {
160
+ const services = {};
161
+ const volumes = {};
162
+ for (const service of manifest.services) {
163
+ const config = generateServiceConfig(service, manifest.profile);
164
+ services[service] = config;
165
+ // Collect volume definitions
166
+ if (config.volumes) {
167
+ for (const volume of config.volumes) {
168
+ const volumeName = volume.split(':')[0];
169
+ if (!volumeName.includes('/')) {
170
+ volumes[volumeName] = {};
171
+ }
172
+ }
173
+ }
174
+ }
175
+ const compose = {
176
+ version: '3.8',
177
+ services,
178
+ };
179
+ if (Object.keys(volumes).length > 0) {
180
+ compose.volumes = volumes;
181
+ }
182
+ return compose;
183
+ }
184
+ /**
185
+ * Format environment variables as .env file content.
186
+ */
187
+ function formatEnvFile(env) {
188
+ return Object.entries(env)
189
+ .map(([key, value]) => `${key}=${value}`)
190
+ .join('\n');
191
+ }
192
+ /**
193
+ * Generate docker-compose.yml and .env files from InstallManifest.
194
+ * Writes .env with permissions 0600 for security.
195
+ */
196
+ async function generateCompose(manifest, outputDir) {
197
+ // Ensure output directory exists
198
+ if (!fs.existsSync(outputDir)) {
199
+ fs.mkdirSync(outputDir, { recursive: true, mode: 0o700 });
200
+ }
201
+ // Generate environment variables
202
+ const envVars = generateEnvVars(manifest);
203
+ // Generate docker-compose.yml
204
+ const composeConfig = generateComposeYml(manifest);
205
+ const composeYml = JSON.stringify(composeConfig, null, 2);
206
+ // Write docker-compose.yml
207
+ const composePath = path.join(outputDir, 'docker-compose.yml');
208
+ fs.writeFileSync(composePath, composeYml, { mode: 0o644 });
209
+ // Write .env with restricted permissions (0600)
210
+ const envPath = path.join(outputDir, '.env');
211
+ const envContent = formatEnvFile(envVars);
212
+ fs.writeFileSync(envPath, envContent, { mode: 0o600 });
213
+ }
214
+ //# sourceMappingURL=compose-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-generator.js","sourceRoot":"","sources":["../src/compose-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { CliPathOptions } from './storage/paths.js';
2
+ import { CliSecretStore } from './stores/cli-secret-store.js';
3
+ export interface AuthTokens {
4
+ accessToken: string;
5
+ refreshToken: string;
6
+ expiresAt: number;
7
+ refreshExpiresAt: number;
8
+ }
9
+ export interface TargetIdentity {
10
+ targetId: string;
11
+ publicKey: string;
12
+ privateKey: string;
13
+ enrolledAt: string;
14
+ }
15
+ export interface BootstrapToken {
16
+ token: string;
17
+ createdAt: string;
18
+ expiresAt: string;
19
+ }
20
+ export interface Credential {
21
+ type: 'aws' | 'gcp';
22
+ value: string;
23
+ createdAt: string;
24
+ rotateAfterDays: number;
25
+ }
26
+ export interface EncryptedCredential {
27
+ iv: string;
28
+ tag: string;
29
+ data: string;
30
+ createdAt: string;
31
+ rotateAfterDays: number;
32
+ type: 'aws' | 'gcp';
33
+ }
34
+ export interface CredentialManagerOptions {
35
+ paths?: CliPathOptions;
36
+ encryptionSeed?: string;
37
+ secretStore?: CliSecretStore;
38
+ }
39
+ export declare class CredentialManager {
40
+ private readonly configDir;
41
+ private readonly configFile;
42
+ private readonly encryptionKey;
43
+ private readonly secretStore;
44
+ constructor(options?: CredentialManagerOptions);
45
+ private encrypt;
46
+ private decrypt;
47
+ private readConfig;
48
+ private writeConfig;
49
+ save(type: 'aws' | 'gcp', value: string, rotateAfterDays?: number): void;
50
+ load(type: 'aws' | 'gcp'): string | null;
51
+ isRotationDue(type: 'aws' | 'gcp'): boolean;
52
+ delete(type: 'aws' | 'gcp'): void;
53
+ list(): Array<{
54
+ type: string;
55
+ createdAt: string;
56
+ rotationDue: boolean;
57
+ }>;
58
+ saveTokens(tokens: AuthTokens): void;
59
+ loadTokens(): AuthTokens | null;
60
+ needsRefresh(tokens: AuthTokens): boolean;
61
+ isRefreshTokenValid(tokens: AuthTokens): boolean;
62
+ saveIdentity(identity: TargetIdentity): void;
63
+ loadIdentity(): TargetIdentity | null;
64
+ saveBootstrapToken(bootstrapToken: BootstrapToken): void;
65
+ loadBootstrapToken(): BootstrapToken | null;
66
+ clearAll(): void;
67
+ }
68
+ export declare function createTempCredentialManager(tmpDir: string): CredentialManager;
69
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAmB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;CACrB;AAMD,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,cAAc,CAAC;CAC9B;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;gBAEjC,OAAO,GAAE,wBAA6B;IAUlD,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAOnB,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,SAAK,GAAG,IAAI;IAkBpE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI;IAOxC,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO;IAU3C,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI;IAOjC,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IASxE,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIpC,UAAU,IAAI,UAAU,GAAG,IAAI;IAI/B,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAIzC,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAIhD,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI5C,YAAY,IAAI,cAAc,GAAG,IAAI;IAIrC,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAIxD,kBAAkB,IAAI,cAAc,GAAG,IAAI;IAI3C,QAAQ,IAAI,IAAI;CAIjB;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQ7E"}
@@ -0,0 +1,178 @@
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.CredentialManager = void 0;
37
+ exports.createTempCredentialManager = createTempCredentialManager;
38
+ const crypto = __importStar(require("node:crypto"));
39
+ const fs = __importStar(require("node:fs"));
40
+ const os = __importStar(require("node:os"));
41
+ const path = __importStar(require("node:path"));
42
+ const paths_js_1 = require("./storage/paths.js");
43
+ const cli_secret_store_js_1 = require("./stores/cli-secret-store.js");
44
+ class CredentialManager {
45
+ configDir;
46
+ configFile;
47
+ encryptionKey;
48
+ secretStore;
49
+ constructor(options = {}) {
50
+ const paths = (0, paths_js_1.resolveCliPaths)(options.paths);
51
+ this.configDir = paths.configDir;
52
+ this.configFile = paths.credentialsFile;
53
+ const seed = options.encryptionSeed ?? `${os.hostname()}:${os.userInfo().username}`;
54
+ this.encryptionKey = crypto.createHash('sha256').update(seed).digest();
55
+ this.secretStore =
56
+ options.secretStore ?? new cli_secret_store_js_1.CliSecretStore({ paths: options.paths, encryptionSeed: seed });
57
+ }
58
+ encrypt(plaintext) {
59
+ const iv = crypto.randomBytes(12);
60
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey, iv);
61
+ const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
62
+ const tag = cipher.getAuthTag();
63
+ return {
64
+ iv: iv.toString('hex'),
65
+ tag: tag.toString('hex'),
66
+ data: encrypted.toString('hex'),
67
+ };
68
+ }
69
+ decrypt(encrypted) {
70
+ const iv = Buffer.from(encrypted.iv, 'hex');
71
+ const tag = Buffer.from(encrypted.tag, 'hex');
72
+ const data = Buffer.from(encrypted.data, 'hex');
73
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey, iv);
74
+ decipher.setAuthTag(tag);
75
+ return Buffer.concat([decipher.update(data), decipher.final()]).toString('utf8');
76
+ }
77
+ readConfig() {
78
+ if (!fs.existsSync(this.configFile)) {
79
+ return { credentials: {} };
80
+ }
81
+ const raw = fs.readFileSync(this.configFile, 'utf8');
82
+ return JSON.parse(raw);
83
+ }
84
+ writeConfig(config) {
85
+ if (!fs.existsSync(this.configDir)) {
86
+ fs.mkdirSync(this.configDir, { mode: 0o700, recursive: true });
87
+ }
88
+ fs.writeFileSync(this.configFile, JSON.stringify(config, null, 2), { mode: 0o600 });
89
+ }
90
+ save(type, value, rotateAfterDays = 90) {
91
+ if (!value || value.trim() === '') {
92
+ throw new Error('Credential value must not be empty');
93
+ }
94
+ const { iv, tag, data } = this.encrypt(value);
95
+ const config = this.readConfig();
96
+ config.credentials[type] = {
97
+ iv,
98
+ tag,
99
+ data,
100
+ createdAt: new Date().toISOString(),
101
+ rotateAfterDays,
102
+ type,
103
+ };
104
+ this.writeConfig(config);
105
+ console.log(`Credential saved for type: ${type}`);
106
+ }
107
+ load(type) {
108
+ const config = this.readConfig();
109
+ const entry = config.credentials[type];
110
+ if (!entry)
111
+ return null;
112
+ return this.decrypt({ iv: entry.iv, tag: entry.tag, data: entry.data });
113
+ }
114
+ isRotationDue(type) {
115
+ const config = this.readConfig();
116
+ const entry = config.credentials[type];
117
+ if (!entry)
118
+ return false;
119
+ const created = new Date(entry.createdAt).getTime();
120
+ const ageMs = Date.now() - created;
121
+ const thresholdMs = entry.rotateAfterDays * 24 * 60 * 60 * 1000;
122
+ return ageMs >= thresholdMs;
123
+ }
124
+ delete(type) {
125
+ const config = this.readConfig();
126
+ delete config.credentials[type];
127
+ this.writeConfig(config);
128
+ console.log(`Credential deleted for type: ${type}`);
129
+ }
130
+ list() {
131
+ const config = this.readConfig();
132
+ return Object.values(config.credentials).map((entry) => ({
133
+ type: entry.type,
134
+ createdAt: entry.createdAt,
135
+ rotationDue: this.isRotationDue(entry.type),
136
+ }));
137
+ }
138
+ saveTokens(tokens) {
139
+ this.secretStore.set('auth.tokens', tokens);
140
+ }
141
+ loadTokens() {
142
+ return this.secretStore.get('auth.tokens');
143
+ }
144
+ needsRefresh(tokens) {
145
+ return tokens.expiresAt < Date.now() + 5 * 60 * 1000;
146
+ }
147
+ isRefreshTokenValid(tokens) {
148
+ return tokens.refreshExpiresAt > Date.now();
149
+ }
150
+ saveIdentity(identity) {
151
+ this.secretStore.set('node.identity', identity);
152
+ }
153
+ loadIdentity() {
154
+ return this.secretStore.get('node.identity');
155
+ }
156
+ saveBootstrapToken(bootstrapToken) {
157
+ this.secretStore.set('bootstrap.token', bootstrapToken);
158
+ }
159
+ loadBootstrapToken() {
160
+ return this.secretStore.get('bootstrap.token');
161
+ }
162
+ clearAll() {
163
+ this.secretStore.clear();
164
+ if (fs.existsSync(this.configFile))
165
+ fs.unlinkSync(this.configFile);
166
+ }
167
+ }
168
+ exports.CredentialManager = CredentialManager;
169
+ function createTempCredentialManager(tmpDir) {
170
+ return new CredentialManager({
171
+ paths: {
172
+ configDir: path.join(tmpDir, 'config'),
173
+ installDir: path.join(tmpDir, 'install'),
174
+ },
175
+ encryptionSeed: 'test-seed',
176
+ });
177
+ }
178
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}