evolclaw 2.8.3 → 3.0.0

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 (105) hide show
  1. package/README.md +21 -12
  2. package/dist/agents/claude-runner.js +102 -38
  3. package/dist/agents/codex-runner.js +11 -14
  4. package/dist/agents/gemini-runner.js +10 -12
  5. package/dist/agents/resolve.js +134 -0
  6. package/dist/agents/templates.js +3 -3
  7. package/dist/aun/aid/agentmd.js +186 -0
  8. package/dist/aun/aid/client.js +134 -0
  9. package/dist/aun/aid/identity.js +131 -0
  10. package/dist/aun/aid/index.js +3 -0
  11. package/dist/aun/aid/types.js +1 -0
  12. package/dist/aun/aid/validation.js +21 -0
  13. package/dist/aun/msg/group.js +291 -0
  14. package/dist/aun/msg/index.js +4 -0
  15. package/dist/aun/msg/p2p.js +144 -0
  16. package/dist/aun/msg/payload-type.js +27 -0
  17. package/dist/aun/msg/upload.js +98 -0
  18. package/dist/aun/outbox.js +138 -0
  19. package/dist/aun/rpc/caller.js +42 -0
  20. package/dist/aun/rpc/connection.js +34 -0
  21. package/dist/aun/rpc/index.js +2 -0
  22. package/dist/aun/storage/download.js +29 -0
  23. package/dist/aun/storage/index.js +3 -0
  24. package/dist/aun/storage/manage.js +10 -0
  25. package/dist/aun/storage/upload.js +35 -0
  26. package/dist/channels/aun.js +1051 -288
  27. package/dist/channels/dingtalk.js +58 -5
  28. package/dist/channels/feishu.js +266 -30
  29. package/dist/channels/qqbot.js +67 -12
  30. package/dist/channels/wechat.js +61 -4
  31. package/dist/channels/wecom.js +58 -5
  32. package/dist/cli/agent.js +800 -0
  33. package/dist/cli/index.js +4253 -0
  34. package/dist/{utils → cli}/init-channel.js +211 -621
  35. package/dist/cli/init.js +178 -0
  36. package/dist/config-store.js +613 -0
  37. package/dist/core/{agent-loader.js → baseagent-loader.js} +6 -12
  38. package/dist/core/channel-loader.js +162 -11
  39. package/dist/core/command-handler.js +858 -847
  40. package/dist/core/evolagent-registry.js +191 -371
  41. package/dist/core/evolagent.js +203 -234
  42. package/dist/core/interaction-router.js +52 -5
  43. package/dist/core/message/im-renderer.js +480 -0
  44. package/dist/core/message/items-formatter.js +61 -0
  45. package/dist/core/message/message-bridge.js +104 -56
  46. package/dist/core/message/message-log.js +91 -0
  47. package/dist/core/message/message-processor.js +309 -142
  48. package/dist/core/message/message-queue.js +3 -3
  49. package/dist/core/permission.js +21 -8
  50. package/dist/core/session/adapters/codex-session-file-adapter.js +24 -2
  51. package/dist/core/session/session-fs-store.js +230 -0
  52. package/dist/core/session/session-manager.js +704 -775
  53. package/dist/core/session/session-mapper.js +87 -0
  54. package/dist/core/trigger/manager.js +122 -0
  55. package/dist/core/trigger/parser.js +128 -0
  56. package/dist/core/trigger/scheduler.js +224 -0
  57. package/dist/{templates → data}/prompts.md +34 -1
  58. package/dist/index.js +431 -275
  59. package/dist/ipc.js +49 -0
  60. package/dist/paths.js +82 -9
  61. package/dist/types.js +8 -2
  62. package/dist/utils/atomic-write.js +79 -0
  63. package/dist/utils/channel-helpers.js +46 -0
  64. package/dist/utils/cross-platform.js +0 -18
  65. package/dist/utils/instance-registry.js +433 -0
  66. package/dist/utils/log-writer.js +216 -0
  67. package/dist/utils/logger.js +24 -77
  68. package/dist/utils/media-cache.js +23 -0
  69. package/dist/utils/{upgrade.js → npm-ops.js} +52 -21
  70. package/dist/utils/process-introspect.js +144 -0
  71. package/dist/utils/stats.js +192 -0
  72. package/dist/watch-msg.js +529 -0
  73. package/evolclaw-install-aun.md +114 -46
  74. package/kits/aun/meta.md +25 -0
  75. package/kits/aun/role.md +25 -0
  76. package/kits/channels/aun.md +25 -0
  77. package/kits/evolclaw/commands.md +31 -0
  78. package/kits/evolclaw/identity-tools.md +26 -0
  79. package/kits/evolclaw/self-summary.md +29 -0
  80. package/kits/evolclaw/tools.md +25 -0
  81. package/kits/templates/group.md +20 -0
  82. package/kits/templates/private.md +9 -0
  83. package/kits/templates/system-fragments/personal-context.md +3 -0
  84. package/kits/templates/system-fragments/self-intro.md +5 -0
  85. package/kits/templates/system-fragments/speaker-intro.md +5 -0
  86. package/kits/templates/system-fragments/venue-intro.md +5 -0
  87. package/package.json +7 -5
  88. package/data/evolclaw.sample.json +0 -60
  89. package/dist/channels/aun-ops.js +0 -275
  90. package/dist/cli.js +0 -2178
  91. package/dist/config.js +0 -591
  92. package/dist/core/agent-registry.js +0 -450
  93. package/dist/core/evolagent-schema.js +0 -72
  94. package/dist/core/message/stream-flusher.js +0 -238
  95. package/dist/core/message/thought-emitter.js +0 -162
  96. package/dist/core/reload-hooks.js +0 -87
  97. package/dist/prompts/templates.js +0 -122
  98. package/dist/templates/skills.md +0 -66
  99. package/dist/utils/channel-fingerprint.js +0 -59
  100. package/dist/utils/error-dict.js +0 -63
  101. package/dist/utils/format.js +0 -32
  102. package/dist/utils/init.js +0 -645
  103. package/dist/utils/migrate-project.js +0 -122
  104. package/dist/utils/reload-hooks.js +0 -87
  105. package/dist/utils/stats-collector.js +0 -99
@@ -1,59 +0,0 @@
1
- /**
2
- * Channel Fingerprint
3
- *
4
- * 为每个 channel 实例提取一个全局唯一标识,用于冲突检测和路由索引。
5
- * 格式:{type}:{primaryKey}
6
- */
7
- /** Channel 类型 → 主键字段映射 */
8
- const PRIMARY_KEY_MAP = {
9
- feishu: 'appId',
10
- aun: 'aid',
11
- wechat: 'token',
12
- wecom: 'botId',
13
- dingtalk: 'clientId',
14
- qqbot: 'appId',
15
- };
16
- export function extractFingerprint(channelType, instance) {
17
- const keyField = PRIMARY_KEY_MAP[channelType];
18
- if (!keyField)
19
- return null;
20
- const value = instance[keyField];
21
- if (!value || typeof value !== 'string')
22
- return null;
23
- return `${channelType}:${value}`;
24
- }
25
- export function detectDuplicates(config) {
26
- const seen = new Map();
27
- const channels = config.channels || {};
28
- for (const [type, raw] of Object.entries(channels)) {
29
- if (type === 'defaultChannel')
30
- continue;
31
- const instances = Array.isArray(raw) ? raw : [raw];
32
- for (const inst of instances) {
33
- if (!inst || typeof inst !== 'object')
34
- continue;
35
- const fingerprint = extractFingerprint(type, inst);
36
- if (!fingerprint)
37
- continue;
38
- const instName = inst.name ?? type;
39
- const entry = seen.get(fingerprint);
40
- if (entry) {
41
- entry.instances.push(instName);
42
- }
43
- else {
44
- seen.set(fingerprint, { channelType: type, instances: [instName] });
45
- }
46
- }
47
- }
48
- const duplicates = [];
49
- for (const [fingerprint, entry] of seen) {
50
- if (entry.instances.length > 1) {
51
- duplicates.push({
52
- fingerprint,
53
- channelType: entry.channelType,
54
- instances: entry.instances,
55
- });
56
- }
57
- }
58
- return duplicates;
59
- }
@@ -1,63 +0,0 @@
1
- import fs from 'fs';
2
- import { logger } from './logger.js';
3
- let rules = [];
4
- /**
5
- * 加载错误字典文件
6
- * 文件不存在或格式错误 → 警告日志,rules = [](不影响启动)
7
- */
8
- export function loadErrorDict(dictPath) {
9
- try {
10
- if (!fs.existsSync(dictPath)) {
11
- logger.debug('[error-dict] 字典文件不存在,使用内置规则: %s', dictPath);
12
- rules = [];
13
- return;
14
- }
15
- const raw = JSON.parse(fs.readFileSync(dictPath, 'utf-8'));
16
- if (!Array.isArray(raw?.rules)) {
17
- logger.warn('[error-dict] 字典格式错误(缺少 rules 数组),忽略: %s', dictPath);
18
- rules = [];
19
- return;
20
- }
21
- // 校验每条规则的必填字段
22
- rules = raw.rules.filter((r) => {
23
- if (!r.id || !r.match || !r.action) {
24
- logger.warn('[error-dict] 跳过无效规则(缺少 id/match/action): %o', r);
25
- return false;
26
- }
27
- if (!['retry', 'stop', 'ignore'].includes(r.action)) {
28
- logger.warn('[error-dict] 跳过无效 action "%s": %s', r.action, r.id);
29
- return false;
30
- }
31
- return true;
32
- });
33
- logger.info('[error-dict] 已加载 %d 条规则: %s', rules.length, dictPath);
34
- }
35
- catch (err) {
36
- logger.warn('[error-dict] 加载失败: %s — %s', dictPath, err.message);
37
- rules = [];
38
- }
39
- }
40
- /** 运行时重新加载(供 /reload 命令使用) */
41
- export function reloadErrorDict(dictPath) {
42
- loadErrorDict(dictPath);
43
- }
44
- /**
45
- * 匹配错误消息,返回首条命中的规则
46
- * @param errorMessage 已 toLowerCase 的错误消息
47
- */
48
- export function matchErrorRule(errorMessage) {
49
- for (const rule of rules) {
50
- if (errorMessage.includes(rule.match.toLowerCase())) {
51
- return rule;
52
- }
53
- }
54
- return null;
55
- }
56
- /** 获取当前已加载的规则数量(供测试和状态查询使用) */
57
- export function getLoadedRuleCount() {
58
- return rules.length;
59
- }
60
- /** 重置规则(仅供测试使用) */
61
- export function _resetRules() {
62
- rules = [];
63
- }
@@ -1,32 +0,0 @@
1
- // ── Markdown → Plain Text ───────────────────────────────────────────────────
2
- export function markdownToPlainText(text) {
3
- let result = text;
4
- // Code blocks: strip fences, keep content
5
- result = result.replace(/```[^\n]*\n?([\s\S]*?)```/g, (_, code) => code.trim());
6
- // Images: remove entirely
7
- result = result.replace(/!\[[^\]]*\]\([^)]*\)/g, '');
8
- // Links: keep display text only
9
- result = result.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1');
10
- // Tables: remove separator rows
11
- result = result.replace(/^\|[\s:|-]+\|$/gm, '');
12
- result = result.replace(/^\|(.+)\|$/gm, (_, inner) => inner.split('|').map(cell => cell.trim()).join(' '));
13
- // Bold/italic
14
- result = result.replace(/\*\*(.+?)\*\*/g, '$1');
15
- result = result.replace(/\*(.+?)\*/g, '$1');
16
- result = result.replace(/__(.+?)__/g, '$1');
17
- result = result.replace(/_(.+?)_/g, '$1');
18
- // Strikethrough
19
- result = result.replace(/~~(.+?)~~/g, '$1');
20
- // Inline code
21
- result = result.replace(/`([^`]+)`/g, '$1');
22
- // Headers
23
- result = result.replace(/^#{1,6}\s+/gm, '');
24
- // Blockquotes
25
- result = result.replace(/^>\s?/gm, '');
26
- // Horizontal rules
27
- result = result.replace(/^[-*_]{3,}$/gm, '');
28
- // List markers
29
- result = result.replace(/^(\s*)[-*+]\s/gm, '$1');
30
- result = result.replace(/^(\s*)\d+\.\s/gm, '$1');
31
- return result.trim();
32
- }