fix(agent): Chat Agent 全链路 P0-P5 整改

封堵鉴权旁路与导出 IDOR,DocGov 改服务端身份;对话层 PendingAction 接真实 docgov/taskrun;修复流式租约假死与会话级任务流;加固配置/doc_id/NULL;补齐 slog 与测试;前端 ErrorBoundary 与受控文档重试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
WeiCHEN
2026-09-13 02:50:22 +00:00
committed by weichen
co-authored by Cursor
parent 21de3bc39e
commit f4e4357ddb
53 changed files with 2497 additions and 205 deletions
+6 -1
View File
@@ -54,6 +54,10 @@ func (r *Retriever) Search(ctx context.Context, query string, opts SearchOptions
allCandidates = append(allCandidates, hits...)
}
case DomainProjectAsset:
if opts.ProjectID <= 0 || opts.RequesterID <= 0 {
log.Printf("[kb-retriever] searchProjectAsset skipped: project_id and requester_id required")
continue
}
hits, err := r.searchProjectAsset(ctx, q, opts)
if err != nil {
log.Printf("[kb-retriever] searchProjectAsset err: %v", err)
@@ -232,9 +236,10 @@ func (r *Retriever) searchProjectAsset(ctx context.Context, q string, opts Searc
JOIN asset_projects p ON p.id=c.project_id
JOIN asset_documents d ON d.id=c.document_id
WHERE c.tsv IS NOT NULL AND c.tsv @@ plainto_tsquery('simple', $1)
AND p.id = $3
ORDER BY score DESC LIMIT $2`
rows, err := r.Store.Pool.Query(ctx, sqlStr, q, opts.Limit)
rows, err := r.Store.Pool.Query(ctx, sqlStr, q, opts.Limit, opts.ProjectID)
if err != nil {
return nil, nil // 预留表空查询容错
}
+2
View File
@@ -33,6 +33,8 @@ type HitItem struct {
// SearchOptions 检索配置选项
type SearchOptions struct {
Domains []KnowledgeDomain `json:"domains,omitempty"` // 目标领域范围 (空表示默认法规域)
ProjectID int64 `json:"project_id,omitempty"` // 项目资产检索必填:限定项目范围
RequesterID int64 `json:"requester_id,omitempty"` // 项目资产检索必填:请求者身份(审计/ACL)
Limit int `json:"limit,omitempty"` // 最终期望返回数量
CandidateLimit int `json:"candidate_limit,omitempty"` // 初筛召回数量 (Rerank 前)
IncludeRepealed bool `json:"include_repealed,omitempty"` // 是否包含已废止/历史版本标准