mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
refactor(context): carry route and scope through runtime
This commit is contained in:
@@ -1,19 +1,31 @@
|
||||
package agent
|
||||
|
||||
import "github.com/sipeed/picoclaw/pkg/bus"
|
||||
import (
|
||||
"github.com/sipeed/picoclaw/pkg/bus"
|
||||
"github.com/sipeed/picoclaw/pkg/routing"
|
||||
"github.com/sipeed/picoclaw/pkg/session"
|
||||
)
|
||||
|
||||
// TurnContext carries normalized turn-scoped facts that can be shared across
|
||||
// events, hooks, and other runtime observers without re-parsing legacy fields.
|
||||
type TurnContext struct {
|
||||
Inbound *bus.InboundContext `json:"inbound,omitempty"`
|
||||
Inbound *bus.InboundContext `json:"inbound,omitempty"`
|
||||
Route *routing.ResolvedRoute `json:"route,omitempty"`
|
||||
Scope *session.SessionScope `json:"scope,omitempty"`
|
||||
}
|
||||
|
||||
func newTurnContext(inbound *bus.InboundContext) *TurnContext {
|
||||
if inbound == nil {
|
||||
func newTurnContext(
|
||||
inbound *bus.InboundContext,
|
||||
route *routing.ResolvedRoute,
|
||||
scope *session.SessionScope,
|
||||
) *TurnContext {
|
||||
if inbound == nil && route == nil && scope == nil {
|
||||
return nil
|
||||
}
|
||||
return &TurnContext{
|
||||
Inbound: cloneInboundContext(inbound),
|
||||
Route: cloneResolvedRoute(route),
|
||||
Scope: session.CloneScope(scope),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +35,8 @@ func cloneTurnContext(ctx *TurnContext) *TurnContext {
|
||||
}
|
||||
cloned := *ctx
|
||||
cloned.Inbound = cloneInboundContext(ctx.Inbound)
|
||||
cloned.Route = cloneResolvedRoute(ctx.Route)
|
||||
cloned.Scope = session.CloneScope(ctx.Scope)
|
||||
return &cloned
|
||||
}
|
||||
|
||||
@@ -48,6 +62,31 @@ func cloneStringMap(src map[string]string) map[string]string {
|
||||
}
|
||||
|
||||
func cloneEventMeta(meta EventMeta) EventMeta {
|
||||
meta.Context = cloneTurnContext(meta.Context)
|
||||
meta.turnContext = cloneTurnContext(meta.turnContext)
|
||||
return meta
|
||||
}
|
||||
|
||||
func cloneResolvedRoute(route *routing.ResolvedRoute) *routing.ResolvedRoute {
|
||||
if route == nil {
|
||||
return nil
|
||||
}
|
||||
cloned := *route
|
||||
cloned.SessionPolicy = routing.SessionPolicy{
|
||||
DMScope: route.SessionPolicy.DMScope,
|
||||
IdentityLinks: cloneIdentityLinks(route.SessionPolicy.IdentityLinks),
|
||||
}
|
||||
return &cloned
|
||||
}
|
||||
|
||||
func cloneIdentityLinks(src map[string][]string) map[string][]string {
|
||||
if len(src) == 0 {
|
||||
return nil
|
||||
}
|
||||
cloned := make(map[string][]string, len(src))
|
||||
for canonical, ids := range src {
|
||||
dup := make([]string, len(ids))
|
||||
copy(dup, ids)
|
||||
cloned[canonical] = dup
|
||||
}
|
||||
return cloned
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user