feat(api): solver service Phase 3b — server endpoints and job definitions #160
Reference in New Issue
Block a user
Delete Branch "feat/solver-service"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Add server-side solver service module (Phase 3b from docs/SOLVER.md) with REST API endpoints, database schema, job definitions, and runner result caching.
Changes
New files
migrations/021_solver_results.sql— solver_results table with upsert on (item_id, revision_number, operation)internal/db/solver_results.go— SolverResultRepository (Upsert, GetByItem, GetByItemRevision)internal/api/solver_handlers.go— all solver API handlers + maybeCacheSolverResult async hookjobdefs/assembly-solve.yaml— manual constraint solve job (tags: solver, timeout: 300s)jobdefs/assembly-validate.yaml— auto-validate on revision creation (tags: solver, timeout: 120s)jobdefs/assembly-kinematic.yaml— manual kinematic simulation (tags: solver, timeout: 1800s)Modified files
internal/config/config.go— SolverConfig struct (max_context_size_mb, default_timeout, auto_diagnose_on_commit)internal/modules/modules.go,loader.go— register solver module (depends on jobs)internal/db/jobs.go— ListSolverJobs helper with definition_name prefix filterinternal/api/handlers.go— wire SolverResultRepository into Serverinternal/api/routes.go— /api/solver/* routes + /api/items/{partNumber}/solver/resultsinternal/api/runner_handlers.go— async result cache hook on job completionAPI endpoints
Design decisions
scope_metadataJSONBmax_context_size_mbenforced at HTTP boundary via MaxBytesReaderAlso fixes
workflowsparam in NewServer calls across 6 test filesVerification
go build ./...✓go vet ./...✓go test ./internal/workflow/ ./internal/modules/ ./internal/jobdef/✓Add server-side solver service module with REST API endpoints, database schema, job definitions, and runner result caching. New files: - migrations/021_solver_results.sql: solver_results table with upsert constraint - internal/db/solver_results.go: SolverResultRepository (Upsert, GetByItem, GetByItemRevision) - internal/api/solver_handlers.go: solver API handlers and maybeCacheSolverResult hook - jobdefs/assembly-solve.yaml: manual solve job definition - jobdefs/assembly-validate.yaml: auto-validate on revision creation - jobdefs/assembly-kinematic.yaml: manual kinematic simulation job Modified: - internal/config/config.go: SolverConfig struct with max_context_size_mb, default_timeout - internal/modules/modules.go, loader.go: register solver module (depends on jobs) - internal/db/jobs.go: ListSolverJobs helper with definition_name prefix filter - internal/api/handlers.go: wire SolverResultRepository into Server - internal/api/routes.go: /api/solver/* routes + /api/items/{partNumber}/solver/results - internal/api/runner_handlers.go: async result cache hook on job completion API endpoints: - POST /api/solver/jobs — submit solver job (editor) - GET /api/solver/jobs — list solver jobs with filters - GET /api/solver/jobs/{id} — get solver job status - POST /api/solver/jobs/{id}/cancel — cancel solver job (editor) - GET /api/solver/solvers — registry of available solvers - GET /api/items/{pn}/solver/results — cached results for item Also fixes pre-existing test compilation errors (missing workflows param in NewServer calls across 6 test files).