refactor: extract loop.go fork fields into loopExt embedded struct
Move fork-specific AgentLoop fields to loop_ext.go via embedded struct: - stats, sessions, orchBroadcaster, orchReporter - planStartPending, planClearHistory, sessionLocks, activeTasks - done, saveConfig, onHeartbeatThreadUpdate - SetConfigSaver, SetHeartbeatThreadUpdater methods Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
9cdd71420f
commit
fb662b02d3
2 changed files with 56 additions and 42 deletions
|
|
@ -39,6 +39,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type AgentLoop struct {
|
type AgentLoop struct {
|
||||||
|
loopExt // fork-specific fields (see loop_ext.go)
|
||||||
|
|
||||||
bus *bus.MessageBus
|
bus *bus.MessageBus
|
||||||
|
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
|
|
@ -47,8 +49,6 @@ type AgentLoop struct {
|
||||||
|
|
||||||
state *state.Manager
|
state *state.Manager
|
||||||
|
|
||||||
stats *stats.Tracker // nil when --stats not passed
|
|
||||||
|
|
||||||
running atomic.Bool
|
running atomic.Bool
|
||||||
|
|
||||||
summarizing sync.Map
|
summarizing sync.Map
|
||||||
|
|
@ -67,16 +67,6 @@ type AgentLoop struct {
|
||||||
|
|
||||||
providerCache map[string]providers.LLMProvider
|
providerCache map[string]providers.LLMProvider
|
||||||
|
|
||||||
planStartPending bool // set by /plan start to trigger LLM execution
|
|
||||||
|
|
||||||
planClearHistory bool // set by /plan start clear to wipe history on transition
|
|
||||||
|
|
||||||
sessionLocks sync.Map // sessionKey → *sessionSemaphore
|
|
||||||
|
|
||||||
activeTasks sync.Map // sessionKey → *activeTask
|
|
||||||
|
|
||||||
sessions *SessionTracker
|
|
||||||
|
|
||||||
lastSystemPrompt atomic.Value // string — last system prompt sent to LLM
|
lastSystemPrompt atomic.Value // string — last system prompt sent to LLM
|
||||||
|
|
||||||
promptDirty atomic.Bool // true = rebuild needed on next GetSystemPrompt read
|
promptDirty atomic.Bool // true = rebuild needed on next GetSystemPrompt read
|
||||||
|
|
@ -84,16 +74,6 @@ type AgentLoop struct {
|
||||||
OnStateChange func() // called on plan/session/skills mutations
|
OnStateChange func() // called on plan/session/skills mutations
|
||||||
|
|
||||||
OnUserMessage func() // called when a real user message is processed
|
OnUserMessage func() // called when a real user message is processed
|
||||||
|
|
||||||
saveConfig func(*config.Config) error
|
|
||||||
|
|
||||||
onHeartbeatThreadUpdate func(int)
|
|
||||||
|
|
||||||
orchBroadcaster *orch.Broadcaster // nil when --orchestration not set
|
|
||||||
|
|
||||||
orchReporter orch.AgentReporter // always non-nil (Noop when disabled)
|
|
||||||
|
|
||||||
done chan struct{} // closed by Close() to stop background goroutines
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// processOptions configures how a message is processed
|
// processOptions configures how a message is processed
|
||||||
|
|
@ -186,6 +166,14 @@ func NewAgentLoop(
|
||||||
}
|
}
|
||||||
|
|
||||||
al := &AgentLoop{
|
al := &AgentLoop{
|
||||||
|
loopExt: loopExt{
|
||||||
|
stats: statsTracker,
|
||||||
|
sessions: NewSessionTracker(),
|
||||||
|
orchBroadcaster: orchBroadcaster,
|
||||||
|
orchReporter: orchReporter,
|
||||||
|
done: make(chan struct{}),
|
||||||
|
},
|
||||||
|
|
||||||
bus: msgBus,
|
bus: msgBus,
|
||||||
|
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
|
|
@ -194,22 +182,12 @@ func NewAgentLoop(
|
||||||
|
|
||||||
state: stateManager,
|
state: stateManager,
|
||||||
|
|
||||||
stats: statsTracker,
|
|
||||||
|
|
||||||
summarizing: sync.Map{},
|
summarizing: sync.Map{},
|
||||||
|
|
||||||
fallback: fallbackChain,
|
fallback: fallbackChain,
|
||||||
|
|
||||||
providerCache: providerCache,
|
providerCache: providerCache,
|
||||||
|
|
||||||
sessions: NewSessionTracker(),
|
|
||||||
|
|
||||||
orchBroadcaster: orchBroadcaster,
|
|
||||||
|
|
||||||
orchReporter: orchReporter,
|
|
||||||
|
|
||||||
done: make(chan struct{}),
|
|
||||||
|
|
||||||
cmdRegistry: commands.NewRegistry(commands.BuiltinDefinitions()),
|
cmdRegistry: commands.NewRegistry(commands.BuiltinDefinitions()),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -222,16 +200,6 @@ func NewAgentLoop(
|
||||||
return al
|
return al
|
||||||
}
|
}
|
||||||
|
|
||||||
func (al *AgentLoop) SetConfigSaver(fn func(*config.Config) error) {
|
|
||||||
al.saveConfig = fn
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetHeartbeatThreadUpdater registers a callback to apply runtime heartbeat thread updates.
|
|
||||||
|
|
||||||
func (al *AgentLoop) SetHeartbeatThreadUpdater(fn func(int)) {
|
|
||||||
al.onHeartbeatThreadUpdate = fn
|
|
||||||
}
|
|
||||||
|
|
||||||
// registerSharedTools registers tools that are shared across all agents (web, message, spawn).
|
// registerSharedTools registers tools that are shared across all agents (web, message, spawn).
|
||||||
func registerSharedTools(
|
func registerSharedTools(
|
||||||
cfg *config.Config,
|
cfg *config.Config,
|
||||||
|
|
|
||||||
46
pkg/agent/loop_ext.go
Normal file
46
pkg/agent/loop_ext.go
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/sipeed/picoclaw/pkg/config"
|
||||||
|
"github.com/sipeed/picoclaw/pkg/orch"
|
||||||
|
"github.com/sipeed/picoclaw/pkg/stats"
|
||||||
|
)
|
||||||
|
|
||||||
|
// loopExt holds fork-specific fields for AgentLoop.
|
||||||
|
// Embedded in AgentLoop so existing field access (al.stats, al.sessions, etc.) continues to work.
|
||||||
|
// Upstream additions to AgentLoop won't conflict with these fields.
|
||||||
|
type loopExt struct {
|
||||||
|
stats *stats.Tracker // nil when --stats not passed
|
||||||
|
|
||||||
|
sessions *SessionTracker
|
||||||
|
|
||||||
|
orchBroadcaster *orch.Broadcaster // nil when --orchestration not set
|
||||||
|
|
||||||
|
orchReporter orch.AgentReporter // always non-nil (Noop when disabled)
|
||||||
|
|
||||||
|
planStartPending bool // set by /plan start to trigger LLM execution
|
||||||
|
|
||||||
|
planClearHistory bool // set by /plan start clear to wipe history on transition
|
||||||
|
|
||||||
|
sessionLocks sync.Map // sessionKey → *sessionSemaphore
|
||||||
|
|
||||||
|
activeTasks sync.Map // sessionKey → *activeTask
|
||||||
|
|
||||||
|
done chan struct{} // closed by Close() to stop background goroutines
|
||||||
|
|
||||||
|
saveConfig func(*config.Config) error
|
||||||
|
|
||||||
|
onHeartbeatThreadUpdate func(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetConfigSaver registers a callback to persist config changes.
|
||||||
|
func (al *AgentLoop) SetConfigSaver(fn func(*config.Config) error) {
|
||||||
|
al.saveConfig = fn
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHeartbeatThreadUpdater registers a callback to apply runtime heartbeat thread updates.
|
||||||
|
func (al *AgentLoop) SetHeartbeatThreadUpdater(fn func(int)) {
|
||||||
|
al.onHeartbeatThreadUpdate = fn
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue