Files
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

67 lines
2.0 KiB
Go

package agent
import (
"context"
"errors"
"fmt"
"strings"
agenthost "github.com/tutti-os/tutti/packages/agent/host"
runtimeprep "github.com/tutti-os/tutti/packages/agent/runtimeprep"
storesqlite "github.com/tutti-os/tutti/packages/agent/store-sqlite"
)
type serviceHostSessionForkContextPolicy struct{}
func (serviceHostSessionForkContextPolicy) PrepareSessionForkTargetContext(
_ context.Context,
_ storesqlite.Session,
prepared agenthost.ProviderRuntimeSession,
) (agenthost.SessionForkTargetContext, error) {
return agenthost.SessionForkTargetContext{
Cwd: strings.TrimSpace(prepared.Cwd),
RuntimeContext: clonePayload(prepared.RuntimeContext),
}, nil
}
type serviceHostSessionForkProviderStateBinder struct {
runtimePreparer runtimeprep.Preparer
}
func (b serviceHostSessionForkProviderStateBinder) SupportsSessionForkProviderStateBinding(
provider string,
) bool {
if b.runtimePreparer == nil {
return false
}
binder, ok := b.runtimePreparer.(runtimeprep.SessionForkProviderStateBinder)
return ok && binder.SupportsSessionForkProviderStateBinding(provider)
}
func (b serviceHostSessionForkProviderStateBinder) BindSessionForkProviderState(
ctx context.Context,
input agenthost.SessionForkProviderStateBinding,
) error {
if b.runtimePreparer == nil {
return errors.New("session fork provider state binder is unavailable")
}
binder, ok := b.runtimePreparer.(runtimeprep.SessionForkProviderStateBinder)
if !ok || !binder.SupportsSessionForkProviderStateBinding(input.Provider) {
return fmt.Errorf(
"runtime preparer cannot bind %s session fork provider state",
strings.TrimSpace(input.Provider),
)
}
return binder.BindSessionForkProviderState(
ctx,
runtimeprep.SessionForkProviderStateBindingInput{
WorkspaceID: input.WorkspaceID,
Provider: input.Provider,
SourceAgentSessionID: input.SourceAgentSessionID,
TargetAgentSessionID: input.TargetAgentSessionID,
SourceProviderSessionID: input.SourceProviderSessionID,
TargetProviderSessionID: input.TargetProviderSessionID,
},
)
}