picoclaw/pkg/evolution/profile_sync.go
2026-05-09 15:24:52 +08:00

69 lines
2 KiB
Go

package evolution
import (
"strings"
"time"
)
func SaveAppliedProfile(store *Store, workspace string, draft SkillDraft, now time.Time) error {
return store.UpdateProfile(workspace, draft.TargetSkillName, func(profile *SkillProfile, exists bool) error {
if !exists {
*profile = SkillProfile{
SkillName: draft.TargetSkillName,
WorkspaceID: workspace,
Origin: "evolved",
}
}
profile.SkillName = draft.TargetSkillName
profile.WorkspaceID = workspace
profile.CurrentVersion = draft.ID
profile.Status = SkillStatusActive
profile.Origin = profileOrigin(profile.Origin)
profile.HumanSummary = draft.HumanSummary
profile.ChangeReason = draft.HumanSummary
profile.IntendedUseCases = append([]string(nil), draft.IntendedUseCases...)
profile.PreferredEntryPath = append([]string(nil), draft.PreferredEntryPath...)
profile.AvoidPatterns = append([]string(nil), draft.AvoidPatterns...)
profile.LastUsedAt = now
if profile.RetentionScore <= 0 {
profile.RetentionScore = 1
}
profile.VersionHistory = append(profile.VersionHistory, SkillVersionEntry{
Version: draft.ID,
Action: string(draft.ChangeKind),
Timestamp: now,
DraftID: draft.ID,
Summary: draft.HumanSummary,
})
return nil
})
}
func inferIntendedUseCases(rule LearningRecord) []string {
summary := strings.TrimSpace(rule.Summary)
if summary == "" {
return nil
}
return []string{summary}
}
func inferPreferredEntryPath(rule LearningRecord) []string {
if len(rule.WinningPath) == 0 {
return nil
}
return append([]string(nil), rule.WinningPath...)
}
func inferAvoidPatterns(rule LearningRecord) []string {
if len(rule.LateAddedSkills) == 0 || len(rule.WinningPath) <= len(rule.LateAddedSkills) {
return nil
}
prefix := rule.WinningPath[:len(rule.WinningPath)-len(rule.LateAddedSkills)]
if len(prefix) == 0 {
return nil
}
return []string{
"avoid starting with " + strings.Join(prefix, " -> ") + " before using " + strings.Join(rule.LateAddedSkills, " -> "),
}
}