- internal/research/agent.go: Agent with RunOnce+Start, sanitizeQuery, interface adapters - internal/research/agent_test.go: stub-based unit tests (sanitize, enrich, skip, empty) - internal/ai/client.go: TierClient.TextComplete for text-only LLM calls - internal/api/handlers/research.go: POST /api/research/trigger handler (202 Accepted) - internal/api/router.go: researchHandler param + /api/research/trigger route - cmd/hwlab/main.go: research agent goroutine started with 10min interval
30 lines
867 B
Go
30 lines
867 B
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"git.georgsen.dk/hwlab/internal/research"
|
|
)
|
|
|
|
// ResearchHandler handles research-related API endpoints.
|
|
type ResearchHandler struct {
|
|
agent *research.Agent
|
|
}
|
|
|
|
// NewResearchHandler creates a ResearchHandler backed by the given Agent.
|
|
func NewResearchHandler(agent *research.Agent) *ResearchHandler {
|
|
return &ResearchHandler{agent: agent}
|
|
}
|
|
|
|
// TriggerResearch handles POST /api/research/trigger.
|
|
// It fires a RunOnce cycle in a background goroutine and responds 202 Accepted immediately.
|
|
func (h *ResearchHandler) TriggerResearch(w http.ResponseWriter, r *http.Request) {
|
|
go func() {
|
|
_, _ = h.agent.RunOnce(context.Background())
|
|
}()
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(http.StatusAccepted)
|
|
json.NewEncoder(w).Encode(map[string]string{"status": "accepted"})
|
|
}
|