feat: report agent status to remote server from hooks
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package hook
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/longbin/agent-notify/internal/config"
|
||||
"github.com/longbin/agent-notify/internal/hostmeta"
|
||||
"github.com/longbin/agent-notify/internal/logx"
|
||||
"github.com/longbin/agent-notify/internal/remote"
|
||||
"github.com/longbin/agent-notify/internal/transcript"
|
||||
)
|
||||
|
||||
var reportRemoteHook = reportRemote
|
||||
|
||||
func reportRemote(cfg config.Config, agent, event, cwd string, transcriptPath, conversationID string) {
|
||||
if !cfg.Remote.Enabled || cfg.Remote.URL == "" {
|
||||
return
|
||||
}
|
||||
|
||||
hostname, err := hostmeta.Hostname()
|
||||
if err != nil {
|
||||
logx.Append("remote report hostname: %v", err)
|
||||
hostname = ""
|
||||
}
|
||||
ips := hostmeta.IPs()
|
||||
|
||||
var lastUser, lastAgent string
|
||||
if transcriptPath != "" {
|
||||
lastUser, lastAgent, err = transcript.LastMessages(transcriptPath, 2000)
|
||||
if err != nil {
|
||||
logx.Append("remote report transcript: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
timeout := time.Duration(cfg.Remote.TimeoutMS) * time.Millisecond
|
||||
if timeout <= 0 {
|
||||
timeout = 2 * time.Second
|
||||
}
|
||||
report := remote.StatusReport{
|
||||
Hostname: hostname,
|
||||
IPs: ips,
|
||||
Agent: agent,
|
||||
CWD: cwd,
|
||||
Status: eventToStatus(event),
|
||||
Event: event,
|
||||
ConversationID: conversationID,
|
||||
LastUser: lastUser,
|
||||
LastAgent: lastAgent,
|
||||
UpdatedAt: time.Now().UTC(),
|
||||
}
|
||||
|
||||
client := remote.NewClient(remote.ClientConfig{
|
||||
URL: cfg.Remote.URL,
|
||||
Token: cfg.Remote.Token,
|
||||
Timeout: timeout,
|
||||
})
|
||||
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
||||
defer cancel()
|
||||
if err := client.Report(ctx, report); err != nil {
|
||||
logx.Append("remote report failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func eventToStatus(event string) string {
|
||||
switch strings.ToLower(event) {
|
||||
case "stop":
|
||||
return "waiting"
|
||||
case "response":
|
||||
return "running"
|
||||
case "tool":
|
||||
return "tool"
|
||||
case "idle":
|
||||
return "idle"
|
||||
default:
|
||||
return "waiting"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user