buildhive-agent 1.0.0-beta.1

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 (170) hide show
  1. package/README.md +166 -0
  2. package/dist/__tests__/fakes/FakeDockerManager.d.ts +115 -0
  3. package/dist/__tests__/fakes/FakeDockerManager.d.ts.map +1 -0
  4. package/dist/__tests__/fakes/FakeDockerManager.js +203 -0
  5. package/dist/__tests__/fakes/FakeDockerManager.js.map +1 -0
  6. package/dist/acceptanceChecker.d.ts +26 -0
  7. package/dist/acceptanceChecker.d.ts.map +1 -0
  8. package/dist/acceptanceChecker.js +64 -0
  9. package/dist/acceptanceChecker.js.map +1 -0
  10. package/dist/advancedAgent.d.ts +161 -0
  11. package/dist/advancedAgent.d.ts.map +1 -0
  12. package/dist/advancedAgent.js +604 -0
  13. package/dist/advancedAgent.js.map +1 -0
  14. package/dist/agent.d.ts +101 -0
  15. package/dist/agent.d.ts.map +1 -0
  16. package/dist/agent.js +490 -0
  17. package/dist/agent.js.map +1 -0
  18. package/dist/api/jobStatusApi.d.ts +88 -0
  19. package/dist/api/jobStatusApi.d.ts.map +1 -0
  20. package/dist/api/jobStatusApi.js +240 -0
  21. package/dist/api/jobStatusApi.js.map +1 -0
  22. package/dist/autoUpdater.d.ts +135 -0
  23. package/dist/autoUpdater.d.ts.map +1 -0
  24. package/dist/autoUpdater.js +494 -0
  25. package/dist/autoUpdater.js.map +1 -0
  26. package/dist/cacheManager.d.ts +108 -0
  27. package/dist/cacheManager.d.ts.map +1 -0
  28. package/dist/cacheManager.js +300 -0
  29. package/dist/cacheManager.js.map +1 -0
  30. package/dist/cli.d.ts +11 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +749 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/config/index.d.ts +30 -0
  35. package/dist/config/index.d.ts.map +1 -0
  36. package/dist/config/index.js +35 -0
  37. package/dist/config/index.js.map +1 -0
  38. package/dist/config/loader.d.ts +45 -0
  39. package/dist/config/loader.d.ts.map +1 -0
  40. package/dist/config/loader.js +269 -0
  41. package/dist/config/loader.js.map +1 -0
  42. package/dist/config/types.d.ts +193 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +90 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/config/validation.d.ts +28 -0
  47. package/dist/config/validation.d.ts.map +1 -0
  48. package/dist/config/validation.js +397 -0
  49. package/dist/config/validation.js.map +1 -0
  50. package/dist/docker.d.ts +96 -0
  51. package/dist/docker.d.ts.map +1 -0
  52. package/dist/docker.js +411 -0
  53. package/dist/docker.js.map +1 -0
  54. package/dist/enhancedJobExecutor.d.ts +81 -0
  55. package/dist/enhancedJobExecutor.d.ts.map +1 -0
  56. package/dist/enhancedJobExecutor.js +223 -0
  57. package/dist/enhancedJobExecutor.js.map +1 -0
  58. package/dist/executors/executorFactory.d.ts +46 -0
  59. package/dist/executors/executorFactory.d.ts.map +1 -0
  60. package/dist/executors/executorFactory.js +80 -0
  61. package/dist/executors/executorFactory.js.map +1 -0
  62. package/dist/executors/index.d.ts +7 -0
  63. package/dist/executors/index.d.ts.map +1 -0
  64. package/dist/executors/index.js +6 -0
  65. package/dist/executors/index.js.map +1 -0
  66. package/dist/executors/nativeExecutor.d.ts +60 -0
  67. package/dist/executors/nativeExecutor.d.ts.map +1 -0
  68. package/dist/executors/nativeExecutor.js +311 -0
  69. package/dist/executors/nativeExecutor.js.map +1 -0
  70. package/dist/executors/types.d.ts +38 -0
  71. package/dist/executors/types.d.ts.map +1 -0
  72. package/dist/executors/types.js +9 -0
  73. package/dist/executors/types.js.map +1 -0
  74. package/dist/healthMonitor.d.ts +213 -0
  75. package/dist/healthMonitor.d.ts.map +1 -0
  76. package/dist/healthMonitor.js +547 -0
  77. package/dist/healthMonitor.js.map +1 -0
  78. package/dist/index.d.ts +16 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +16 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/jobExecutor.d.ts +117 -0
  83. package/dist/jobExecutor.d.ts.map +1 -0
  84. package/dist/jobExecutor.js +458 -0
  85. package/dist/jobExecutor.js.map +1 -0
  86. package/dist/lifecycleExecutor.d.ts +54 -0
  87. package/dist/lifecycleExecutor.d.ts.map +1 -0
  88. package/dist/lifecycleExecutor.js +230 -0
  89. package/dist/lifecycleExecutor.js.map +1 -0
  90. package/dist/main.d.ts +15 -0
  91. package/dist/main.d.ts.map +1 -0
  92. package/dist/main.js +77 -0
  93. package/dist/main.js.map +1 -0
  94. package/dist/metrics.d.ts +103 -0
  95. package/dist/metrics.d.ts.map +1 -0
  96. package/dist/metrics.js +360 -0
  97. package/dist/metrics.js.map +1 -0
  98. package/dist/recipes/builtinRecipes.d.ts +11 -0
  99. package/dist/recipes/builtinRecipes.d.ts.map +1 -0
  100. package/dist/recipes/builtinRecipes.js +688 -0
  101. package/dist/recipes/builtinRecipes.js.map +1 -0
  102. package/dist/recipes/index.d.ts +18 -0
  103. package/dist/recipes/index.d.ts.map +1 -0
  104. package/dist/recipes/index.js +17 -0
  105. package/dist/recipes/index.js.map +1 -0
  106. package/dist/recipes/recipeRegistry.d.ts +49 -0
  107. package/dist/recipes/recipeRegistry.d.ts.map +1 -0
  108. package/dist/recipes/recipeRegistry.js +264 -0
  109. package/dist/recipes/recipeRegistry.js.map +1 -0
  110. package/dist/recipes/types.d.ts +116 -0
  111. package/dist/recipes/types.d.ts.map +1 -0
  112. package/dist/recipes/types.js +10 -0
  113. package/dist/recipes/types.js.map +1 -0
  114. package/dist/recovery.d.ts +133 -0
  115. package/dist/recovery.d.ts.map +1 -0
  116. package/dist/recovery.js +299 -0
  117. package/dist/recovery.js.map +1 -0
  118. package/dist/registration/apiClient.d.ts +44 -0
  119. package/dist/registration/apiClient.d.ts.map +1 -0
  120. package/dist/registration/apiClient.js +149 -0
  121. package/dist/registration/apiClient.js.map +1 -0
  122. package/dist/registration/index.d.ts +41 -0
  123. package/dist/registration/index.d.ts.map +1 -0
  124. package/dist/registration/index.js +141 -0
  125. package/dist/registration/index.js.map +1 -0
  126. package/dist/registration/machineId.d.ts +30 -0
  127. package/dist/registration/machineId.d.ts.map +1 -0
  128. package/dist/registration/machineId.js +89 -0
  129. package/dist/registration/machineId.js.map +1 -0
  130. package/dist/registration/types.d.ts +32 -0
  131. package/dist/registration/types.d.ts.map +1 -0
  132. package/dist/registration/types.js +9 -0
  133. package/dist/registration/types.js.map +1 -0
  134. package/dist/resourceGovernor.d.ts +57 -0
  135. package/dist/resourceGovernor.d.ts.map +1 -0
  136. package/dist/resourceGovernor.js +125 -0
  137. package/dist/resourceGovernor.js.map +1 -0
  138. package/dist/security/secretManager.d.ts +107 -0
  139. package/dist/security/secretManager.d.ts.map +1 -0
  140. package/dist/security/secretManager.js +361 -0
  141. package/dist/security/secretManager.js.map +1 -0
  142. package/dist/security.d.ts +134 -0
  143. package/dist/security.d.ts.map +1 -0
  144. package/dist/security.js +470 -0
  145. package/dist/security.js.map +1 -0
  146. package/dist/storage/artifactUploader.d.ts +155 -0
  147. package/dist/storage/artifactUploader.d.ts.map +1 -0
  148. package/dist/storage/artifactUploader.js +554 -0
  149. package/dist/storage/artifactUploader.js.map +1 -0
  150. package/dist/types.d.ts +49 -0
  151. package/dist/types.d.ts.map +1 -0
  152. package/dist/types.js +7 -0
  153. package/dist/types.js.map +1 -0
  154. package/dist/utils/capabilities.d.ts +23 -0
  155. package/dist/utils/capabilities.d.ts.map +1 -0
  156. package/dist/utils/capabilities.js +200 -0
  157. package/dist/utils/capabilities.js.map +1 -0
  158. package/dist/utils/logger.d.ts +20 -0
  159. package/dist/utils/logger.d.ts.map +1 -0
  160. package/dist/utils/logger.js +188 -0
  161. package/dist/utils/logger.js.map +1 -0
  162. package/dist/utils/sdkScanner.d.ts +105 -0
  163. package/dist/utils/sdkScanner.d.ts.map +1 -0
  164. package/dist/utils/sdkScanner.js +459 -0
  165. package/dist/utils/sdkScanner.js.map +1 -0
  166. package/dist/websocketClient.d.ts +154 -0
  167. package/dist/websocketClient.d.ts.map +1 -0
  168. package/dist/websocketClient.js +422 -0
  169. package/dist/websocketClient.js.map +1 -0
  170. package/package.json +64 -0
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Capabilities Detection
3
+ *
4
+ * Detects system capabilities for agent registration using systeminformation library
5
+ * for accurate cross-platform system metrics.
6
+ *
7
+ * Requirements: MVP.4.1.2
8
+ */
9
+ import os from 'os';
10
+ import si from 'systeminformation';
11
+ import { exec } from 'child_process';
12
+ import { promisify } from 'util';
13
+ import { createLogger } from './logger.js';
14
+ import { scanInstalledSDKs, generateTagsFromSDKs } from './sdkScanner.js';
15
+ const execAsync = promisify(exec);
16
+ const logger = createLogger('capabilities');
17
+ /**
18
+ * Detect system capabilities with systeminformation
19
+ */
20
+ export async function detectCapabilities() {
21
+ logger.info('Detecting system capabilities using systeminformation...');
22
+ try {
23
+ // Gather all system information in parallel
24
+ const [cpu, mem, osInfo, disk, dockerVersion] = await Promise.all([
25
+ si.cpu(),
26
+ si.mem(),
27
+ si.osInfo(),
28
+ si.fsSize(),
29
+ detectDockerVersion(),
30
+ ]);
31
+ const capabilities = {
32
+ os: normalizeOsName(osInfo.platform),
33
+ arch: normalizeArchitecture(osInfo.arch),
34
+ cpuCores: cpu.physicalCores || cpu.cores,
35
+ memoryGB: Math.round(mem.total / (1024 * 1024 * 1024)),
36
+ diskSpaceGB: Math.round((disk[0]?.size || 0) / (1024 * 1024 * 1024)),
37
+ };
38
+ if (dockerVersion) {
39
+ capabilities.dockerVersion = dockerVersion;
40
+ }
41
+ logger.info('Detected system capabilities:', capabilities);
42
+ return capabilities;
43
+ }
44
+ catch (error) {
45
+ logger.error('Failed to detect capabilities, using fallback:', error);
46
+ // Fallback to basic os module if systeminformation fails
47
+ return detectCapabilitiesFallback();
48
+ }
49
+ }
50
+ /**
51
+ * Fallback capability detection using Node.js os module
52
+ */
53
+ function detectCapabilitiesFallback() {
54
+ logger.warn('Using fallback capability detection');
55
+ const capabilities = {
56
+ os: getOperatingSystem(),
57
+ arch: getArchitecture(),
58
+ cpuCores: getCpuCores(),
59
+ memoryGB: getMemoryGB(),
60
+ diskSpaceGB: 100, // Fallback value
61
+ };
62
+ // Try to detect Docker version asynchronously
63
+ detectDockerVersion()
64
+ .then(version => {
65
+ if (version) {
66
+ capabilities.dockerVersion = version;
67
+ }
68
+ })
69
+ .catch(() => {
70
+ // Ignore errors in fallback
71
+ });
72
+ return capabilities;
73
+ }
74
+ /**
75
+ * Normalize OS name to standard format
76
+ */
77
+ function normalizeOsName(platform) {
78
+ const normalized = platform.toLowerCase();
79
+ if (normalized.includes('darwin') || normalized.includes('mac')) {
80
+ return 'macos';
81
+ }
82
+ else if (normalized.includes('win')) {
83
+ return 'windows';
84
+ }
85
+ else if (normalized.includes('linux')) {
86
+ return 'linux';
87
+ }
88
+ return normalized;
89
+ }
90
+ /**
91
+ * Normalize architecture to standard format
92
+ */
93
+ function normalizeArchitecture(arch) {
94
+ const normalized = arch.toLowerCase();
95
+ if (normalized.includes('x64') || normalized.includes('amd64')) {
96
+ return 'x64';
97
+ }
98
+ else if (normalized.includes('arm64') || normalized.includes('aarch64')) {
99
+ return 'arm64';
100
+ }
101
+ else if (normalized.includes('arm')) {
102
+ return 'arm';
103
+ }
104
+ return normalized;
105
+ }
106
+ /**
107
+ * Get operating system
108
+ */
109
+ function getOperatingSystem() {
110
+ const platform = os.platform();
111
+ switch (platform) {
112
+ case 'darwin':
113
+ return 'macos';
114
+ case 'linux':
115
+ return 'linux';
116
+ case 'win32':
117
+ return 'windows';
118
+ default:
119
+ return platform;
120
+ }
121
+ }
122
+ /**
123
+ * Get system architecture
124
+ */
125
+ function getArchitecture() {
126
+ const arch = os.arch();
127
+ switch (arch) {
128
+ case 'x64':
129
+ return 'x64';
130
+ case 'arm64':
131
+ return 'arm64';
132
+ case 'arm':
133
+ return 'arm';
134
+ default:
135
+ return arch;
136
+ }
137
+ }
138
+ /**
139
+ * Get CPU core count
140
+ */
141
+ function getCpuCores() {
142
+ return os.cpus().length;
143
+ }
144
+ /**
145
+ * Get total memory in GB
146
+ */
147
+ function getMemoryGB() {
148
+ const totalMemory = os.totalmem();
149
+ return Math.round(totalMemory / (1024 * 1024 * 1024));
150
+ }
151
+ /**
152
+ * Get available disk space in GB
153
+ */
154
+ function getDiskSpaceGB() {
155
+ // This is a simplified implementation
156
+ // In a real scenario, you'd want to check the actual disk space
157
+ // For now, we'll return a reasonable default
158
+ return 100; // GB
159
+ }
160
+ /**
161
+ * Detect Docker version
162
+ */
163
+ async function detectDockerVersion() {
164
+ try {
165
+ const { stdout } = await execAsync('docker --version');
166
+ const match = stdout.match(/Docker version ([^,\s]+)/);
167
+ return match ? match[1] : null;
168
+ }
169
+ catch (error) {
170
+ return null;
171
+ }
172
+ }
173
+ /**
174
+ * Detect detailed capabilities including SDK/toolchain information and
175
+ * auto-generated tags. This extends the basic {@link detectCapabilities}
176
+ * with an SDK scan and tag generation pass.
177
+ *
178
+ * @param manualTags - Optional tags supplied by the user configuration that
179
+ * will be merged (and deduplicated) with auto-detected tags.
180
+ */
181
+ export async function detectDetailedCapabilities(manualTags = []) {
182
+ logger.info('Detecting detailed capabilities (base + SDKs)...');
183
+ // Gather base capabilities and SDK scan in parallel
184
+ const [base, sdks] = await Promise.all([
185
+ detectCapabilities(),
186
+ scanInstalledSDKs(),
187
+ ]);
188
+ const autoTags = generateTagsFromSDKs(sdks);
189
+ // Merge platform tags (os, arch) with SDK tags and manual tags
190
+ const platformTags = [base.os, base.arch].filter(Boolean);
191
+ const allTags = [...new Set([...platformTags, ...autoTags, ...manualTags])];
192
+ const detailed = {
193
+ ...base,
194
+ sdks,
195
+ tags: allTags,
196
+ };
197
+ logger.info(`Detailed capabilities: ${allTags.length} tags generated`);
198
+ return detailed;
199
+ }
200
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/utils/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Logger Utility
3
+ *
4
+ * File-based + console logging with rotation for the BuildHive agent.
5
+ * Writes structured JSON to ~/.buildhive/logs/buildhive-agent.log
6
+ * with automatic rotation (max 10MB per file, keep 5 files).
7
+ */
8
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
9
+ export interface Logger {
10
+ debug(message: string, ...args: unknown[]): void;
11
+ info(message: string, ...args: unknown[]): void;
12
+ warn(message: string, ...args: unknown[]): void;
13
+ error(message: string, ...args: unknown[]): void;
14
+ }
15
+ export declare function createLogger(component: string, logLevel?: LogLevel): Logger;
16
+ /** Return the path to the active log file */
17
+ export declare function getLogFilePath(): string;
18
+ /** Return the log directory */
19
+ export declare function getLogDir(): string;
20
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAClD;AAkLD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAM3E;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,+BAA+B;AAC/B,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Logger Utility
3
+ *
4
+ * File-based + console logging with rotation for the BuildHive agent.
5
+ * Writes structured JSON to ~/.buildhive/logs/buildhive-agent.log
6
+ * with automatic rotation (max 10MB per file, keep 5 files).
7
+ */
8
+ import { existsSync, mkdirSync, statSync, renameSync, appendFileSync, unlinkSync } from 'fs';
9
+ import { join } from 'path';
10
+ import os from 'os';
11
+ // ---------------------------------------------------------------------------
12
+ // Log file configuration
13
+ // ---------------------------------------------------------------------------
14
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
15
+ const MAX_FILES = 5;
16
+ let logDirReady = false;
17
+ let _logDir = null;
18
+ let _logFile = null;
19
+ function getLogDirInternal() {
20
+ if (!_logDir)
21
+ _logDir = join(os.homedir(), '.buildhive', 'logs');
22
+ return _logDir;
23
+ }
24
+ function getLogFileInternal() {
25
+ if (!_logFile)
26
+ _logFile = join(getLogDirInternal(), 'buildhive-agent.log');
27
+ return _logFile;
28
+ }
29
+ function ensureLogDir() {
30
+ if (logDirReady)
31
+ return;
32
+ try {
33
+ if (!existsSync(getLogDirInternal())) {
34
+ mkdirSync(getLogDirInternal(), { recursive: true });
35
+ }
36
+ logDirReady = true;
37
+ }
38
+ catch {
39
+ // If we can't create log dir, console-only mode
40
+ }
41
+ }
42
+ function rotateIfNeeded() {
43
+ try {
44
+ const LOG_FILE = getLogFileInternal();
45
+ if (!existsSync(LOG_FILE))
46
+ return;
47
+ const stats = statSync(LOG_FILE);
48
+ if (stats.size < MAX_FILE_SIZE)
49
+ return;
50
+ // Delete oldest rotated file if it exists, then shift chain
51
+ const oldest = `${LOG_FILE}.${MAX_FILES}`;
52
+ if (existsSync(oldest)) {
53
+ unlinkSync(oldest);
54
+ }
55
+ for (let i = MAX_FILES - 1; i >= 1; i--) {
56
+ const from = `${LOG_FILE}.${i}`;
57
+ const to = `${LOG_FILE}.${i + 1}`;
58
+ if (existsSync(from)) {
59
+ renameSync(from, to);
60
+ }
61
+ }
62
+ renameSync(LOG_FILE, `${LOG_FILE}.1`);
63
+ }
64
+ catch {
65
+ // Rotation failure is non-fatal
66
+ }
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Async write buffer — flushes every 100ms or when buffer exceeds 64KB
70
+ // ---------------------------------------------------------------------------
71
+ const FLUSH_INTERVAL = 100; // ms
72
+ const FLUSH_SIZE = 64 * 1024; // 64KB
73
+ let writeBuffer = [];
74
+ let flushTimer = null;
75
+ let flushing = false;
76
+ function scheduleFlush() {
77
+ if (flushTimer)
78
+ return;
79
+ flushTimer = setTimeout(() => {
80
+ flushTimer = null;
81
+ flushBuffer();
82
+ }, FLUSH_INTERVAL);
83
+ }
84
+ function flushBuffer() {
85
+ if (flushing || writeBuffer.length === 0)
86
+ return;
87
+ flushing = true;
88
+ const batch = writeBuffer.join('\n') + '\n';
89
+ writeBuffer = [];
90
+ try {
91
+ rotateIfNeeded();
92
+ // Use appendFile async via import — but since we need synchronous module-level
93
+ // compatibility, use appendFileSync here in a non-blocking wrapper
94
+ // The batching itself reduces syscalls from N-per-log to 1-per-batch
95
+ appendFileSync(getLogFileInternal(), batch, 'utf-8');
96
+ }
97
+ catch {
98
+ // File write failure is non-fatal
99
+ }
100
+ finally {
101
+ flushing = false;
102
+ }
103
+ }
104
+ function writeToFile(entry) {
105
+ ensureLogDir();
106
+ if (!logDirReady)
107
+ return;
108
+ writeBuffer.push(entry);
109
+ // Flush immediately if buffer is large
110
+ if (writeBuffer.join('').length >= FLUSH_SIZE) {
111
+ flushBuffer();
112
+ }
113
+ else {
114
+ scheduleFlush();
115
+ }
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // SimpleLogger — console + file
119
+ // ---------------------------------------------------------------------------
120
+ class SimpleLogger {
121
+ component;
122
+ logLevel;
123
+ constructor(component, logLevel = 'info') {
124
+ this.component = component;
125
+ this.logLevel = logLevel;
126
+ }
127
+ debug(message, ...args) {
128
+ if (this.shouldLog('debug'))
129
+ this.emit('DEBUG', message, args);
130
+ }
131
+ info(message, ...args) {
132
+ if (this.shouldLog('info'))
133
+ this.emit('INFO', message, args);
134
+ }
135
+ warn(message, ...args) {
136
+ if (this.shouldLog('warn'))
137
+ this.emit('WARN', message, args);
138
+ }
139
+ error(message, ...args) {
140
+ if (this.shouldLog('error'))
141
+ this.emit('ERROR', message, args);
142
+ }
143
+ emit(level, message, args) {
144
+ const timestamp = new Date().toISOString();
145
+ const prefix = `[${timestamp}] [${level}] [${this.component}]`;
146
+ // Console output (human-readable)
147
+ const consoleFn = level === 'ERROR' ? console.error
148
+ : level === 'WARN' ? console.warn
149
+ : level === 'DEBUG' ? console.debug
150
+ : console.info;
151
+ consoleFn(`${prefix} ${message}`, ...args);
152
+ // File output (structured JSON line)
153
+ const entry = {
154
+ ts: timestamp,
155
+ level,
156
+ component: this.component,
157
+ msg: message,
158
+ };
159
+ if (args.length > 0) {
160
+ entry.data = args.map(a => a instanceof Error ? { name: a.name, message: a.message, stack: a.stack } : a);
161
+ }
162
+ writeToFile(JSON.stringify(entry));
163
+ }
164
+ shouldLog(level) {
165
+ const levels = ['debug', 'info', 'warn', 'error'];
166
+ return levels.indexOf(level) >= levels.indexOf(this.logLevel);
167
+ }
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // Public API
171
+ // ---------------------------------------------------------------------------
172
+ const VALID_LEVELS = ['debug', 'info', 'warn', 'error'];
173
+ export function createLogger(component, logLevel) {
174
+ const envLevel = process.env.BUILDHIVE_LOG_LEVEL;
175
+ const level = logLevel
176
+ || (VALID_LEVELS.includes(envLevel) ? envLevel : undefined)
177
+ || 'info';
178
+ return new SimpleLogger(component, level);
179
+ }
180
+ /** Return the path to the active log file */
181
+ export function getLogFilePath() {
182
+ return getLogFileInternal();
183
+ }
184
+ /** Return the log directory */
185
+ export function getLogDir() {
186
+ return getLogDirInternal();
187
+ }
188
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * SDK & Toolchain Scanner
3
+ *
4
+ * Detects installed SDKs, compilers, and developer toolchains on the host
5
+ * machine. Results feed into capability tags so the server can match jobs
6
+ * to agents that have the right tools.
7
+ *
8
+ * Design notes:
9
+ * - Every detection is wrapped in try/catch so a missing tool never crashes
10
+ * the scanner.
11
+ * - Commands have a 5-second timeout to avoid blocking on hung processes.
12
+ * - Works on macOS, Linux, and Windows (adjusts commands per platform).
13
+ *
14
+ * Requirements: MVP.4.1.2 (enhanced)
15
+ */
16
+ /** Basic information about an installed SDK / tool. */
17
+ export interface SDKInfo {
18
+ name: string;
19
+ version: string;
20
+ path?: string;
21
+ metadata?: Record<string, string>;
22
+ }
23
+ /** Aggregated result of scanning all known SDKs on the host. */
24
+ export interface SDKScanResult {
25
+ java?: SDKInfo & {
26
+ javaHome: string;
27
+ };
28
+ kotlin?: SDKInfo;
29
+ gradle?: SDKInfo;
30
+ maven?: SDKInfo;
31
+ xcode?: SDKInfo & {
32
+ xcodeSelectPath: string;
33
+ sdks: string[];
34
+ };
35
+ androidSdk?: SDKInfo & {
36
+ androidHome: string;
37
+ apiLevels: number[];
38
+ buildToolsVersions: string[];
39
+ };
40
+ flutter?: SDKInfo & {
41
+ dartVersion: string;
42
+ };
43
+ cocoapods?: SDKInfo;
44
+ node?: SDKInfo & {
45
+ npmVersion?: string;
46
+ };
47
+ yarn?: SDKInfo;
48
+ pnpm?: SDKInfo;
49
+ python?: SDKInfo & {
50
+ pipVersion?: string;
51
+ };
52
+ go?: SDKInfo & {
53
+ gopath?: string;
54
+ };
55
+ rust?: SDKInfo & {
56
+ cargoVersion?: string;
57
+ };
58
+ ruby?: SDKInfo & {
59
+ bundlerVersion?: string;
60
+ };
61
+ dotnet?: SDKInfo;
62
+ docker?: SDKInfo & {
63
+ composeVersion?: string;
64
+ };
65
+ terraform?: SDKInfo;
66
+ kubectl?: SDKInfo;
67
+ git?: SDKInfo;
68
+ cmake?: SDKInfo;
69
+ make?: SDKInfo;
70
+ }
71
+ /**
72
+ * Run a shell command synchronously, returning trimmed stdout or `null` on
73
+ * failure. Stderr is included in the output because some tools (notably
74
+ * `java -version`) print to stderr.
75
+ */
76
+ export declare function runCmd(cmd: string, timeoutMs?: number): string | null;
77
+ /**
78
+ * Extract major version number from a semver-ish string.
79
+ * e.g. "17.0.9" -> 17, "1.8.0_392" -> 8 (Java-specific handled externally).
80
+ */
81
+ export declare function majorVersion(version: string): number;
82
+ /**
83
+ * Extract major.minor from a version string.
84
+ * e.g. "15.4.1" -> "15.4"
85
+ */
86
+ export declare function majorMinor(version: string): string;
87
+ /**
88
+ * Scan the host for all known SDKs and toolchains.
89
+ *
90
+ * Each detector is independent and wrapped in try/catch so a failure in one
91
+ * tool never blocks detection of the others.
92
+ */
93
+ export declare function scanInstalledSDKs(): Promise<SDKScanResult>;
94
+ /**
95
+ * Generate capability tags from an SDK scan result.
96
+ *
97
+ * Tag conventions:
98
+ * - Generic tag without version: `java`, `docker`, `xcode`
99
+ * - Major-version tag: `java-17`, `node-20`, `go-1`
100
+ * - For Xcode, major.minor: `xcode-15.4`
101
+ * - For Android SDK, highest API level: `android-sdk-34`
102
+ * - Special: `docker` (Docker available), `dind` (Docker-in-Docker capable)
103
+ */
104
+ export declare function generateTagsFromSDKs(sdks: SDKScanResult): string[];
105
+ //# sourceMappingURL=sdkScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkScanner.d.ts","sourceRoot":"","sources":["../../src/utils/sdkScanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH,uDAAuD;AACvD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAE5B,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,KAAK,CAAC,EAAE,OAAO,GAAG;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9D,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClG,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,EAAE,CAAC,EAAE,OAAO,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,OAAO,GAAG;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAMD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAuB,GAAG,MAAM,GAAG,IAAI,CAsBrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGlD;AAoTD;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CA+ChE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CAsElE"}