mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-05-07 01:35:00 +08:00
Merge pull request #6 from YspCoder/codex/clawgo
fix(cron): preserve reminder delivery target from session context
This commit is contained in:
@@ -387,9 +387,13 @@ func (al *AgentLoop) tryFallbackProviders(ctx context.Context, msg bus.InboundMe
|
|||||||
|
|
||||||
func (al *AgentLoop) setSessionProvider(sessionKey, provider string) {
|
func (al *AgentLoop) setSessionProvider(sessionKey, provider string) {
|
||||||
key := strings.TrimSpace(sessionKey)
|
key := strings.TrimSpace(sessionKey)
|
||||||
if key == "" { return }
|
if key == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
provider = strings.TrimSpace(provider)
|
provider = strings.TrimSpace(provider)
|
||||||
if provider == "" { return }
|
if provider == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
al.providerMu.Lock()
|
al.providerMu.Lock()
|
||||||
al.sessionProvider[key] = provider
|
al.sessionProvider[key] = provider
|
||||||
al.providerMu.Unlock()
|
al.providerMu.Unlock()
|
||||||
@@ -397,7 +401,9 @@ func (al *AgentLoop) setSessionProvider(sessionKey, provider string) {
|
|||||||
|
|
||||||
func (al *AgentLoop) getSessionProvider(sessionKey string) string {
|
func (al *AgentLoop) getSessionProvider(sessionKey string) string {
|
||||||
key := strings.TrimSpace(sessionKey)
|
key := strings.TrimSpace(sessionKey)
|
||||||
if key == "" { return "" }
|
if key == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
al.providerMu.RLock()
|
al.providerMu.RLock()
|
||||||
v := al.sessionProvider[key]
|
v := al.sessionProvider[key]
|
||||||
al.providerMu.RUnlock()
|
al.providerMu.RUnlock()
|
||||||
@@ -703,6 +709,11 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage)
|
|||||||
st.SetContext(msg.Channel, msg.ChatID)
|
st.SetContext(msg.Channel, msg.ChatID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if tool, ok := al.tools.Get("remind"); ok {
|
||||||
|
if rt, ok := tool.(*tools.RemindTool); ok {
|
||||||
|
rt.SetContext(msg.Channel, msg.ChatID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
history := al.sessions.GetHistory(msg.SessionKey)
|
history := al.sessions.GetHistory(msg.SessionKey)
|
||||||
summary := al.sessions.GetSummary(msg.SessionKey)
|
summary := al.sessions.GetSummary(msg.SessionKey)
|
||||||
|
|||||||
@@ -9,13 +9,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type RemindTool struct {
|
type RemindTool struct {
|
||||||
cs *cron.CronService
|
cs *cron.CronService
|
||||||
|
defaultChannel string
|
||||||
|
defaultChatID string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRemindTool(cs *cron.CronService) *RemindTool {
|
func NewRemindTool(cs *cron.CronService) *RemindTool {
|
||||||
return &RemindTool{cs: cs}
|
return &RemindTool{cs: cs}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *RemindTool) SetContext(channel, chatID string) {
|
||||||
|
t.defaultChannel = channel
|
||||||
|
t.defaultChatID = chatID
|
||||||
|
}
|
||||||
|
|
||||||
func (t *RemindTool) Name() string {
|
func (t *RemindTool) Name() string {
|
||||||
return "remind"
|
return "remind"
|
||||||
}
|
}
|
||||||
@@ -63,7 +70,7 @@ func (t *RemindTool) Execute(ctx context.Context, args map[string]interface{}) (
|
|||||||
Kind: "at",
|
Kind: "at",
|
||||||
AtMS: &at,
|
AtMS: &at,
|
||||||
}
|
}
|
||||||
job, err := t.cs.AddJob("Reminder", schedule, message, true, "", "") // deliver=true, channel="" means default
|
job, err := t.cs.AddJob("Reminder", schedule, message, true, t.defaultChannel, t.defaultChatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to schedule reminder: %w", err)
|
return "", fmt.Errorf("failed to schedule reminder: %w", err)
|
||||||
}
|
}
|
||||||
@@ -113,7 +120,7 @@ func (t *RemindTool) Execute(ctx context.Context, args map[string]interface{}) (
|
|||||||
AtMS: &at,
|
AtMS: &at,
|
||||||
}
|
}
|
||||||
|
|
||||||
job, err := t.cs.AddJob("Reminder", schedule, message, true, "", "")
|
job, err := t.cs.AddJob("Reminder", schedule, message, true, t.defaultChannel, t.defaultChatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to schedule reminder: %w", err)
|
return "", fmt.Errorf("failed to schedule reminder: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
39
pkg/tools/remind_test.go
Normal file
39
pkg/tools/remind_test.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"clawgo/pkg/cron"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRemindTool_UsesToolContextForDeliveryTarget(t *testing.T) {
|
||||||
|
storePath := filepath.Join(t.TempDir(), "jobs.json")
|
||||||
|
cs := cron.NewCronService(storePath, nil)
|
||||||
|
tool := NewRemindTool(cs)
|
||||||
|
tool.SetContext("telegram", "chat-123")
|
||||||
|
|
||||||
|
_, err := tool.Execute(context.Background(), map[string]interface{}{
|
||||||
|
"message": "喝水",
|
||||||
|
"time_expr": "10m",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Execute returned error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
jobs := cs.ListJobs(true)
|
||||||
|
if len(jobs) != 1 {
|
||||||
|
t.Fatalf("expected 1 job, got %d", len(jobs))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !jobs[0].Payload.Deliver {
|
||||||
|
t.Fatalf("expected deliver=true")
|
||||||
|
}
|
||||||
|
if jobs[0].Payload.Channel != "telegram" {
|
||||||
|
t.Fatalf("expected channel telegram, got %q", jobs[0].Payload.Channel)
|
||||||
|
}
|
||||||
|
if jobs[0].Payload.To != "chat-123" {
|
||||||
|
t.Fatalf("expected to chat-123, got %q", jobs[0].Payload.To)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user