profileShare

rasmusjy / voicetask

Read-only snapshot

No repository description.

main default branch 105 files Expires Sep 13, 2026, 9:06 AM
generate.ts 1,464 bytes
1 import type { FastifyInstance } from 'fastify'
2 import { GenerateRequestSchema } from '../../shared/types'
3 import { GenerateFilesExistError, generateSpecPack } from '../generator/generate'
4 import { ProviderNotConfiguredError, type InterviewLlm } from '../providers/types'
5 import type { SessionStore } from '../store/sessionStore'
6
7 export interface GenerateRouteDeps {
8 store: SessionStore
9 llm: InterviewLlm
10 }
11
12 export function registerGenerateRoutes(app: FastifyInstance, deps: GenerateRouteDeps): void {
13 const { store, llm } = deps
14
15 app.post<{ Params: { id: string } }>('/api/sessions/:id/generate', async (request, reply) => {
16 const parsed = GenerateRequestSchema.safeParse(request.body ?? {})
17 if (!parsed.success) {
18 return reply.code(400).send({ error: parsed.error.message })
19 }
20
21 const session = await store.getSession(request.params.id)
22 if (!session) return reply.code(404).send({ error: 'session not found' })
23
24 try {
25 const result = await generateSpecPack(llm, session, { overwrite: parsed.data.overwrite })
26 return reply.send(result)
27 } catch (err) {
28 if (err instanceof GenerateFilesExistError) {
29 return reply.code(409).send({ error: err.message })
30 }
31 if (err instanceof ProviderNotConfiguredError) {
32 return reply.code(503).send({ error: err.message })
33 }
34 return reply.code(400).send({ error: err instanceof Error ? err.message : 'generation failed' })
35 }
36 })
37 }
38