vibe-proxy/backend/sdk/cliproxy/executionregistry/observation.go
2026-08-24 00:10:41 +02:00

74 lines
1.7 KiB
Go

package executionregistry
import "time"
// Observation is an immutable in-flight execution snapshot entry.
type Observation struct {
RequestID string
CredentialID string
Model string
RequestKind string
StartedAt time.Time
Accounted bool
}
// Freeze is an immutable in-flight execution snapshot.
type Freeze struct {
Revision int64
BarrierRevision int64
Executions []Observation
}
// ObserveBarrier records the latest Home observation barrier.
func (r *Registry) ObserveBarrier(revision int64) {
if r == nil || revision <= 0 {
return
}
r.mu.Lock()
defer r.mu.Unlock()
if revision > r.observedBarrier {
r.observedBarrier = revision
r.pendingBarrierSequence = r.next
}
}
// FreezeInFlight copies all active executions into an immutable snapshot.
func (r *Registry) FreezeInFlight(_ time.Time) Freeze {
if r == nil {
return Freeze{}
}
r.mu.Lock()
defer r.mu.Unlock()
if r.observedBarrier > r.publishedBarrier {
blocked := false
for sequence := range r.pending {
if sequence <= r.pendingBarrierSequence {
blocked = true
break
}
}
if !blocked {
r.publishedBarrier = r.observedBarrier
}
}
r.snapshotRevision++
freeze := Freeze{
Revision: r.snapshotRevision,
BarrierRevision: r.publishedBarrier,
Executions: make([]Observation, 0, len(r.scopes)),
}
for _, scope := range r.scopes {
freeze.Executions = append(freeze.Executions, Observation{
RequestID: scope.spec.RequestID,
CredentialID: scope.spec.CredentialID,
Model: scope.spec.Model,
RequestKind: scope.spec.Kind,
StartedAt: scope.spec.StartedAt,
Accounted: scope.spec.Accounted,
})
}
return freeze
}