Admin-gated Settings: runtime model selection, is_admin enforced (#90)
Build image / build-and-push (push) Successful in 11s
Build image / build-and-push (push) Successful in 11s
Closes #79. Agent model + on/off move into an admin-only Settings section, and is_admin is enforced for the first time. The live Runner is hot-swapped behind an atomic.Pointer with routes always registered, so a settings change takes effect with no restart; /capabilities reads the pointer. Secrets stay in the env, never the DB. Precedence: Settings → env → default. Verified live: swap on/off/model, bad spec → 400, race-clean. Gadfly blocking round addressed (dead code removed, error-swallowing fixed, frontend 503 handling, holder dedup).
This commit was merged in pull request #90.
This commit is contained in:
+11
-1
@@ -56,6 +56,16 @@ type stepEvent struct {
|
||||
}
|
||||
|
||||
func (h *handlers) agentChat(c *gin.Context) {
|
||||
// The route is always registered, so the assistant being off is a runtime
|
||||
// state, not a missing route: answer it plainly rather than 404ing a path
|
||||
// that exists. Loaded once here so a settings-driven swap mid-request can't
|
||||
// make it flip between the guard and the Run call.
|
||||
runner := h.agent.get()
|
||||
if runner == nil {
|
||||
writeAPIError(c, http.StatusServiceUnavailable, "AGENT_DISABLED", "the garden assistant isn't enabled on this instance")
|
||||
return
|
||||
}
|
||||
|
||||
var req chatRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
writeAPIError(c, http.StatusBadRequest, "INVALID_INPUT", "a gardenId and a message are required")
|
||||
@@ -78,7 +88,7 @@ func (h *handlers) agentChat(c *gin.Context) {
|
||||
stopBeat := stream.keepAlive(keepAliveInterval)
|
||||
defer stopBeat()
|
||||
|
||||
turn, err := h.agent.Run(c.Request.Context(), actor.ID, req.GardenID, req.Message,
|
||||
turn, err := runner.Run(c.Request.Context(), actor.ID, req.GardenID, req.Message,
|
||||
replayHistory(history),
|
||||
func(s mdagent.Step) {
|
||||
send(chatEvent{Step: &stepEvent{Index: s.Index, Tools: toolNames(s)}})
|
||||
|
||||
Reference in New Issue
Block a user