Start managed OpenCode from the app data directory instead of the home folder Prevent unnecessary Desktop, Documents, Downloads, and Music access prompts Add coverage for configured OpenCode working directory
93 lines
3.3 KiB
JavaScript
93 lines
3.3 KiB
JavaScript
export const createHmrStateRuntime = (dependencies) => {
|
|
const {
|
|
globalThisLike,
|
|
os,
|
|
processLike,
|
|
stateKey,
|
|
} = dependencies;
|
|
|
|
const getInitialOpenCodeWorkingDirectory = () => {
|
|
const configured = typeof processLike.env.OPENCHAMBER_OPENCODE_CWD === 'string'
|
|
? processLike.env.OPENCHAMBER_OPENCODE_CWD.trim()
|
|
: '';
|
|
return configured || os.homedir();
|
|
};
|
|
|
|
const getOrCreateHmrState = () => {
|
|
if (!globalThisLike[stateKey]) {
|
|
globalThisLike[stateKey] = {
|
|
openCodeProcess: null,
|
|
openCodePort: null,
|
|
openCodeWorkingDirectory: getInitialOpenCodeWorkingDirectory(),
|
|
isShuttingDown: false,
|
|
signalsAttached: false,
|
|
userProvidedOpenCodePassword: undefined,
|
|
openCodeAuthPassword: null,
|
|
openCodeAuthSource: null,
|
|
};
|
|
}
|
|
return globalThisLike[stateKey];
|
|
};
|
|
|
|
const ensureUserProvidedOpenCodePassword = (hmrState) => {
|
|
if (typeof hmrState.userProvidedOpenCodePassword !== 'undefined') {
|
|
return;
|
|
}
|
|
const initialPassword = typeof processLike.env.OPENCODE_SERVER_PASSWORD === 'string'
|
|
? processLike.env.OPENCODE_SERVER_PASSWORD.trim()
|
|
: '';
|
|
hmrState.userProvidedOpenCodePassword = initialPassword || null;
|
|
};
|
|
|
|
const getUserProvidedOpenCodePassword = (hmrState) => (
|
|
typeof hmrState.userProvidedOpenCodePassword === 'string' && hmrState.userProvidedOpenCodePassword.length > 0
|
|
? hmrState.userProvidedOpenCodePassword
|
|
: null
|
|
);
|
|
|
|
const resolveOpenCodeAuthFromState = ({ hmrState, userProvidedOpenCodePassword }) => ({
|
|
openCodeAuthPassword:
|
|
typeof hmrState.openCodeAuthPassword === 'string' && hmrState.openCodeAuthPassword.length > 0
|
|
? hmrState.openCodeAuthPassword
|
|
: userProvidedOpenCodePassword,
|
|
openCodeAuthSource:
|
|
typeof hmrState.openCodeAuthSource === 'string' && hmrState.openCodeAuthSource.length > 0
|
|
? hmrState.openCodeAuthSource
|
|
: (userProvidedOpenCodePassword ? 'user-env' : null),
|
|
});
|
|
|
|
const syncStateFromRuntime = (hmrState, runtime) => {
|
|
hmrState.openCodeProcess = runtime.openCodeProcess;
|
|
hmrState.openCodePort = runtime.openCodePort;
|
|
hmrState.openCodeBaseUrl = runtime.openCodeBaseUrl;
|
|
hmrState.isShuttingDown = runtime.isShuttingDown;
|
|
hmrState.signalsAttached = runtime.signalsAttached;
|
|
hmrState.openCodeWorkingDirectory = runtime.openCodeWorkingDirectory;
|
|
hmrState.openCodeAuthPassword = runtime.openCodeAuthPassword;
|
|
hmrState.openCodeAuthSource = runtime.openCodeAuthSource;
|
|
};
|
|
|
|
const restoreRuntimeFromState = ({ hmrState, userProvidedOpenCodePassword }) => {
|
|
const auth = resolveOpenCodeAuthFromState({ hmrState, userProvidedOpenCodePassword });
|
|
return {
|
|
openCodeProcess: hmrState.openCodeProcess,
|
|
openCodePort: hmrState.openCodePort,
|
|
openCodeBaseUrl: hmrState.openCodeBaseUrl ?? null,
|
|
isShuttingDown: hmrState.isShuttingDown,
|
|
signalsAttached: hmrState.signalsAttached,
|
|
openCodeWorkingDirectory: hmrState.openCodeWorkingDirectory,
|
|
openCodeAuthPassword: auth.openCodeAuthPassword,
|
|
openCodeAuthSource: auth.openCodeAuthSource,
|
|
};
|
|
};
|
|
|
|
return {
|
|
getOrCreateHmrState,
|
|
ensureUserProvidedOpenCodePassword,
|
|
getUserProvidedOpenCodePassword,
|
|
resolveOpenCodeAuthFromState,
|
|
syncStateFromRuntime,
|
|
restoreRuntimeFromState,
|
|
};
|
|
};
|