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,459 @@
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
+ import { execSync } from 'child_process';
17
+ import os from 'os';
18
+ import { createLogger } from './logger.js';
19
+ const logger = createLogger('sdkScanner');
20
+ /** Timeout for each detection command in milliseconds. */
21
+ const CMD_TIMEOUT_MS = 5_000;
22
+ // ---------------------------------------------------------------------------
23
+ // Helpers
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Run a shell command synchronously, returning trimmed stdout or `null` on
27
+ * failure. Stderr is included in the output because some tools (notably
28
+ * `java -version`) print to stderr.
29
+ */
30
+ export function runCmd(cmd, timeoutMs = CMD_TIMEOUT_MS) {
31
+ try {
32
+ const isWindows = os.platform() === 'win32';
33
+ const result = execSync(cmd, {
34
+ timeout: timeoutMs,
35
+ stdio: ['pipe', 'pipe', 'pipe'],
36
+ encoding: 'utf-8',
37
+ shell: isWindows ? 'cmd.exe' : '/bin/sh',
38
+ env: { ...process.env },
39
+ });
40
+ return result?.trim() ?? null;
41
+ }
42
+ catch (err) {
43
+ // Some commands write version info to stderr. If the process exited
44
+ // with code 0 but threw because of the stderr capture, try stderr.
45
+ if (err && typeof err === 'object' && 'stderr' in err) {
46
+ const stderr = err.stderr;
47
+ if (stderr && typeof stderr === 'string' && stderr.trim().length > 0) {
48
+ return stderr.trim();
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * Extract major version number from a semver-ish string.
56
+ * e.g. "17.0.9" -> 17, "1.8.0_392" -> 8 (Java-specific handled externally).
57
+ */
58
+ export function majorVersion(version) {
59
+ const match = version.match(/^(\d+)/);
60
+ return match ? parseInt(match[1], 10) : 0;
61
+ }
62
+ /**
63
+ * Extract major.minor from a version string.
64
+ * e.g. "15.4.1" -> "15.4"
65
+ */
66
+ export function majorMinor(version) {
67
+ const match = version.match(/^(\d+\.\d+)/);
68
+ return match ? match[1] : version;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Individual SDK detectors
72
+ // ---------------------------------------------------------------------------
73
+ function detectJava() {
74
+ // `java -version` prints to stderr
75
+ const raw = runCmd('java -version 2>&1');
76
+ if (!raw)
77
+ return undefined;
78
+ // Matches: openjdk version "17.0.9" or java version "1.8.0_392"
79
+ const versionMatch = raw.match(/(?:openjdk|java) version "([^"]+)"/i);
80
+ if (!versionMatch)
81
+ return undefined;
82
+ let version = versionMatch[1];
83
+ // Normalise legacy Java 1.x naming: "1.8.0_392" -> "8.0.392"
84
+ const legacyMatch = version.match(/^1\.(\d+)\.0(?:_(\d+))?/);
85
+ if (legacyMatch) {
86
+ version = legacyMatch[2] ? `${legacyMatch[1]}.0.${legacyMatch[2]}` : `${legacyMatch[1]}.0`;
87
+ }
88
+ const javaHome = process.env.JAVA_HOME ?? runCmd('echo $JAVA_HOME') ?? '';
89
+ return { name: 'java', version, javaHome };
90
+ }
91
+ function detectKotlin() {
92
+ const raw = runCmd('kotlin -version 2>&1');
93
+ if (!raw)
94
+ return undefined;
95
+ // "Kotlin version 2.0.0-release-341 (JRE ...)" or "Kotlin version 1.9.22 ..."
96
+ const match = raw.match(/Kotlin version ([\d.]+)/i);
97
+ if (!match)
98
+ return undefined;
99
+ return { name: 'kotlin', version: match[1] };
100
+ }
101
+ function detectGradle() {
102
+ const raw = runCmd('gradle --version 2>&1');
103
+ if (!raw)
104
+ return undefined;
105
+ const match = raw.match(/Gradle ([\d.]+)/);
106
+ if (!match)
107
+ return undefined;
108
+ return { name: 'gradle', version: match[1] };
109
+ }
110
+ function detectMaven() {
111
+ const raw = runCmd('mvn --version 2>&1');
112
+ if (!raw)
113
+ return undefined;
114
+ const match = raw.match(/Apache Maven ([\d.]+)/);
115
+ if (!match)
116
+ return undefined;
117
+ return { name: 'maven', version: match[1] };
118
+ }
119
+ function detectXcode() {
120
+ if (os.platform() !== 'darwin')
121
+ return undefined;
122
+ const raw = runCmd('xcodebuild -version 2>&1');
123
+ if (!raw)
124
+ return undefined;
125
+ const versionMatch = raw.match(/Xcode ([\d.]+)/);
126
+ if (!versionMatch)
127
+ return undefined;
128
+ const xcodeSelectPath = runCmd('xcode-select -p 2>&1') ?? '';
129
+ // Gather available SDKs
130
+ const sdksRaw = runCmd('xcodebuild -showsdks 2>&1');
131
+ const sdks = [];
132
+ if (sdksRaw) {
133
+ const sdkMatches = sdksRaw.matchAll(/-sdk\s+(\S+)/g);
134
+ for (const m of sdkMatches) {
135
+ sdks.push(m[1]);
136
+ }
137
+ }
138
+ return { name: 'xcode', version: versionMatch[1], xcodeSelectPath, sdks };
139
+ }
140
+ function detectAndroidSdk() {
141
+ const androidHome = process.env.ANDROID_HOME ?? process.env.ANDROID_SDK_ROOT ?? '';
142
+ if (!androidHome)
143
+ return undefined;
144
+ // Try to get installed API levels and build-tools versions
145
+ const apiLevels = [];
146
+ const buildToolsVersions = [];
147
+ const listRaw = runCmd(`"${androidHome}/cmdline-tools/latest/bin/sdkmanager" --list 2>&1`)
148
+ ?? runCmd(`"${androidHome}/tools/bin/sdkmanager" --list 2>&1`);
149
+ if (listRaw) {
150
+ // Match "platforms;android-34"
151
+ const platformMatches = listRaw.matchAll(/platforms;android-(\d+)/g);
152
+ for (const m of platformMatches) {
153
+ const level = parseInt(m[1], 10);
154
+ if (!apiLevels.includes(level))
155
+ apiLevels.push(level);
156
+ }
157
+ // Match "build-tools;34.0.0"
158
+ const btMatches = listRaw.matchAll(/build-tools;([\d.]+)/g);
159
+ for (const m of btMatches) {
160
+ if (!buildToolsVersions.includes(m[1]))
161
+ buildToolsVersions.push(m[1]);
162
+ }
163
+ }
164
+ apiLevels.sort((a, b) => b - a);
165
+ buildToolsVersions.sort().reverse();
166
+ const version = apiLevels.length > 0 ? String(apiLevels[0]) : 'unknown';
167
+ return { name: 'android-sdk', version, androidHome, apiLevels, buildToolsVersions };
168
+ }
169
+ function detectFlutter() {
170
+ const raw = runCmd('flutter --version 2>&1');
171
+ if (!raw)
172
+ return undefined;
173
+ const versionMatch = raw.match(/Flutter ([\d.]+)/);
174
+ if (!versionMatch)
175
+ return undefined;
176
+ const dartMatch = raw.match(/Dart ([\d.]+)/);
177
+ const dartVersion = dartMatch ? dartMatch[1] : 'unknown';
178
+ return { name: 'flutter', version: versionMatch[1], dartVersion };
179
+ }
180
+ function detectCocoapods() {
181
+ const raw = runCmd('pod --version 2>&1');
182
+ if (!raw)
183
+ return undefined;
184
+ const match = raw.match(/([\d.]+)/);
185
+ if (!match)
186
+ return undefined;
187
+ return { name: 'cocoapods', version: match[1] };
188
+ }
189
+ function detectNode() {
190
+ const raw = runCmd('node --version 2>&1');
191
+ if (!raw)
192
+ return undefined;
193
+ // "v20.11.0" -> "20.11.0"
194
+ const match = raw.match(/v?([\d.]+)/);
195
+ if (!match)
196
+ return undefined;
197
+ const npmRaw = runCmd('npm --version 2>&1');
198
+ const npmMatch = npmRaw?.match(/([\d.]+)/);
199
+ return { name: 'node', version: match[1], npmVersion: npmMatch?.[1] };
200
+ }
201
+ function detectYarn() {
202
+ const raw = runCmd('yarn --version 2>&1');
203
+ if (!raw)
204
+ return undefined;
205
+ const match = raw.match(/([\d.]+)/);
206
+ if (!match)
207
+ return undefined;
208
+ return { name: 'yarn', version: match[1] };
209
+ }
210
+ function detectPnpm() {
211
+ const raw = runCmd('pnpm --version 2>&1');
212
+ if (!raw)
213
+ return undefined;
214
+ const match = raw.match(/([\d.]+)/);
215
+ if (!match)
216
+ return undefined;
217
+ return { name: 'pnpm', version: match[1] };
218
+ }
219
+ function detectPython() {
220
+ const raw = runCmd('python3 --version 2>&1') ?? runCmd('python --version 2>&1');
221
+ if (!raw)
222
+ return undefined;
223
+ const match = raw.match(/Python ([\d.]+)/i);
224
+ if (!match)
225
+ return undefined;
226
+ const pipRaw = runCmd('pip3 --version 2>&1') ?? runCmd('pip --version 2>&1');
227
+ const pipMatch = pipRaw?.match(/pip ([\d.]+)/);
228
+ return { name: 'python', version: match[1], pipVersion: pipMatch?.[1] };
229
+ }
230
+ function detectGo() {
231
+ const raw = runCmd('go version 2>&1');
232
+ if (!raw)
233
+ return undefined;
234
+ // "go version go1.22.0 darwin/arm64"
235
+ const match = raw.match(/go([\d.]+)/);
236
+ if (!match)
237
+ return undefined;
238
+ const gopath = process.env.GOPATH ?? runCmd('go env GOPATH 2>&1') ?? undefined;
239
+ return { name: 'go', version: match[1], gopath };
240
+ }
241
+ function detectRust() {
242
+ const raw = runCmd('rustc --version 2>&1');
243
+ if (!raw)
244
+ return undefined;
245
+ // "rustc 1.75.0 (82e1608df 2023-12-21)"
246
+ const match = raw.match(/rustc ([\d.]+)/);
247
+ if (!match)
248
+ return undefined;
249
+ const cargoRaw = runCmd('cargo --version 2>&1');
250
+ const cargoMatch = cargoRaw?.match(/cargo ([\d.]+)/);
251
+ return { name: 'rust', version: match[1], cargoVersion: cargoMatch?.[1] };
252
+ }
253
+ function detectRuby() {
254
+ const raw = runCmd('ruby --version 2>&1');
255
+ if (!raw)
256
+ return undefined;
257
+ // "ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin22]"
258
+ const match = raw.match(/ruby ([\d.]+)/);
259
+ if (!match)
260
+ return undefined;
261
+ const bundlerRaw = runCmd('bundler --version 2>&1');
262
+ const bundlerMatch = bundlerRaw?.match(/Bundler version ([\d.]+)/);
263
+ return { name: 'ruby', version: match[1], bundlerVersion: bundlerMatch?.[1] };
264
+ }
265
+ function detectDotnet() {
266
+ const raw = runCmd('dotnet --version 2>&1');
267
+ if (!raw)
268
+ return undefined;
269
+ const match = raw.match(/([\d.]+)/);
270
+ if (!match)
271
+ return undefined;
272
+ return { name: 'dotnet', version: match[1] };
273
+ }
274
+ function detectDocker() {
275
+ const raw = runCmd('docker --version 2>&1');
276
+ if (!raw)
277
+ return undefined;
278
+ // "Docker version 24.0.7, build afdd53b"
279
+ const match = raw.match(/Docker version ([\d.]+)/i);
280
+ if (!match)
281
+ return undefined;
282
+ const composeRaw = runCmd('docker compose version 2>&1');
283
+ const composeMatch = composeRaw?.match(/v?([\d.]+)/);
284
+ return { name: 'docker', version: match[1], composeVersion: composeMatch?.[1] };
285
+ }
286
+ function detectTerraform() {
287
+ const raw = runCmd('terraform --version 2>&1');
288
+ if (!raw)
289
+ return undefined;
290
+ const match = raw.match(/Terraform v?([\d.]+)/i);
291
+ if (!match)
292
+ return undefined;
293
+ return { name: 'terraform', version: match[1] };
294
+ }
295
+ function detectKubectl() {
296
+ const raw = runCmd('kubectl version --client --short 2>&1')
297
+ ?? runCmd('kubectl version --client 2>&1');
298
+ if (!raw)
299
+ return undefined;
300
+ const match = raw.match(/v?([\d.]+)/);
301
+ if (!match)
302
+ return undefined;
303
+ return { name: 'kubectl', version: match[1] };
304
+ }
305
+ function detectGit() {
306
+ const raw = runCmd('git --version 2>&1');
307
+ if (!raw)
308
+ return undefined;
309
+ // "git version 2.43.0"
310
+ const match = raw.match(/git version ([\d.]+)/);
311
+ if (!match)
312
+ return undefined;
313
+ return { name: 'git', version: match[1] };
314
+ }
315
+ function detectCmake() {
316
+ const raw = runCmd('cmake --version 2>&1');
317
+ if (!raw)
318
+ return undefined;
319
+ const match = raw.match(/cmake version ([\d.]+)/i);
320
+ if (!match)
321
+ return undefined;
322
+ return { name: 'cmake', version: match[1] };
323
+ }
324
+ function detectMake() {
325
+ const raw = runCmd('make --version 2>&1');
326
+ if (!raw)
327
+ return undefined;
328
+ const match = raw.match(/(?:GNU Make|Make) ([\d.]+)/i);
329
+ if (!match)
330
+ return undefined;
331
+ return { name: 'make', version: match[1] };
332
+ }
333
+ // ---------------------------------------------------------------------------
334
+ // Public API
335
+ // ---------------------------------------------------------------------------
336
+ /**
337
+ * Scan the host for all known SDKs and toolchains.
338
+ *
339
+ * Each detector is independent and wrapped in try/catch so a failure in one
340
+ * tool never blocks detection of the others.
341
+ */
342
+ export async function scanInstalledSDKs() {
343
+ logger.info('Scanning installed SDKs and toolchains...');
344
+ const result = {};
345
+ // Run detectors sequentially to avoid spawning too many child processes at
346
+ // once on resource-constrained machines. Each has its own timeout guard.
347
+ const detectors = [
348
+ ['java', detectJava],
349
+ ['kotlin', detectKotlin],
350
+ ['gradle', detectGradle],
351
+ ['maven', detectMaven],
352
+ ['xcode', detectXcode],
353
+ ['androidSdk', detectAndroidSdk],
354
+ ['flutter', detectFlutter],
355
+ ['cocoapods', detectCocoapods],
356
+ ['node', detectNode],
357
+ ['yarn', detectYarn],
358
+ ['pnpm', detectPnpm],
359
+ ['python', detectPython],
360
+ ['go', detectGo],
361
+ ['rust', detectRust],
362
+ ['ruby', detectRuby],
363
+ ['dotnet', detectDotnet],
364
+ ['docker', detectDocker],
365
+ ['terraform', detectTerraform],
366
+ ['kubectl', detectKubectl],
367
+ ['git', detectGit],
368
+ ['cmake', detectCmake],
369
+ ['make', detectMake],
370
+ ];
371
+ for (const [key, detector] of detectors) {
372
+ try {
373
+ const info = detector();
374
+ if (info) {
375
+ result[key] = info;
376
+ }
377
+ }
378
+ catch (err) {
379
+ logger.warn(`SDK detector for '${key}' threw unexpectedly:`, err);
380
+ }
381
+ }
382
+ const detected = Object.keys(result);
383
+ logger.info(`Detected ${detected.length} SDK(s): ${detected.join(', ')}`);
384
+ return result;
385
+ }
386
+ /**
387
+ * Generate capability tags from an SDK scan result.
388
+ *
389
+ * Tag conventions:
390
+ * - Generic tag without version: `java`, `docker`, `xcode`
391
+ * - Major-version tag: `java-17`, `node-20`, `go-1`
392
+ * - For Xcode, major.minor: `xcode-15.4`
393
+ * - For Android SDK, highest API level: `android-sdk-34`
394
+ * - Special: `docker` (Docker available), `dind` (Docker-in-Docker capable)
395
+ */
396
+ export function generateTagsFromSDKs(sdks) {
397
+ const tags = [];
398
+ const addVersionedTag = (info, tagName) => {
399
+ if (!info)
400
+ return;
401
+ const name = tagName ?? info.name;
402
+ tags.push(name);
403
+ const major = majorVersion(info.version);
404
+ if (major > 0) {
405
+ tags.push(`${name}-${major}`);
406
+ }
407
+ };
408
+ // Development toolchains
409
+ addVersionedTag(sdks.java);
410
+ addVersionedTag(sdks.kotlin);
411
+ addVersionedTag(sdks.gradle);
412
+ addVersionedTag(sdks.maven);
413
+ // Mobile - Xcode uses major.minor
414
+ if (sdks.xcode) {
415
+ tags.push('xcode');
416
+ tags.push(`xcode-${majorMinor(sdks.xcode.version)}`);
417
+ }
418
+ // Android SDK - tag with highest API level
419
+ if (sdks.androidSdk) {
420
+ tags.push('android-sdk');
421
+ if (sdks.androidSdk.apiLevels.length > 0) {
422
+ tags.push(`android-sdk-${sdks.androidSdk.apiLevels[0]}`);
423
+ }
424
+ }
425
+ addVersionedTag(sdks.flutter);
426
+ addVersionedTag(sdks.cocoapods);
427
+ // Web / Backend
428
+ addVersionedTag(sdks.node);
429
+ addVersionedTag(sdks.yarn);
430
+ addVersionedTag(sdks.pnpm);
431
+ addVersionedTag(sdks.python);
432
+ addVersionedTag(sdks.go);
433
+ addVersionedTag(sdks.rust);
434
+ addVersionedTag(sdks.ruby);
435
+ addVersionedTag(sdks.dotnet);
436
+ // DevOps
437
+ if (sdks.docker) {
438
+ tags.push('docker');
439
+ // Check if Docker-in-Docker is plausible (Docker socket exists)
440
+ try {
441
+ const socketCheck = runCmd('ls /var/run/docker.sock 2>&1');
442
+ if (socketCheck && !socketCheck.includes('No such file')) {
443
+ tags.push('dind');
444
+ }
445
+ }
446
+ catch {
447
+ // ignore
448
+ }
449
+ }
450
+ addVersionedTag(sdks.terraform);
451
+ addVersionedTag(sdks.kubectl);
452
+ // General
453
+ addVersionedTag(sdks.git);
454
+ addVersionedTag(sdks.cmake);
455
+ addVersionedTag(sdks.make);
456
+ // De-duplicate (preserving order)
457
+ return [...new Set(tags)];
458
+ }
459
+ //# sourceMappingURL=sdkScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkScanner.js","sourceRoot":"","sources":["../../src/utils/sdkScanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * WebSocket Client - Agent communication with BuildHive platform
3
+ *
4
+ * Handles real-time communication between agent and platform,
5
+ * including registration, heartbeats, job assignments, and status updates.
6
+ *
7
+ * Requirements: 1.5, 1.6, 5.1, 5.2, 5.3
8
+ */
9
+ import { AgentConfig } from './config/types.js';
10
+ import { AgentCapabilities, JobSubmissionRequest } from './types.js';
11
+ import { JobResult } from './agent.js';
12
+ export interface HeartbeatData {
13
+ currentLoad: number;
14
+ activeJobs: number;
15
+ metrics?: {
16
+ cpuUsage: number;
17
+ memoryUsage: number;
18
+ diskUsage: number;
19
+ };
20
+ }
21
+ export interface JobProgress {
22
+ percentage: number;
23
+ currentStep: string;
24
+ totalSteps?: number;
25
+ currentStepIndex?: number;
26
+ estimatedTimeRemaining?: number;
27
+ }
28
+ export interface MetricsData {
29
+ cpuUsage: number;
30
+ memoryUsage: number;
31
+ diskUsage: number;
32
+ networkIn: number;
33
+ networkOut: number;
34
+ activeJobs: number;
35
+ queuedJobs: number;
36
+ completedJobs: number;
37
+ failedJobs: number;
38
+ }
39
+ export declare class WebSocketClient {
40
+ private config;
41
+ private capabilities;
42
+ private ws;
43
+ private connectionId;
44
+ private reconnectAttempts;
45
+ private maxReconnectAttempts;
46
+ private reconnectDelay;
47
+ private maxReconnectDelay;
48
+ private pingInterval;
49
+ private isConnecting;
50
+ private eventHandlers;
51
+ private isRegistered;
52
+ constructor(config: AgentConfig, capabilities: AgentCapabilities);
53
+ /**
54
+ * Connect to the BuildHive platform WebSocket server
55
+ */
56
+ connect(): Promise<void>;
57
+ /**
58
+ * Disconnect from the platform
59
+ */
60
+ disconnect(): Promise<void>;
61
+ /**
62
+ * Register agent with the platform
63
+ */
64
+ registerAgent(): Promise<void>;
65
+ /**
66
+ * Send heartbeat to platform
67
+ */
68
+ sendHeartbeat(data: HeartbeatData): Promise<void>;
69
+ /**
70
+ * Send metrics to platform
71
+ */
72
+ sendMetrics(metrics: MetricsData): Promise<void>;
73
+ /**
74
+ * Update agent status
75
+ */
76
+ updateStatus(status: 'ONLINE' | 'OFFLINE' | 'BUSY' | 'MAINTENANCE'): Promise<void>;
77
+ /**
78
+ * Send job progress update
79
+ */
80
+ sendJobProgress(jobId: string, progress: JobProgress): void;
81
+ /**
82
+ * Send job logs
83
+ */
84
+ sendJobLogs(jobId: string, logs: string, level?: 'info' | 'warn' | 'error' | 'debug'): void;
85
+ /**
86
+ * Send job result
87
+ */
88
+ sendJobResult(result: JobResult): Promise<void>;
89
+ /**
90
+ * Add event handler
91
+ */
92
+ onJobAssigned(handler: (job: JobSubmissionRequest) => void): void;
93
+ onConnectionChange(handler: (connected: boolean) => void): void;
94
+ onReconnected(handler: () => void): void;
95
+ /**
96
+ * Generic event handler registration
97
+ */
98
+ on(eventType: string, handler: Function): void;
99
+ /**
100
+ * Remove event handler
101
+ */
102
+ off(eventType: string, handler: Function): void;
103
+ /**
104
+ * Check if WebSocket is connected
105
+ */
106
+ isConnected(): boolean;
107
+ /**
108
+ * Get connection status
109
+ */
110
+ getConnectionStatus(): {
111
+ connected: boolean;
112
+ connecting: boolean;
113
+ registered: boolean;
114
+ connectionId: string | null;
115
+ reconnectAttempts: number;
116
+ };
117
+ /**
118
+ * Build WebSocket URL with authentication
119
+ */
120
+ private buildWebSocketUrl;
121
+ /**
122
+ * Send message to server
123
+ */
124
+ private send;
125
+ /**
126
+ * Handle WebSocket open event
127
+ */
128
+ private handleOpen;
129
+ /**
130
+ * Handle WebSocket message event
131
+ */
132
+ private handleMessage;
133
+ /**
134
+ * Handle WebSocket close event
135
+ */
136
+ private handleClose;
137
+ /**
138
+ * Handle WebSocket error event
139
+ */
140
+ private handleError;
141
+ /**
142
+ * Schedule reconnection attempt
143
+ */
144
+ private scheduleReconnect;
145
+ /**
146
+ * Start ping interval to keep connection alive
147
+ */
148
+ private startPingInterval;
149
+ /**
150
+ * Emit event to registered handlers
151
+ */
152
+ private emitEvent;
153
+ }
154
+ //# sourceMappingURL=websocketClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketClient.d.ts","sourceRoot":"","sources":["../src/websocketClient.ts"],"names":[],"mappings":"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"}