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