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.
- package/README.md +166 -0
- package/dist/__tests__/fakes/FakeDockerManager.d.ts +115 -0
- package/dist/__tests__/fakes/FakeDockerManager.d.ts.map +1 -0
- package/dist/__tests__/fakes/FakeDockerManager.js +203 -0
- package/dist/__tests__/fakes/FakeDockerManager.js.map +1 -0
- package/dist/acceptanceChecker.d.ts +26 -0
- package/dist/acceptanceChecker.d.ts.map +1 -0
- package/dist/acceptanceChecker.js +64 -0
- package/dist/acceptanceChecker.js.map +1 -0
- package/dist/advancedAgent.d.ts +161 -0
- package/dist/advancedAgent.d.ts.map +1 -0
- package/dist/advancedAgent.js +604 -0
- package/dist/advancedAgent.js.map +1 -0
- package/dist/agent.d.ts +101 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +490 -0
- package/dist/agent.js.map +1 -0
- package/dist/api/jobStatusApi.d.ts +88 -0
- package/dist/api/jobStatusApi.d.ts.map +1 -0
- package/dist/api/jobStatusApi.js +240 -0
- package/dist/api/jobStatusApi.js.map +1 -0
- package/dist/autoUpdater.d.ts +135 -0
- package/dist/autoUpdater.d.ts.map +1 -0
- package/dist/autoUpdater.js +494 -0
- package/dist/autoUpdater.js.map +1 -0
- package/dist/cacheManager.d.ts +108 -0
- package/dist/cacheManager.d.ts.map +1 -0
- package/dist/cacheManager.js +300 -0
- package/dist/cacheManager.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +30 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +35 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +45 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +269 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +193 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +90 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +28 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +397 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/docker.d.ts +96 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +411 -0
- package/dist/docker.js.map +1 -0
- package/dist/enhancedJobExecutor.d.ts +81 -0
- package/dist/enhancedJobExecutor.d.ts.map +1 -0
- package/dist/enhancedJobExecutor.js +223 -0
- package/dist/enhancedJobExecutor.js.map +1 -0
- package/dist/executors/executorFactory.d.ts +46 -0
- package/dist/executors/executorFactory.d.ts.map +1 -0
- package/dist/executors/executorFactory.js +80 -0
- package/dist/executors/executorFactory.js.map +1 -0
- package/dist/executors/index.d.ts +7 -0
- package/dist/executors/index.d.ts.map +1 -0
- package/dist/executors/index.js +6 -0
- package/dist/executors/index.js.map +1 -0
- package/dist/executors/nativeExecutor.d.ts +60 -0
- package/dist/executors/nativeExecutor.d.ts.map +1 -0
- package/dist/executors/nativeExecutor.js +311 -0
- package/dist/executors/nativeExecutor.js.map +1 -0
- package/dist/executors/types.d.ts +38 -0
- package/dist/executors/types.d.ts.map +1 -0
- package/dist/executors/types.js +9 -0
- package/dist/executors/types.js.map +1 -0
- package/dist/healthMonitor.d.ts +213 -0
- package/dist/healthMonitor.d.ts.map +1 -0
- package/dist/healthMonitor.js +547 -0
- package/dist/healthMonitor.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/jobExecutor.d.ts +117 -0
- package/dist/jobExecutor.d.ts.map +1 -0
- package/dist/jobExecutor.js +458 -0
- package/dist/jobExecutor.js.map +1 -0
- package/dist/lifecycleExecutor.d.ts +54 -0
- package/dist/lifecycleExecutor.d.ts.map +1 -0
- package/dist/lifecycleExecutor.js +230 -0
- package/dist/lifecycleExecutor.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +77 -0
- package/dist/main.js.map +1 -0
- package/dist/metrics.d.ts +103 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +360 -0
- package/dist/metrics.js.map +1 -0
- package/dist/recipes/builtinRecipes.d.ts +11 -0
- package/dist/recipes/builtinRecipes.d.ts.map +1 -0
- package/dist/recipes/builtinRecipes.js +688 -0
- package/dist/recipes/builtinRecipes.js.map +1 -0
- package/dist/recipes/index.d.ts +18 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +17 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/recipeRegistry.d.ts +49 -0
- package/dist/recipes/recipeRegistry.d.ts.map +1 -0
- package/dist/recipes/recipeRegistry.js +264 -0
- package/dist/recipes/recipeRegistry.js.map +1 -0
- package/dist/recipes/types.d.ts +116 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +10 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/recovery.d.ts +133 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +299 -0
- package/dist/recovery.js.map +1 -0
- package/dist/registration/apiClient.d.ts +44 -0
- package/dist/registration/apiClient.d.ts.map +1 -0
- package/dist/registration/apiClient.js +149 -0
- package/dist/registration/apiClient.js.map +1 -0
- package/dist/registration/index.d.ts +41 -0
- package/dist/registration/index.d.ts.map +1 -0
- package/dist/registration/index.js +141 -0
- package/dist/registration/index.js.map +1 -0
- package/dist/registration/machineId.d.ts +30 -0
- package/dist/registration/machineId.d.ts.map +1 -0
- package/dist/registration/machineId.js +89 -0
- package/dist/registration/machineId.js.map +1 -0
- package/dist/registration/types.d.ts +32 -0
- package/dist/registration/types.d.ts.map +1 -0
- package/dist/registration/types.js +9 -0
- package/dist/registration/types.js.map +1 -0
- package/dist/resourceGovernor.d.ts +57 -0
- package/dist/resourceGovernor.d.ts.map +1 -0
- package/dist/resourceGovernor.js +125 -0
- package/dist/resourceGovernor.js.map +1 -0
- package/dist/security/secretManager.d.ts +107 -0
- package/dist/security/secretManager.d.ts.map +1 -0
- package/dist/security/secretManager.js +361 -0
- package/dist/security/secretManager.js.map +1 -0
- package/dist/security.d.ts +134 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +470 -0
- package/dist/security.js.map +1 -0
- package/dist/storage/artifactUploader.d.ts +155 -0
- package/dist/storage/artifactUploader.d.ts.map +1 -0
- package/dist/storage/artifactUploader.js +554 -0
- package/dist/storage/artifactUploader.js.map +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/capabilities.d.ts +23 -0
- package/dist/utils/capabilities.d.ts.map +1 -0
- package/dist/utils/capabilities.js +200 -0
- package/dist/utils/capabilities.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +188 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sdkScanner.d.ts +105 -0
- package/dist/utils/sdkScanner.d.ts.map +1 -0
- package/dist/utils/sdkScanner.js +459 -0
- package/dist/utils/sdkScanner.js.map +1 -0
- package/dist/websocketClient.d.ts +154 -0
- package/dist/websocketClient.d.ts.map +1 -0
- package/dist/websocketClient.js +422 -0
- package/dist/websocketClient.js.map +1 -0
- 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"}
|