export function createEditorOpenHandler({ store, resolveDirectoryRepository, isLoopbackRequest, editor, writeJson }) { return async (request, response) => { response.setHeader('cache-control', 'no-store') if (request.method !== 'POST') { return writeJson(response, 405, { ok: false, error: { code: 'method-not-allowed', message: 'Use POST to open a workspace.' } }) } if (!isLoopbackRequest(request) || request.headers['x-dsh-editor-action'] !== 'open') { return writeJson(response, 403, { ok: false, error: { code: 'forbidden', message: 'Open workspaces from the local Git Working Dirs menu.' } }) } const url = new URL(request.url, `http://${request.headers.host}`) const sessionId = url.searchParams.get('sessionId') || '' const path = url.searchParams.get('path') || '' if (!sessionId || !path) { return writeJson(response, 400, { ok: false, error: { code: 'invalid-request', message: 'Missing session or directory.' } }) } try { const entries = await store.list(sessionId) const entry = entries.find(entry => entry.ok && [entry.id, entry.path, entry.repository, entry.workingDirectory].includes(path)) if (!entry) { return writeJson(response, 403, { ok: false, error: { code: 'not-tracked', message: 'Directory is not tracked by this session.' } }) } const directory = entry.workingDirectory || entry.repository const resolved = await resolveDirectoryRepository(directory) if (resolved.repository !== entry.repository) { return writeJson(response, 409, { ok: false, error: { code: 'directory-changed', message: 'Repository location changed. Track it again before opening.' } }) } const workspace = await editor.open(resolved.workingDirectory) return writeJson(response, 200, { ok: true, value: workspace }) } catch (error) { return writeJson(response, 503, { ok: false, error: { code: 'editor-unavailable', message: error.message || 'Unable to open VS Code.' } }) } } }