import fs from 'node:fs' import path from 'node:path' import assert from 'node:assert/strict' const markerPath = path.join(process.env.PIAGENTUI_E2E_MARKER_DIR ?? '', 'fake-pi-state.json') async function readMarker() { await browser.waitUntil(() => fs.existsSync(markerPath), { timeout: 15000, timeoutMsg: `Fake Pi marker was not created at ${markerPath}`, }) return JSON.parse(fs.readFileSync(markerPath, 'utf8')) } async function textExists(text) { const element = await $(`//*[contains(normalize-space(), ${JSON.stringify(text)})]`) return element.isExisting() } describe('PiAgentUI first-run desktop onboarding', () => { before(async () => { await browser .waitUntil(async () => (await browser.getUrl()) !== 'about:blank', { timeout: 10000 }) .catch(async () => { await browser.url('http://tauri.localhost/') }) }) it('starts an isolated Pi backend and opens the provider catalog', async () => { await browser.waitUntil(() => textExists('Connect a model provider'), { timeout: 45000, timeoutMsg: 'Provider onboarding did not appear', }) assert.equal(await textExists('First run setup'), true) assert.equal(await textExists('OpenCode Zen'), true) assert.equal(await textExists('DeepSeek V4 Flash'), true) assert.equal(await textExists('Anthropic'), true) assert.equal(await textExists('Google'), true) assert.equal(await textExists('API key'), true) assert.equal(await textExists('OAuth'), true) const marker = await readMarker() assert.match(marker.agentDir, /pi-runtime/) assert.match(marker.agentDir, /agent/) assert.equal(marker.sessionDir, path.join(marker.agentDir, 'sessions')) assert.equal(marker.startupArgs.includes('--extension'), true) assert.equal( marker.startupArgs.some(arg => arg.endsWith('piagentui-server.ts')), true, ) assert.equal( marker.requests.some(request => request.path === '/api/providers'), true, ) }) it('filters providers, saves an API key, and exits first-run onboarding', async () => { const search = await $('input[placeholder*="Search providers"]') await search.setValue('claude') assert.equal(await textExists('Anthropic'), true) assert.equal(await textExists('OpenCode Zen'), false) await search.setValue('deepseek v4 flash') assert.equal(await textExists('DeepSeek V4 Flash'), true) assert.equal(await textExists('OpenCode Zen'), true) const addKey = await $('//button[normalize-space()="Add key"]') await addKey.click() const keyInput = await $('input[placeholder="Paste API key"]') await keyInput.setValue('test-key-from-e2e') await $('//button[normalize-space()="Save key"]').click() await browser.waitUntil(async () => !(await textExists('Connect a model provider')), { timeout: 15000, timeoutMsg: 'Onboarding did not close after saving provider auth', }) const marker = await readMarker() assert.equal(marker.apiKeyConfigured, true) assert.equal(marker.lastApiKeyLength, 'test-key-from-e2e'.length) assert.equal( marker.requests.some(request => request.path === '/api/providers/opencode/api-key'), true, ) }) })