package state import ( "fmt" "os" "time" "github.com/voocel/ainovel-cli/domain" ) // SaveRunMeta 保存运行元信息到 meta/run.json。 func (s *Store) SaveRunMeta(meta domain.RunMeta) error { s.mu.Lock() defer s.mu.Unlock() return s.saveRunMetaUnlocked(meta) } // LoadRunMeta 读取运行元信息。 func (s *Store) LoadRunMeta() (*domain.RunMeta, error) { s.mu.RLock() defer s.mu.RUnlock() return s.loadRunMetaUnlocked() } func (s *Store) loadRunMetaUnlocked() (*domain.RunMeta, error) { var meta domain.RunMeta if err := s.readJSONUnlocked("meta/run.json", &meta); err != nil { if os.IsNotExist(err) { return nil, nil } return nil, err } return &meta, nil } func (s *Store) saveRunMetaUnlocked(meta domain.RunMeta) error { return s.writeJSONUnlocked("meta/run.json", meta) } // InitRunMeta 初始化或更新运行元信息,保留已有的 SteerHistory。 func (s *Store) InitRunMeta(style, provider, model string) error { return s.withWriteLock(func() error { existing, err := s.loadRunMetaUnlocked() if err != nil { return err } meta := domain.RunMeta{ StartedAt: time.Now().Format(time.RFC3339), Provider: provider, Style: style, Model: model, } if existing != nil { meta.SteerHistory = existing.SteerHistory meta.PendingSteer = existing.PendingSteer meta.PlanningTier = existing.PlanningTier } return s.saveRunMetaUnlocked(meta) }) } // AppendSteerEntry 追加用户干预记录到 meta/run.json。 func (s *Store) AppendSteerEntry(entry domain.SteerEntry) error { return s.withWriteLock(func() error { meta, err := s.loadRunMetaUnlocked() if err != nil { return err } if meta == nil { meta = &domain.RunMeta{} } meta.SteerHistory = append(meta.SteerHistory, entry) return s.saveRunMetaUnlocked(*meta) }) } // SetPendingSteer 记录未完成的 Steer 指令,用于中断恢复。 func (s *Store) SetPendingSteer(input string) error { return s.withWriteLock(func() error { meta, err := s.loadRunMetaUnlocked() if err != nil { return err } if meta == nil { meta = &domain.RunMeta{} } meta.PendingSteer = input return s.saveRunMetaUnlocked(*meta) }) } // ClearPendingSteer 清除已处理的 Steer 指令。 func (s *Store) ClearPendingSteer() error { return s.withWriteLock(func() error { meta, err := s.loadRunMetaUnlocked() if err != nil { return err } if meta == nil || meta.PendingSteer == "" { return nil } meta.PendingSteer = "" return s.saveRunMetaUnlocked(*meta) }) } // SetPlanningTier 记录当前作品采用的规划级别。 func (s *Store) SetPlanningTier(tier domain.PlanningTier) error { return s.withWriteLock(func() error { meta, err := s.loadRunMetaUnlocked() if err != nil { return err } if meta == nil { meta = &domain.RunMeta{} } meta.PlanningTier = tier return s.saveRunMetaUnlocked(*meta) }) } // SaveCheckpoint 保存当前进度快照到 meta/checkpoints/。 func (s *Store) SaveCheckpoint(label string) error { p, err := s.LoadProgress() if err != nil || p == nil { return err } ts := time.Now().Format("20060102-150405") rel := fmt.Sprintf("meta/checkpoints/%s-%s.json", ts, label) return s.writeJSON(rel, p) }