Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package storesqlite
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
// HasPersistedProviderTurnBinding performs only provider-neutral persistence
|
|
// checks. The owning Agent's CanForkProviderTurn hook is authoritative.
|
|
func HasPersistedProviderTurnBinding(turn Turn) bool {
|
|
turnID := strings.TrimSpace(turn.TurnID)
|
|
providerTurnID := strings.TrimSpace(turn.RootProviderTurnID)
|
|
if turnID == "" || providerTurnID == "" || providerTurnID == turnID {
|
|
return false
|
|
}
|
|
var payload map[string]any
|
|
return len(turn.ProviderTurnBindingJSON) > 0 &&
|
|
json.Unmarshal(turn.ProviderTurnBindingJSON, &payload) == nil &&
|
|
len(payload) > 0
|
|
}
|
|
|
|
func normalizeProviderTurnBindingJSON(raw json.RawMessage) (json.RawMessage, error) {
|
|
if len(raw) == 0 {
|
|
return nil, nil
|
|
}
|
|
var payload map[string]any
|
|
if err := json.Unmarshal(raw, &payload); err != nil || payload == nil {
|
|
return nil, errors.New("provider turn binding must be a JSON object")
|
|
}
|
|
normalized, err := json.Marshal(payload)
|
|
if err != nil {
|
|
return nil, errors.New("encode provider turn binding")
|
|
}
|
|
return normalized, nil
|
|
}
|
|
|
|
func firstNonEmptyJSON(raw json.RawMessage) json.RawMessage {
|
|
if len(raw) == 0 {
|
|
return json.RawMessage(`{}`)
|
|
}
|
|
return raw
|
|
}
|