From 6d1ece3156c3ee7ce3fe1c19aabeb45b34d6436a Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Sat, 22 Aug 2026 12:29:32 +0200 Subject: feat: node:start auto-provisions config and unlock key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the wizard calls node:start with {hubUrl, username}, the handler writes a minimal node.toml and a random unlock.key if they don't exist. The daemon then creates the keystore on first start using the unlock file — fully non-interactive. Existing configs are left untouched: if node.toml or unlock.key already exist, provisioning is skipped and the node starts as before. Co-Authored-By: Claude Opus 4.6 --- packages/meshbay-client/src/main.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'packages/meshbay-client/src/main.js') diff --git a/packages/meshbay-client/src/main.js b/packages/meshbay-client/src/main.js index 22e0162..8dcc2ae 100644 --- a/packages/meshbay-client/src/main.js +++ b/packages/meshbay-client/src/main.js @@ -744,7 +744,36 @@ function registerBridge() { } catch { return null; } } - ipcMain.handle('node:start', async () => { + function provisionNode(hubUrl, username) { + const configDir = path.join(os.homedir(), '.config', 'meshbay'); + fs.mkdirSync(configDir, { recursive: true }); + + const configFile = nodeConfigPath(); + if (!fs.existsSync(configFile)) { + const toml = [ + '[hub]', + `url = "${hubUrl}"`, + `username = "${username}"`, + '', + '[node]', + 'quic_port = 19010', + 'ui_port = 18000', + '', + '[keystore]', + `unlock_file = "${path.join(configDir, 'unlock.key')}"`, + '', + ].join('\n'); + fs.writeFileSync(configFile, toml, { mode: 0o600 }); + } + + const unlockFile = path.join(configDir, 'unlock.key'); + if (!fs.existsSync(unlockFile)) { + const key = crypto.randomBytes(32).toString('base64url'); + fs.writeFileSync(unlockFile, key + '\n', { mode: 0o600 }); + } + } + + ipcMain.handle('node:start', async (_e, opts) => { const already = await probeNode(); if (already) return { started: true, ...already }; @@ -752,6 +781,10 @@ function registerBridge() { throw new Error('Automatic node start is only supported on Linux'); } + if (opts && opts.hubUrl && opts.username) { + provisionNode(opts.hubUrl, opts.username); + } + const deadline = Date.now() + 15000; const configFile = nodeConfigPath(); let launched = false; -- cgit v1.2.3