Files
Agent-System/internal/storage/cas_assets.go
T
weichenandCursor 9038c65329 fix: 补齐 rows.Err() 检查(R-2,其余包)
覆盖 kb/storage/projectworkflow/docgov/freedoc 与两个 document CLI。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 03:40:24 +00:00

65 lines
1.6 KiB
Go

package storage
import (
"context"
"errors"
"fmt"
"io"
)
// ListProjectRefs 列出项目下全部 CAS 文件引用(智能体任务上下文资产池)。
func (c *CAS) ListProjectRefs(ctx context.Context, projectID int64) ([]*FileReference, error) {
if projectID <= 0 {
return nil, nil
}
if c.pool != nil {
rows, err := c.pool.Query(ctx, `
SELECT id, project_id, user_id, blob_sha256, file_name, file_category, COALESCE(summary, ''), created_at
FROM file_references
WHERE project_id = $1
ORDER BY id ASC
`, projectID)
if err != nil {
return nil, fmt.Errorf("list project refs: %w", err)
}
defer rows.Close()
var refs []*FileReference
for rows.Next() {
ref := &FileReference{}
if err := rows.Scan(&ref.ID, &ref.ProjectID, &ref.UserID, &ref.BlobSHA256, &ref.FileName, &ref.FileCategory, &ref.Summary, &ref.CreatedAt); err != nil {
continue
}
refs = append(refs, ref)
}
return refs, rows.Err()
}
c.mu.RLock()
defer c.mu.RUnlock()
var refs []*FileReference
for _, ref := range c.memoryRefs {
if ref.ProjectID == projectID {
cpy := *ref
refs = append(refs, &cpy)
}
}
return refs, nil
}
// ReadRefBytes 读取文件引用对应的完整二进制内容。
func (c *CAS) ReadRefBytes(ctx context.Context, refID int64) ([]byte, *FileReference, error) {
rc, ref, err := c.OpenFileByRef(ctx, refID)
if err != nil {
return nil, nil, err
}
defer rc.Close()
data, err := io.ReadAll(rc)
if err != nil {
return nil, ref, err
}
if len(data) == 0 {
return nil, ref, errors.New("asset file is empty")
}
return data, ref, nil
}