Files
tutti/packages/agent/daemon/runtime/provider_turn_binding_hooks.go
agent-radar 2ed3415fb7
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
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

115 lines
2.9 KiB
Go

package agentruntime
import (
"context"
"encoding/json"
"errors"
"strings"
)
const providerTurnBindingSchemaVersion = 1
type claudeProviderTurnBinding struct {
SchemaVersion int `json:"schemaVersion"`
CheckpointMessageID string `json:"checkpointMessageId,omitempty"`
}
func (*ClaudeCodeSDKAdapter) WriteProviderTurnBinding(
input ProviderTurnBindingWriteInput,
) (json.RawMessage, error) {
if strings.TrimSpace(input.ProviderTurnID) == "" {
return nil, errors.New("claude provider turn id is required")
}
binding := claudeProviderTurnBinding{
SchemaVersion: providerTurnBindingSchemaVersion,
}
if input.Payload != nil {
binding.CheckpointMessageID = strings.TrimSpace(
stringValue(input.Payload["checkpointMessageId"]),
)
}
return json.Marshal(binding)
}
func (*ClaudeCodeSDKAdapter) CanForkProviderTurn(
_ context.Context,
input ProviderTurnForkabilityInput,
) (bool, error) {
if strings.TrimSpace(input.ProviderTurnID) == "" {
return false, nil
}
var binding claudeProviderTurnBinding
if err := json.Unmarshal(input.ProviderTurnBindingJSON, &binding); err != nil {
return false, nil
}
return binding.SchemaVersion == providerTurnBindingSchemaVersion &&
strings.TrimSpace(binding.CheckpointMessageID) != "", nil
}
type appServerProviderTurnBinding struct {
SchemaVersion int `json:"schemaVersion"`
}
func (*CodexAppServerAdapter) WriteProviderTurnBinding(
input ProviderTurnBindingWriteInput,
) (json.RawMessage, error) {
if strings.TrimSpace(input.ProviderTurnID) == "" {
return nil, errors.New("app-server provider turn id is required")
}
return json.Marshal(appServerProviderTurnBinding{
SchemaVersion: providerTurnBindingSchemaVersion,
})
}
func (*CodexAppServerAdapter) CanForkProviderTurn(
_ context.Context,
input ProviderTurnForkabilityInput,
) (bool, error) {
if strings.TrimSpace(input.ProviderTurnID) == "" {
return false, nil
}
var binding appServerProviderTurnBinding
if err := json.Unmarshal(input.ProviderTurnBindingJSON, &binding); err != nil {
return false, nil
}
return binding.SchemaVersion == providerTurnBindingSchemaVersion, nil
}
func stringValue(value any) string {
result, _ := value.(string)
return result
}
var (
_ ProviderTurnBindingAdapter = (*ClaudeCodeSDKAdapter)(nil)
_ ProviderTurnBindingAdapter = (*CodexAppServerAdapter)(nil)
)
func (c *Controller) providerTurnBindingJSON(
ctx context.Context,
session Session,
input ProviderTurnBindingWriteInput,
) json.RawMessage {
if c == nil {
return nil
}
adapter, err := c.resolveAdapter(ctx, AdapterResolveInput{
Provider: strings.TrimSpace(session.Provider),
AgentTargetID: session.AgentTargetID,
CWD: session.CWD,
ProviderTargetRef: clonePayload(session.ProviderTargetRef),
})
if err != nil {
return nil
}
writer, ok := adapter.(ProviderTurnBindingAdapter)
if !ok {
return nil
}
binding, err := writer.WriteProviderTurnBinding(input)
if err != nil {
return nil
}
return binding
}