@ynhcj/xiaoyi-channel 0.0.131-beta → 0.0.131-next

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.
Files changed (74) hide show
  1. package/dist/index.js +36 -7
  2. package/dist/src/bot.d.ts +8 -0
  3. package/dist/src/bot.js +277 -139
  4. package/dist/src/client.d.ts +1 -5
  5. package/dist/src/client.js +25 -39
  6. package/dist/src/cspl/call-api.d.ts +6 -0
  7. package/dist/src/cspl/call-api.js +33 -13
  8. package/dist/src/cspl/config.d.ts +11 -1
  9. package/dist/src/cspl/config.js +30 -0
  10. package/dist/src/cspl/middleware.d.ts +8 -0
  11. package/dist/src/cspl/middleware.js +90 -0
  12. package/dist/src/cspl/steer-context.d.ts +21 -0
  13. package/dist/src/cspl/steer-context.js +78 -0
  14. package/dist/src/file-download.js +3 -3
  15. package/dist/src/formatter.d.ts +0 -2
  16. package/dist/src/formatter.js +12 -14
  17. package/dist/src/heartbeat.js +3 -2
  18. package/dist/src/login-token-handler.js +13 -10
  19. package/dist/src/message-queue.js +2 -1
  20. package/dist/src/monitor.js +55 -46
  21. package/dist/src/outbound.js +3 -0
  22. package/dist/src/provider.js +85 -64
  23. package/dist/src/push.js +9 -9
  24. package/dist/src/reply-dispatcher.d.ts +4 -1
  25. package/dist/src/reply-dispatcher.js +68 -68
  26. package/dist/src/self-evolution-handler.js +11 -14
  27. package/dist/src/skill-retriever/hooks.js +0 -1
  28. package/dist/src/skill-retriever/tool-search.js +7 -12
  29. package/dist/src/task-manager.d.ts +4 -27
  30. package/dist/src/task-manager.js +13 -78
  31. package/dist/src/tools/calendar-tool.js +5 -1
  32. package/dist/src/tools/call-phone-tool.js +5 -1
  33. package/dist/src/tools/create-alarm-tool.js +5 -1
  34. package/dist/src/tools/delete-alarm-tool.js +5 -1
  35. package/dist/src/tools/location-tool.js +5 -1
  36. package/dist/src/tools/login-token-tool.js +13 -2
  37. package/dist/src/tools/modify-alarm-tool.js +5 -1
  38. package/dist/src/tools/modify-note-tool.js +5 -1
  39. package/dist/src/tools/note-tool.js +5 -1
  40. package/dist/src/tools/query-app-message-tool.js +5 -1
  41. package/dist/src/tools/query-memory-data-tool.js +5 -1
  42. package/dist/src/tools/query-todo-task-tool.js +5 -1
  43. package/dist/src/tools/save-file-to-phone-tool.js +5 -1
  44. package/dist/src/tools/save-media-to-gallery-tool.js +5 -1
  45. package/dist/src/tools/search-alarm-tool.js +5 -1
  46. package/dist/src/tools/search-calendar-tool.js +5 -1
  47. package/dist/src/tools/search-contact-tool.js +5 -1
  48. package/dist/src/tools/search-email-tool.js +5 -1
  49. package/dist/src/tools/search-file-tool.js +5 -1
  50. package/dist/src/tools/search-message-tool.js +5 -1
  51. package/dist/src/tools/search-note-tool.js +5 -1
  52. package/dist/src/tools/search-photo-gallery-tool.js +5 -1
  53. package/dist/src/tools/send-email-tool.js +5 -1
  54. package/dist/src/tools/send-file-to-user-tool.js +0 -1
  55. package/dist/src/tools/send-message-tool.js +5 -1
  56. package/dist/src/tools/session-helper.d.ts +24 -0
  57. package/dist/src/tools/session-helper.js +45 -0
  58. package/dist/src/tools/session-manager.d.ts +8 -0
  59. package/dist/src/tools/session-manager.js +3 -15
  60. package/dist/src/tools/upload-file-tool.js +5 -1
  61. package/dist/src/tools/upload-photo-tool.js +5 -1
  62. package/dist/src/tools/xiaoyi-add-collection-tool.js +5 -1
  63. package/dist/src/tools/xiaoyi-collection-tool.js +5 -1
  64. package/dist/src/tools/xiaoyi-delete-collection-tool.js +5 -1
  65. package/dist/src/tools/xiaoyi-gui-tool.js +3 -1
  66. package/dist/src/trigger-handler.js +8 -9
  67. package/dist/src/utils/logger.js +106 -22
  68. package/dist/src/utils/throw.d.ts +5 -0
  69. package/dist/src/utils/throw.js +10 -0
  70. package/dist/src/websocket.js +4 -2
  71. package/dist/src/xy-session-store.d.ts +79 -0
  72. package/dist/src/xy-session-store.js +153 -0
  73. package/openclaw.plugin.json +3 -0
  74. package/package.json +6 -5
package/dist/index.js CHANGED
@@ -1,11 +1,14 @@
1
1
  import { definePluginEntry } from "openclaw/plugin-sdk/core";
2
2
  import { xiaoyiProvider } from "./src/provider.js";
3
3
  import { xyPlugin } from "./src/channel.js";
4
- import { callCsplApi } from "./src/cspl/call-api.js";
4
+ import { callCsplApiWithConfig } from "./src/cspl/call-api.js";
5
+ import { getCsplConfig, initCsplConfigFromXYConfig } from "./src/cspl/config.js";
5
6
  import { ALLOWED_TOOLS, MAX_TEXT_LENGTH, MAX_TOTAL_LENGTH, MIN_TEXT_LENGTH, STEER_ABORT_MESSAGE, } from "./src/cspl/constants.js";
6
7
  import { extractResultText, parseSecurityResult, processText, validateAndTruncateText, } from "./src/cspl/utils.js";
8
+ import { tryInjectSteer } from "./src/cspl/steer-context.js";
9
+ import { getSessionContext } from "./src/tools/session-manager.js";
10
+ import { logger } from "./src/utils/logger.js";
7
11
  import { setXYRuntime } from "./src/runtime.js";
8
- import { tryInjectSteer } from "./src/steer-injector.js";
9
12
  import { registerSelfEvolutionToolResultNudge } from "./src/self-evolution-tool-result-nudge.js";
10
13
  import { createBeforePromptBuildHandler } from "./src/skill-retriever/hooks.js";
11
14
  import { normalizeToolRetrieverConfig } from "./src/skill-retriever/config.js";
@@ -22,17 +25,25 @@ function registerFullHooks(api) {
22
25
  const beforePromptBuildHandler = createBeforePromptBuildHandler(skillRetrieverConfig);
23
26
  api.on("before_prompt_build", beforePromptBuildHandler);
24
27
  registerSelfEvolutionToolResultNudge(api);
28
+ }
29
+ function registerCsplHook(api) {
30
+ // CSPL security scanning via after_tool_call hook.
31
+ // When CSPL returns REJECT, injects a steer message via tryInjectSteer
32
+ // to interrupt the agent. Uses skipRegistration to avoid refCount leaks
33
+ // and taskId overwrites.
34
+ // Only registered in "full" mode because it depends on handleXYMessage
35
+ // having cached cfg/runtime via setCsplSteerContext.
25
36
  api.on("after_tool_call", async (event, ctx) => {
26
37
  if (!ALLOWED_TOOLS.includes(event.toolName)) {
27
38
  return;
28
39
  }
29
- console.log(`[SENTINEL HOOK] after_tool_call triggered: toolName=${event.toolName}, sessionKey=${ctx.sessionKey ?? "none"}`);
30
40
  try {
31
41
  const resultText = extractResultText(event, event.toolName);
32
42
  const resultLength = resultText.length;
33
43
  if (resultLength <= MIN_TEXT_LENGTH || resultLength > MAX_TOTAL_LENGTH) {
34
44
  return;
35
45
  }
46
+ logger.log(`[SENTINEL HOOK] after_tool_call: toolName=${event.toolName}, textLength=${resultLength}`);
36
47
  const questionText = {
37
48
  subSceneID: "TOOL_OUTPUT",
38
49
  tool: event.toolName,
@@ -47,15 +58,32 @@ function registerFullHooks(api) {
47
58
  questionText.output[0].content = trimmed;
48
59
  finalJson = JSON.stringify(questionText);
49
60
  }
50
- const response = await callCsplApi(finalJson, api.config);
61
+ const sessionCtx = getSessionContext(ctx.sessionKey ?? "");
62
+ const csplConfig = sessionCtx
63
+ ? initCsplConfigFromXYConfig(sessionCtx.config)
64
+ : getCsplConfig();
65
+ const csplStartTime = Date.now();
66
+ const response = await callCsplApiWithConfig(finalJson, csplConfig);
67
+ const csplElapsed = Date.now() - csplStartTime;
51
68
  const result = parseSecurityResult(response);
52
- console.log(`[SENTINEL HOOK] Security result: status=${result.status}`);
69
+ logger.log(`[SENTINEL HOOK] Security result: status=${result.status}, toolName=${event.toolName}, elapsed=${csplElapsed}ms`);
53
70
  if (result.status === "REJECT") {
54
- await tryInjectSteer(ctx.sessionKey, STEER_ABORT_MESSAGE);
71
+ logger.log(`[SENTINEL HOOK] REJECT - injecting steer via tryInjectSteer`);
72
+ if (sessionCtx) {
73
+ await tryInjectSteer({
74
+ sessionId: sessionCtx.sessionId,
75
+ taskId: sessionCtx.taskId,
76
+ message: STEER_ABORT_MESSAGE,
77
+ source: "cspl",
78
+ });
79
+ }
80
+ else {
81
+ logger.error("[SENTINEL HOOK] No session context, cannot inject steer");
82
+ }
55
83
  }
56
84
  }
57
85
  catch (err) {
58
- api.logger.error(`[SENTINEL HOOK] after_tool_call error: ${err}`);
86
+ logger.error(`[SENTINEL HOOK] after_tool_call error: ${err}`);
59
87
  }
60
88
  });
61
89
  }
@@ -82,6 +110,7 @@ export default definePluginEntry({
82
110
  }
83
111
  if (api.registrationMode === "full") {
84
112
  registerFullHooks(api);
113
+ registerCsplHook(api);
85
114
  }
86
115
  },
87
116
  });
package/dist/src/bot.d.ts CHANGED
@@ -9,6 +9,14 @@ export interface HandleXYMessageParams {
9
9
  message: A2AJsonRpcRequest;
10
10
  accountId: string;
11
11
  webSocketSessionId?: string;
12
+ /** Called after dispatch init is complete (agentTools/wrapStreamFn done). */
13
+ onInitComplete?: () => void;
14
+ /**
15
+ * When true, skip taskId/session registration. Used by tryInjectSteer to
16
+ * inject a steer message without overwriting the active taskId or leaking
17
+ * session refCount.
18
+ */
19
+ skipRegistration?: boolean;
12
20
  }
13
21
  /**
14
22
  * Handle an incoming A2A message.