@ynhcj/xiaoyi-channel 0.0.105-beta → 0.0.107-beta

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/index.js CHANGED
@@ -8,35 +8,50 @@ import { extractResultText, processText, parseSecurityResult, validateAndTruncat
8
8
  import { selfEvolutionManager } from "./src/utils/self-evolution-manager.js";
9
9
  import { TOOL_CALL_NUDGE_THRESHOLD, toolCallNudgeManager, } from "./src/utils/tool-call-nudge-manager.js";
10
10
  import { ALLOWED_TOOLS, MIN_TEXT_LENGTH, MAX_TOTAL_LENGTH, MAX_TEXT_LENGTH, STEER_ABORT_MESSAGE, } from "./src/cspl/constants.js";
11
- const SELF_EVOLUTION_NUDGE_MESSAGE = "[系统消息,非用户发言,无需主动告知用户] 当前任务已经调用了较多工具。如果你识别到其中存在稳定、可复用的踩坑经验或排错模式,可以在完成当前主要任务后,正式回复用户前,阅读xiaoyi-self-evolution技能了解自进化规则。注意,不要打断当前主任务,以完成任务为最高优先级。";
12
- const SELF_EVOLUTION_KEYWORD_NUDGE_MESSAGE = "[系统消息,非用户发言,无需主动告知用户] 当前用户请求中可能包含希望沉淀经验、避免重复踩坑的意图。如果你已经从当前问题中识别出稳定、可复用的处理规则或排错经验,可以在完成当前主要任务后,正式回复用户前,阅读xiaoyi-self-evolution技能了解自进化规则。注意,不要打断当前主任务,以完成任务为最高优先级。";
11
+ const SELF_EVOLUTION_NUDGE_MESSAGE = "[系统消息,非用户发言,无需主动告知用户] 当前任务已经调用了较多次数的工具。如果你识别到其中存在可复用的解决方法或踩坑经验等,可以在完成当前主要任务后,正式回复用户前,阅读xiaoyi-self-evolution技能了解自进化规则。注意,不要打断当前主任务,以完成任务为最高优先级。";
12
+ const SELF_EVOLUTION_KEYWORD_NUDGE_MESSAGE = "[系统消息,非用户发言,无需主动告知用户] 当前用户请求中可能包含用户长期偏好、行为纠正意图、经验沉淀需求。如果你已经从当前问题中识别出稳定、可复用的处理规则或排错经验,或者用户表达了明显的具备长期约束力的纠错与反馈,可以在完成当前主要任务后,正式回复用户前,阅读xiaoyi-self-evolution技能了解自进化规则。注意,不要打断当前主任务,以完成任务为最高优先级。";
13
13
  const SELF_EVOLUTION_KEYWORD_PATTERNS = [
14
14
  /进化/u,
15
+ /沉淀/u,
15
16
  /记住/u,
16
- /永远/u,
17
- /下次必须/u,
18
- /沉淀为/u,
19
- /总结为/u,
20
- /归纳为/u,
21
- /以后(?:不要再犯|别再犯|必须|注意|记住)/u,
22
- /记住这个坑/u,
23
- /避免下次/u,
24
- /别再踩坑/u,
25
- /不要再踩坑/u,
26
- /下次(?:别再|不要再)/u,
27
- /以后(?:别再|不要再)(?:出错|犯错|漏掉|踩坑)/u,
28
- /这个坑要记住/u,
29
- /记住这次(?:教训|经验|问题)/u,
30
- /吸取这次(?:教训|经验)/u,
31
- /总结(?:一下)?这个坑/u,
32
- /把这个(?:经验|教训|规则)记住/u,
33
- /以后按这个规则/u,
17
+ /记下来/u,
18
+ /记一下/u,
19
+ /长期记住/u,
20
+ /永久记住/u,
21
+ /永远记住/u,
22
+ /形成规范/u,
23
+ /固化下来/u,
24
+ /固定下来/u,
25
+ /记成规则/u,
26
+ /纳入经验/u,
27
+ /写入经验/u,
28
+ /沉淀成(?:经验|规则|规范|流程)/u,
29
+ /总结成(?:经验|规则|规范|流程|步骤)/u,
30
+ /归纳成(?:经验|规则|规范|流程)/u,
31
+ /提炼成(?:经验|规则|规范|流程)/u,
34
32
  /以后都按这个来/u,
35
- /以后遇到这种情况/u,
36
- /类似情况(?:下)?不要再/u,
37
- /这种问题下次不能再出现/u,
38
- /永远不要再(?:犯|踩|漏)/u,
39
- /永远记住这次(?:教训|经验)/u,
33
+ /下次都这样处理/u,
34
+ /以后统一这样/u,
35
+ /后面都这样/u,
36
+ /后续按这个(?:规范|流程|模板|方案)/u,
37
+ /以后(?:遇到|碰到)这种情况/u,
38
+ /类似(?:问题|情况|场景)都这样处理/u,
39
+ /避免(?:再次|以后|下次)/u,
40
+ /避免再(?:犯|错|踩坑|出错)/u,
41
+ /防止以后再犯/u,
42
+ /别再(?:出错|犯错|踩坑|漏掉|忘记)/u,
43
+ /不要再(?:出错|犯错|踩坑|漏掉|忘记)/u,
44
+ /下次别再/u,
45
+ /以后不要再/u,
46
+ /以后别再/u,
47
+ /这个坑(?:要)?记住/u,
48
+ /吸取这次(?:教训|经验)/u,
49
+ /(?:以后|下次|后续|之后)(?:都|统一|默认|应该|要|就)?(?:按这个|这样|这么)(?:来|做|处理|执行)/u,
50
+ /(?:以后|下次|后续|之后)(?:遇到|碰到)(?:类似)?(?:问题|情况|场景)(?:时)?(?:都|就)?(?:按这个|这样|这么)(?:来|做|处理|执行)/u,
51
+ /(?:别再|不要再|避免)(?:犯错|出错|踩坑|漏掉|遗漏|忘记)/u,
52
+ /(?:总结|归纳|提炼|沉淀|复盘)(?:一下)?(?:这次|这个)?(?:经验|教训|问题|规则|规范|流程)?/u,
53
+ /(?:把)?这次(?:经验|教训|规则|做法)(?:记住|记下来|沉淀下来|固化下来)/u,
54
+ /(?:形成|整理成|沉淀成|提炼成)(?:一套)?(?:规则|规范|流程|步骤|最佳实践)/u,
40
55
  ];
41
56
  function shouldCountToolCall(toolName) {
42
57
  if (toolName === "save_self_evolution_skill") {
@@ -8,7 +8,6 @@ import { viewPushResultTool } from "./tools/view-push-result-tool.js";
8
8
  import { imageReadingTool } from "./tools/image-reading-tool.js";
9
9
  import { timestampToUtc8Tool } from "./tools/timestamp-to-utc8-tool.js";
10
10
  import { saveSelfEvolutionSkillTool } from "./tools/save-self-evolution-skill-tool.js";
11
- import { getEmailToolSchemaTool } from "./tools/get-email-tool-schema.js";
12
11
  import { callDeviceTool } from "./tools/call-device-tool.js";
13
12
  import { getNoteToolSchemaTool } from "./tools/get-note-tool-schema.js";
14
13
  import { getCalendarToolSchemaTool } from "./tools/get-calendar-tool-schema.js";
@@ -17,10 +16,6 @@ import { getPhotoToolSchemaTool } from "./tools/get-photo-tool-schema.js";
17
16
  import { getDeviceFileToolSchemaTool } from "./tools/get-device-file-tool-schema.js";
18
17
  import { getAlarmToolSchemaTool } from "./tools/get-alarm-tool-schema.js";
19
18
  import { getCollectionToolSchemaTool } from "./tools/get-collection-tool-schema.js";
20
- import { queryAppMessageTool } from "./tools/query-app-message-tool.js";
21
- import { queryMemoryDataTool } from "./tools/query-memory-data-tool.js";
22
- import { queryTodoTaskTool } from "./tools/query-todo-task-tool.js";
23
- import { loginTokenTool } from "./tools/login-token-tool.js";
24
19
  import { filterToolsByDevice } from "./tools/device-tool-map.js";
25
20
  import { getCurrentSessionContext } from "./tools/session-manager.js";
26
21
  import { logger } from "./utils/logger.js";
@@ -63,7 +58,7 @@ export const xyPlugin = {
63
58
  },
64
59
  outbound: xyOutbound,
65
60
  agentTools: () => {
66
- const allTools = [locationTool, callDeviceTool, getNoteToolSchemaTool, getCalendarToolSchemaTool, getContactToolSchemaTool, getPhotoToolSchemaTool, xiaoyiGuiTool, getDeviceFileToolSchemaTool, getAlarmToolSchemaTool, getCollectionToolSchemaTool, sendFileToUserTool, viewPushResultTool, imageReadingTool, timestampToUtc8Tool, saveSelfEvolutionSkillTool, getEmailToolSchemaTool, queryAppMessageTool, queryMemoryDataTool, queryTodoTaskTool, loginTokenTool];
61
+ const allTools = [locationTool, callDeviceTool, getNoteToolSchemaTool, getCalendarToolSchemaTool, getContactToolSchemaTool, getPhotoToolSchemaTool, xiaoyiGuiTool, getDeviceFileToolSchemaTool, getAlarmToolSchemaTool, getCollectionToolSchemaTool, sendFileToUserTool, viewPushResultTool, imageReadingTool, timestampToUtc8Tool, saveSelfEvolutionSkillTool];
67
62
  const ctx = getCurrentSessionContext();
68
63
  const filtered = filterToolsByDevice(allTools, ctx?.deviceType);
69
64
  logger.log(`[DEVICE-FILTER] deviceType=${ctx?.deviceType ?? "(none)"}, tools: ${allTools.length} → ${filtered.length} (${filtered.map(t => t.name).join(", ")})`);
@@ -11,8 +11,8 @@ import { createHash } from "crypto";
11
11
  import { getCurrentSessionContext } from "./tools/session-manager.js";
12
12
  import { selfEvolutionManager } from "./utils/self-evolution-manager.js";
13
13
  // ── Retry config ──────────────────────────────────────────────
14
- const RETRY_DELAYS_MS = [10_000, 20_000, 40_000, 60_000];
15
- const MAX_RETRY_ATTEMPTS = 4;
14
+ const RETRY_DELAYS_MS = [10_000, 20_000, 40_000, 60_000, 60_000];
15
+ const MAX_RETRY_ATTEMPTS = 5;
16
16
  /** Check if an errorMessage indicates a retryable provider error by type. */
17
17
  function isRetryableProviderError(message) {
18
18
  if (!message)
@@ -361,10 +361,9 @@ export const xiaoyiProvider = {
361
361
  const traceId = ctx.extraParams[HEADER_TRACE_ID];
362
362
  const sessionId = ctx.extraParams[HEADER_SESSION_ID];
363
363
  const interactionId = ctx.extraParams[HEADER_INTERACTION_ID];
364
- const ts = `_${Date.now()}`;
365
364
  if (typeof traceId === "string") {
366
365
  const isCron = isCronTriggered(context.messages);
367
- dynamicHeaders[HEADER_TRACE_ID] = isCron ? `cron_${traceId}${ts}` : `${traceId}${ts}`;
366
+ dynamicHeaders[HEADER_TRACE_ID] = isCron ? `cron_${traceId}_${Date.now()}` : traceId;
368
367
  if (isCron) {
369
368
  const cronTitle = extractCronTitle(context.messages);
370
369
  if (cronTitle)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ynhcj/xiaoyi-channel",
3
- "version": "0.0.105-beta",
3
+ "version": "0.0.107-beta",
4
4
  "description": "OpenClaw Xiaoyi Channel plugin - Xiaoyi A2A protocol integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",