feat: add optional credential processing with dependent switches and traffic evidence

This commit is contained in:
ji ruo committed 2026-10-20 13:01:03 +08:00
1 parent 7c2efbc1ca
commit 851e3f99ed
16 files changed
+1881 -38

No files matched your search

+17 -3
View File
@@ -267,6 +267,10 @@ func New(ctx context.Context, m *Manager, skillDir string, dataDir string, keyDi
s.restoreTaskRuntimes()
go s.reconcileConcurrency()
s.startTaskArchiveWorker()
if m.pg != nil {
s.seedCredentialProcessor()
go s.runCredentialProcessor()
}
s.wireInterceptReviewer() // LLM 兜底审批:未命中拦截规则的命令交给模型判定
return s
}
@@ -861,6 +865,12 @@ func (s *Server) Handler() http.Handler {
mux.HandleFunc("GET /api/tasks/{id}/intelligence", s.listIntelligence)
mux.HandleFunc("GET /api/tasks/{id}/intelligence/{intelID}", s.getIntelligence)
mux.HandleFunc("PATCH /api/tasks/{id}/intelligence/{intelID}", s.updateIntelligence)
mux.HandleFunc("POST /api/tasks/{id}/intelligence/{intelID}/credentials/retry", s.retryCredentials)
mux.HandleFunc("GET /api/tasks/{id}/intelligence/{intelID}/traffic/{trafficID}", s.credentialTrafficDetail)
mux.HandleFunc("GET /api/assets/{id}/intelligence/{intelID}/traffic/{trafficID}", func(w http.ResponseWriter, r *http.Request) {
r.SetPathValue("scope", "assets")
s.credentialTrafficDetail(w, r)
})
mux.HandleFunc("GET /api/assets/{id}/intelligence", func(w http.ResponseWriter, r *http.Request) {
r.SetPathValue("scope", "assets")
s.listIntelligence(w, r)
@@ -3411,6 +3421,8 @@ func (s *Server) settingsPayload() map[string]any {
"traffic_capture": s.m.TrafficEnabled(),
"agent_traffic_binding": s.m.pg.GetBool(settingAgentTrafficBinding, false),
"task_intelligence_enabled": s.m.pg.GetBool(db.SettingTaskIntelligence, false),
db.SettingCredentialAgent: s.m.pg.GetBool(db.SettingCredentialAgent, false),
db.SettingCredentialTraffic: s.m.pg.GetBool(db.SettingCredentialAgent, false) && s.m.pg.GetBool(db.SettingCredentialTraffic, false),
"llm_record": s.m.LLMRecordEnabled(),
"web_search_enabled": on,
"web_search_backend": backend,
@@ -3482,6 +3494,8 @@ func (s *Server) putSettings(w http.ResponseWriter, r *http.Request) {
TrafficCapture *bool `json:"traffic_capture"`
AgentTrafficBinding *bool `json:"agent_traffic_binding"`
TaskIntelligence *bool `json:"task_intelligence_enabled"`
CredentialAgent *bool `json:"credential_agent_enabled"`
CredentialTraffic *bool `json:"credential_traffic_binding"`
LLMRecord *bool `json:"llm_record"` // LLM 录制开关(默认关);即时生效,无需重建 agent
// Web search. WebSearchEnabled/Backend toggle the tool + backend; BraveKey/TavilyKey
// are optional — omit (null) to leave a stored key untouched, send "" to clear.
@@ -3624,9 +3638,9 @@ func (s *Server) putSettings(w http.ResponseWriter, r *http.Request) {
// built under the OLD switch state — drop them so they pick up the new one.
s.invalidateProfileAgents()
}
if req.TaskIntelligence != nil {
if err := s.m.pg.SetBool(db.SettingTaskIntelligence, *req.TaskIntelligence); err != nil {
writeErr(w, 500, err.Error())
if req.TaskIntelligence != nil || req.CredentialAgent != nil || req.CredentialTraffic != nil {
if err := s.m.pg.SetIntelligenceSettings(r.Context(), req.TaskIntelligence, req.CredentialAgent, req.CredentialTraffic); err != nil {
intelligenceError(w, err)
return
}
}