mirror of
https://github.com/RuoJi6/ARTEX.git
synced 2026-10-31 18:23:50 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f2c44be91 | ||
|
|
57424249ce | ||
|
|
f48f4ec8e2 | ||
|
|
aac79d72e9 | ||
|
|
a55189a649 | ||
|
|
8828d01eae | ||
|
|
53840faf7f | ||
|
|
3575b9091e |
No files matched your search
@@ -680,6 +680,11 @@ func (d *DB) GetFinding(id int64) (*DBFinding, error) {
|
||||
if reportConv.Valid {
|
||||
f.ReportConversationID = &reportConv.Int64
|
||||
}
|
||||
if f.ReportConversationID == nil && strings.TrimSpace(f.Report) != "" {
|
||||
if resolved, resolveErr := d.ResolveFindingReportConversation(f.ID); resolveErr == nil {
|
||||
f.ReportConversationID = resolved
|
||||
}
|
||||
}
|
||||
return f, nil
|
||||
}
|
||||
|
||||
@@ -688,6 +693,31 @@ func (d *DB) SetFindingReportConversationID(findingID, conversationID int64) err
|
||||
return err
|
||||
}
|
||||
|
||||
// ResolveFindingReportConversation backfills links for reports generated before
|
||||
// report_conversation_id was persisted.
|
||||
func (d *DB) ResolveFindingReportConversation(findingID int64) (*int64, error) {
|
||||
var id int64
|
||||
err := d.QueryRow(`SELECT c.id FROM conversations c
|
||||
JOIN conversation_activities a ON a.conversation_id=c.id
|
||||
WHERE c.agent_key='reporter' AND (
|
||||
c.title = '漏洞报告 · finding#' || $1::text OR
|
||||
c.title ILIKE '%finding#' || $1::text || '%' OR
|
||||
a.detail ILIKE '%finding_id=' || $1::text || '%' OR
|
||||
a.detail ILIKE '%"finding_id":' || $1::text || '%'
|
||||
)
|
||||
ORDER BY c.updated_at DESC, c.id DESC LIMIT 1`, findingID).Scan(&id)
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := d.SetFindingReportConversationID(findingID, id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &id, nil
|
||||
}
|
||||
|
||||
// DeleteFinding removes a finding entirely: the standalone findings row and its
|
||||
// originating exploration node (kind='finding'), so it disappears from the findings
|
||||
// list, the per-task 发现 Tab, and the exploration graph alike. Deleting the node
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/Autumn-27/artex/agent"
|
||||
"github.com/Autumn-27/artex/db"
|
||||
"github.com/Autumn-27/artex/intercept"
|
||||
"github.com/Autumn-27/norma/permission"
|
||||
actool "github.com/Autumn-27/norma/tool"
|
||||
)
|
||||
@@ -479,6 +480,11 @@ func (s *Server) toolUpdateFindingReport() actool.CoreTool {
|
||||
return actool.Errorf("归档报告截图失败: " + err.Error()), nil
|
||||
}
|
||||
}
|
||||
if conversationID := intercept.ConvIDFromContext(ctx); conversationID > 0 {
|
||||
if err := s.m.pg.SetFindingReportConversationID(fid, conversationID); err != nil {
|
||||
return actool.Errorf("关联报告对话失败: " + err.Error()), nil
|
||||
}
|
||||
}
|
||||
}
|
||||
n, err := s.m.pg.SetFindingReportVersionByNodeID(ctx, nodeID, a.Report, a.EvidenceVersion)
|
||||
if err != nil {
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -76,7 +76,7 @@ export function FindingAutoChat({
|
||||
setConversation({ id: initialConversationId, agent_key: agentKey, title: `漏洞 #${findingId} · ${safeTitle}`, created_at: "", updated_at: "" });
|
||||
return;
|
||||
}
|
||||
const storedID = Number(window.localStorage.getItem(storageKey));
|
||||
const storedID = agentKey === "auto" ? Number(window.localStorage.getItem(storageKey)) : 0;
|
||||
if (Number.isSafeInteger(storedID) && storedID > 0) {
|
||||
setConversation({
|
||||
id: storedID,
|
||||
|
||||
Reference in new issue
Block a user