buroventures-harald-code
Version:
Harald Code - AI-powered coding assistant CLI
101 lines • 3.85 kB
JavaScript
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { getInstallationInfo } from './installationInfo.js';
import { updateEventEmitter } from './updateEventEmitter.js';
import { MessageType } from '../ui/types.js';
import { spawnWrapper } from './spawnWrapper.js';
export function handleAutoUpdate(info, settings, projectRoot, spawnFn = spawnWrapper) {
if (!info) {
return;
}
if (settings.merged.disableUpdateNag) {
return;
}
const installationInfo = getInstallationInfo(projectRoot, settings.merged.disableAutoUpdate ?? false);
let combinedMessage = info.message;
if (installationInfo.updateMessage) {
combinedMessage += `\n${installationInfo.updateMessage}`;
}
updateEventEmitter.emit('update-received', {
message: combinedMessage,
});
if (!installationInfo.updateCommand || settings.merged.disableAutoUpdate) {
return;
}
const isNightly = info.update.latest.includes('nightly');
const updateCommand = installationInfo.updateCommand.replace('@latest', isNightly ? '@nightly' : `@${info.update.latest}`);
const updateProcess = spawnFn(updateCommand, { stdio: 'pipe', shell: true });
let errorOutput = '';
updateProcess.stderr.on('data', (data) => {
errorOutput += data.toString();
});
updateProcess.on('close', (code) => {
if (code === 0) {
updateEventEmitter.emit('update-success', {
message: 'Update successful! The new version will be used on your next run.',
});
}
else {
updateEventEmitter.emit('update-failed', {
message: `Automatic update failed. Please try updating manually. (command: ${updateCommand}, stderr: ${errorOutput.trim()})`,
});
}
});
updateProcess.on('error', (err) => {
updateEventEmitter.emit('update-failed', {
message: `Automatic update failed. Please try updating manually. (error: ${err.message})`,
});
});
return updateProcess;
}
export function setUpdateHandler(addItem, setUpdateInfo) {
let successfullyInstalled = false;
const handleUpdateRecieved = (info) => {
setUpdateInfo(info);
const savedMessage = info.message;
setTimeout(() => {
if (!successfullyInstalled) {
addItem({
type: MessageType.INFO,
text: savedMessage,
}, Date.now());
}
setUpdateInfo(null);
}, 60000);
};
const handleUpdateFailed = () => {
setUpdateInfo(null);
addItem({
type: MessageType.ERROR,
text: `Automatic update failed. Please try updating manually`,
}, Date.now());
};
const handleUpdateSuccess = () => {
successfullyInstalled = true;
setUpdateInfo(null);
addItem({
type: MessageType.INFO,
text: `Update successful! The new version will be used on your next run.`,
}, Date.now());
};
const handleUpdateInfo = (data) => {
addItem({
type: MessageType.INFO,
text: data.message,
}, Date.now());
};
updateEventEmitter.on('update-received', handleUpdateRecieved);
updateEventEmitter.on('update-failed', handleUpdateFailed);
updateEventEmitter.on('update-success', handleUpdateSuccess);
updateEventEmitter.on('update-info', handleUpdateInfo);
return () => {
updateEventEmitter.off('update-received', handleUpdateRecieved);
updateEventEmitter.off('update-failed', handleUpdateFailed);
updateEventEmitter.off('update-success', handleUpdateSuccess);
updateEventEmitter.off('update-info', handleUpdateInfo);
};
}
//# sourceMappingURL=handleAutoUpdate.js.map