feat: fix Cursor hook delivery and improve notify workflow
Route hook notifications through /dev/tty and client_tty so OSC reaches Ghostty when Cursor captures stdout. Add afterAgentResponse hook, hook logging, debounce, split test modes, and use directory name for titles. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+19
-3
@@ -6,12 +6,14 @@ import (
|
||||
|
||||
"github.com/longbin/agent-notify/internal/config"
|
||||
"github.com/longbin/agent-notify/internal/context"
|
||||
"github.com/longbin/agent-notify/internal/logx"
|
||||
"github.com/longbin/agent-notify/internal/notify"
|
||||
)
|
||||
|
||||
type claudePayload struct {
|
||||
StopHookActive bool `json:"stop_hook_active"`
|
||||
Message string `json:"message"`
|
||||
HookEventName string `json:"hook_event_name"`
|
||||
}
|
||||
|
||||
type claudeResponse struct {
|
||||
@@ -19,13 +21,22 @@ type claudeResponse struct {
|
||||
}
|
||||
|
||||
func RunClaude(r io.Reader, cfg config.Config, event string, w io.Writer) error {
|
||||
var payload claudePayload
|
||||
decodeJSON(r, &payload)
|
||||
hookName := payload.HookEventName
|
||||
if hookName == "" {
|
||||
hookName = event
|
||||
}
|
||||
logx.Append("hook claude event=%s hook_event_name=%s enabled=%v stop_hook_active=%v",
|
||||
event, hookName, cfg.EventEnabled(event), payload.StopHookActive)
|
||||
|
||||
if !cfg.EventEnabled(event) {
|
||||
logx.Append("hook claude event=%s skipped (disabled in config)", event)
|
||||
_, err := io.WriteString(w, "{}\n")
|
||||
return err
|
||||
}
|
||||
var payload claudePayload
|
||||
_ = json.NewDecoder(r).Decode(&payload)
|
||||
if event == "stop" && payload.StopHookActive {
|
||||
logx.Append("hook claude event=stop skipped (stop_hook_active)")
|
||||
_, err := io.WriteString(w, "{}\n")
|
||||
return err
|
||||
}
|
||||
@@ -37,5 +48,10 @@ func RunClaude(r io.Reader, cfg config.Config, event string, w io.Writer) error
|
||||
resp := claudeResponse{TerminalSequence: seq}
|
||||
enc := json.NewEncoder(w)
|
||||
enc.SetEscapeHTML(false)
|
||||
return enc.Encode(resp)
|
||||
if err := enc.Encode(resp); err != nil {
|
||||
logx.Append("hook claude event=%s encode FAILED: %v", event, err)
|
||||
return err
|
||||
}
|
||||
logx.Append("hook claude event=%s terminalSequence OK title=%q", event, title)
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user