@ynhcj/xiaoyi 2.3.9 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/channel.js CHANGED
@@ -214,8 +214,13 @@ exports.xiaoyiPlugin = {
214
214
  const { getXiaoYiRuntime } = require("./runtime");
215
215
  const runtime = getXiaoYiRuntime();
216
216
  console.log(`XiaoYi: [Message Handler] Using runtime instance: ${runtime.getInstanceId()}`);
217
- // For message/stream, prioritize params.sessionId, fallback to top-level sessionid
218
- const sessionId = message.params.sessionId || message.sessionid;
217
+ // For message/stream, prioritize params.sessionId, fallback to top-level sessionId
218
+ const sessionId = message.params?.sessionId || message.sessionId;
219
+ // Validate sessionId exists
220
+ if (!sessionId) {
221
+ console.error("XiaoYi: Missing sessionId in message, cannot process");
222
+ return;
223
+ }
219
224
  // Store sessionId -> taskId mapping in runtime (use params.id as taskId)
220
225
  runtime.setTaskIdForSession(sessionId, message.params.id);
221
226
  // Get PluginRuntime from our runtime wrapper
package/dist/types.d.ts CHANGED
@@ -4,9 +4,11 @@ export interface A2ARequestMessage {
4
4
  id: string;
5
5
  method: "message/stream";
6
6
  deviceId?: string;
7
+ conversationId?: string;
8
+ sessionId?: string;
7
9
  params: {
8
10
  id: string;
9
- sessionId: string;
11
+ sessionId?: string;
10
12
  agentLoginSessionId?: string;
11
13
  message: {
12
14
  kind?: string;
@@ -53,7 +53,7 @@ export declare class XiaoYiWebSocketManager extends EventEmitter {
53
53
  /**
54
54
  * Extract sessionId from message based on method type
55
55
  * Different methods have sessionId in different locations:
56
- * - message/stream: sessionId ONLY in params
56
+ * - message/stream: sessionId in params, fallback to top-level sessionId
57
57
  * - tasks/cancel: sessionId at top level
58
58
  * - clearContext: sessionId at top level
59
59
  */
@@ -136,7 +136,7 @@ export declare class XiaoYiWebSocketManager extends EventEmitter {
136
136
  private clearStableConnectionCheck;
137
137
  /**
138
138
  * Type guard for A2A request messages
139
- * For message/stream, sessionId MUST be in params
139
+ * sessionId can be in params OR at top level (fallback)
140
140
  */
141
141
  private isA2ARequestMessage;
142
142
  /**
package/dist/websocket.js CHANGED
@@ -306,14 +306,14 @@ class XiaoYiWebSocketManager extends events_1.EventEmitter {
306
306
  /**
307
307
  * Extract sessionId from message based on method type
308
308
  * Different methods have sessionId in different locations:
309
- * - message/stream: sessionId ONLY in params
309
+ * - message/stream: sessionId in params, fallback to top-level sessionId
310
310
  * - tasks/cancel: sessionId at top level
311
311
  * - clearContext: sessionId at top level
312
312
  */
313
313
  extractSessionId(message) {
314
- // For message/stream, sessionId is ONLY in params
314
+ // For message/stream, prioritize params.sessionId, fallback to top-level sessionId
315
315
  if (message.method === "message/stream") {
316
- return message.params?.sessionId;
316
+ return message.params?.sessionId || message.sessionId;
317
317
  }
318
318
  // For tasks/cancel and clearContext, sessionId is at top level
319
319
  if (message.method === "tasks/cancel" ||
@@ -361,9 +361,10 @@ class XiaoYiWebSocketManager extends events_1.EventEmitter {
361
361
  }
362
362
  // Handle regular A2A request
363
363
  if (this.isA2ARequestMessage(message)) {
364
- // Store task for potential cancellation
364
+ // Store task for potential cancellation (support params.sessionId or top-level sessionId)
365
+ const sessionId = message.params?.sessionId || message.sessionId;
365
366
  this.activeTasks.set(message.id, {
366
- sessionId: message.params.sessionId,
367
+ sessionId: sessionId,
367
368
  timestamp: Date.now(),
368
369
  });
369
370
  // Emit with server info
@@ -798,7 +799,7 @@ class XiaoYiWebSocketManager extends events_1.EventEmitter {
798
799
  }
799
800
  /**
800
801
  * Type guard for A2A request messages
801
- * For message/stream, sessionId MUST be in params
802
+ * sessionId can be in params OR at top level (fallback)
802
803
  */
803
804
  isA2ARequestMessage(data) {
804
805
  return data &&
@@ -808,8 +809,8 @@ class XiaoYiWebSocketManager extends events_1.EventEmitter {
808
809
  data.method === "message/stream" &&
809
810
  data.params &&
810
811
  typeof data.params.id === "string" &&
811
- // For message/stream, sessionId MUST be in params
812
- typeof data.params.sessionId === "string" &&
812
+ // sessionId can be in params OR at top level
813
+ (typeof data.params.sessionId === "string" || typeof data.sessionId === "string") &&
813
814
  data.params.message &&
814
815
  typeof data.params.message.role === "string" &&
815
816
  Array.isArray(data.params.message.parts);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ynhcj/xiaoyi",
3
- "version": "2.3.9",
3
+ "version": "2.4.1",
4
4
  "description": "XiaoYi channel plugin for OpenClaw",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",