Files
Agent-System/internal/workflowdef/catalog_store.go
T
weichenandCursor f07178fa73 feat(service): enforce three-workflow governance and instance lifecycle
Wire catalog policy, v2 manifests, stage access, activation metadata fixes, and coordinator instance advance around frozen workflow snapshots.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-13 02:50:23 +00:00

69 lines
2.0 KiB
Go

package workflowdef
import "context"
// ListProjectSelectableDefinitions 返回项目可选的已发布正式工作流(严格三项白名单)。
func (s *Store) ListProjectSelectableDefinitions(ctx context.Context) ([]Definition, error) {
if !s.enabled() {
return nil, ErrNotAvailable
}
rows, err := s.pool.Query(ctx, `
SELECT id, def_key, name, description, status, latest_published_version, product_domain,
COALESCE(project_selectable, false), COALESCE(catalog_order, 0), created_at, updated_at
FROM workflow_definitions
WHERE def_key = ANY($1) AND latest_published_version > 0
ORDER BY COALESCE(catalog_order, 0) ASC, def_key ASC
`, OfficialWorkflowKeys())
if err != nil {
return nil, err
}
defer rows.Close()
out := make([]Definition, 0, 3)
for rows.Next() {
var d Definition
if err := rows.Scan(&d.ID, &d.Key, &d.Name, &d.Description, &d.Status, &d.LatestPublishedVersion, &d.ProductDomain,
&d.ProjectSelectable, &d.CatalogOrder, &d.CreatedAt, &d.UpdatedAt); err != nil {
return nil, err
}
if !IsOfficialWorkflowKey(d.Key) {
continue
}
if !d.ProjectSelectable {
d.ProjectSelectable = true
}
if d.Name == "" || d.Name == d.Key {
d.Name = OfficialWorkflowName(d.Key)
}
out = append(out, d)
}
return out, rows.Err()
}
// RetireNonOfficialDefinitions 将非三正式定义标记为不可选。
func (s *Store) RetireNonOfficialDefinitions(ctx context.Context) error {
if !s.enabled() {
return ErrNotAvailable
}
_, err := s.pool.Exec(ctx, `
UPDATE workflow_definitions
SET project_selectable = false, status = 'retired', updated_at = now()
WHERE def_key <> ALL($1)
`, OfficialWorkflowKeys())
if err != nil {
return err
}
_, err = s.pool.Exec(ctx, `
UPDATE workflow_definitions
SET project_selectable = true,
catalog_order = CASE def_key
WHEN 'main' THEN 10
WHEN 'product_manager' THEN 20
WHEN 'test_manager' THEN 30
ELSE catalog_order
END,
updated_at = now()
WHERE def_key = ANY($1)
`, OfficialWorkflowKeys())
return err
}