소스 검색

fix:修复无法取消问题

Jerry Liang 2 달 전
부모
커밋
7eeb5617b4
1개의 변경된 파일과 35개의 추가작업 그리고 2개의 파일을 삭제
  1. 35 2
      service/utils/acp/acp.go

+ 35 - 2
service/utils/acp/acp.go

@@ -491,6 +491,8 @@ func (c *Client) Prompt(sessionId string, message string, eventCh chan<- Event)
 			continue
 		}
 
+		zap.L().Debug("[ACP] <<< 收到", zap.String("raw", line[:min(len(line), 500)]))
+
 		// 用宽松结构解析,兼容所有消息格式
 		var msg struct {
 			JSONRPC string          `json:"jsonrpc"`
@@ -556,9 +558,9 @@ func (c *Client) Prompt(sessionId string, message string, eventCh chan<- Event)
 	eventCh <- Event{Type: "error", Content: "Agent 进程已断开"}
 }
 
-// Cancel 取消当前操作
+// Cancel 取消当前 prompt turn(ACP 协议:Notification, method="session/cancel", params={sessionId})
 func (c *Client) Cancel(sessionId string) {
-	c.sendRequest("session/cancel", CancelParams{SessionId: sessionId})
+	c.sendNotification("session/cancel", CancelParams{SessionId: sessionId})
 }
 
 // GetSessionId 获取当前会话 ID
@@ -616,6 +618,8 @@ func (c *Client) sendRequest(method string, params any) int64 {
 		return id
 	}
 
+	zap.L().Debug("[ACP] >>> 发送", zap.String("raw", string(data)))
+
 	data = append(data, '\n')
 	if _, err := c.stdin.Write(data); err != nil {
 		zap.L().Error("[ACP] 写入 stdin 失败", zap.String("method", method), zap.Error(err))
@@ -624,6 +628,35 @@ func (c *Client) sendRequest(method string, params any) int64 {
 	return id
 }
 
+// sendNotification 发送 JSON-RPC Notification(不带 id,不期望响应)
+func (c *Client) sendNotification(method string, params any) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+
+	notif := struct {
+		JSONRPC string `json:"jsonrpc"`
+		Method  string `json:"method"`
+		Params  any    `json:"params,omitempty"`
+	}{
+		JSONRPC: "2.0",
+		Method:  method,
+		Params:  params,
+	}
+
+	data, err := json.Marshal(notif)
+	if err != nil {
+		zap.L().Error("[ACP] 序列化通知失败", zap.Error(err))
+		return
+	}
+
+	zap.L().Debug("[ACP] >>> 发送(notification)", zap.String("raw", string(data)))
+
+	data = append(data, '\n')
+	if _, err := c.stdin.Write(data); err != nil {
+		zap.L().Error("[ACP] 写入 stdin 失败(通知)", zap.String("method", method), zap.Error(err))
+	}
+}
+
 // sendAndWait 发送请求并等待对应 ID 的响应
 func (c *Client) sendAndWait(method string, params any) (json.RawMessage, error) {
 	id := c.sendRequest(method, params)