libp2p-mesh 2026.6.15 → 2026.6.17

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.
@@ -9,12 +9,23 @@ const FIELD_LINE_PATTERN = /^(?:[-*]\s*)?(?:#{1,6}\s*)?(name|what to call them|n
9
9
  const TEMPLATE_PATTERN = /\b(?:todo|tbd|n\/a|none|unknown|your name|add notes here|template placeholder|placeholder)\b/i;
10
10
  const EXPLICIT_LIST_SEPARATOR_PATTERN = /[,,、;;|/]/;
11
11
  const ENGLISH_TAG_PATTERN = /^(?:[A-Za-z][A-Za-z0-9]*(?:\.[A-Za-z0-9]+)?|libp2p|node\.js)$/i;
12
+ const TECH_TOKEN_PATTERN = /\b(?:[A-Z][A-Z0-9]{1,}|[A-Za-z]*[0-9][A-Za-z0-9]*|libp2p|node\.js)\b/g;
12
13
  const CHINESE_TAG_PATTERN = /[\p{Script=Han}]{2,8}/gu;
13
14
  const CHINESE_CONTEXT_PATTERNS = [
14
15
  /(?:在|来自|加入|参与|负责)([\p{Script=Han}]{2,8})(?:做|写|用|项目|团队|实验室|方向)?/gu,
15
16
  /(?:做|写|维护|负责|参与)([\p{Script=Han}]{2,8})(?:项目|插件|工具|方向)?/gu,
16
17
  ];
17
18
  const CHINESE_SENTENCE_WORD_PATTERN = /(?:今天|明天|昨天|今晚|晚上|早上|上午|下午|八点|同步|一下|进展|开会|讨论|安排|提醒|需要|已经|可以|应该|我们|你们|他们)/u;
19
+ const CHINESE_STOP_WORDS = new Set([
20
+ "关于",
21
+ "正在",
22
+ "当前",
23
+ "相关",
24
+ "工作",
25
+ "项目",
26
+ "网络",
27
+ "专注",
28
+ ]);
18
29
  const COMMON_WORDS = new Set([
19
30
  "and",
20
31
  "also",
@@ -43,6 +54,17 @@ const ENGLISH_TAG_FIELDS = new Set([
43
54
  "interest",
44
55
  "interests",
45
56
  ]);
57
+ const TECH_TOKEN_FIELDS = new Set([
58
+ "notes",
59
+ "note",
60
+ "context",
61
+ "project",
62
+ "projects",
63
+ "skill",
64
+ "skills",
65
+ "interest",
66
+ "interests",
67
+ ]);
46
68
  export function resolveUserMdPath(customPath) {
47
69
  if (customPath) {
48
70
  return customPath;
@@ -58,11 +80,14 @@ function isTemplateText(value) {
58
80
  return trimmed.length === 0 || TEMPLATE_PATTERN.test(trimmed) || /^\[[^\]]+\]$/.test(trimmed);
59
81
  }
60
82
  function stripMarkdown(line) {
83
+ return stripMarkdownSyntax(line).replace(FIELD_PREFIX_PATTERN, "").trim();
84
+ }
85
+ function stripMarkdownSyntax(line) {
61
86
  return line
62
- .replace(FIELD_PREFIX_PATTERN, "")
63
87
  .replace(/`([^`]+)`/g, "$1")
64
88
  .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
65
89
  .replace(/[*_~#>]/g, " ")
90
+ .replace(/\s+/g, " ")
66
91
  .trim();
67
92
  }
68
93
  function trimCandidate(value) {
@@ -79,8 +104,19 @@ function trimChineseCandidate(value) {
79
104
  }
80
105
  function isStableChineseCandidate(value) {
81
106
  return (/^[\p{Script=Han}]{2,8}$/u.test(value) &&
107
+ !CHINESE_STOP_WORDS.has(value) &&
82
108
  !CHINESE_SENTENCE_WORD_PATTERN.test(value));
83
109
  }
110
+ function collectTechnicalTokens(value) {
111
+ const tokens = [];
112
+ for (const match of value.matchAll(TECH_TOKEN_PATTERN)) {
113
+ const token = trimCandidate(match[0] ?? "");
114
+ if (isStableEnglishCandidate(token)) {
115
+ tokens.push(token);
116
+ }
117
+ }
118
+ return tokens;
119
+ }
84
120
  function collectChineseCandidates(value) {
85
121
  const candidates = [];
86
122
  for (const match of value.matchAll(CHINESE_TAG_PATTERN)) {
@@ -95,13 +131,14 @@ function looksLikeSentence(value) {
95
131
  return /[。.!?]/.test(value) || value.split(/\s+/).filter(Boolean).length > 4;
96
132
  }
97
133
  function fieldValue(line) {
98
- const match = line.match(FIELD_LINE_PATTERN);
134
+ const normalized = stripMarkdownSyntax(line);
135
+ const match = normalized.match(FIELD_LINE_PATTERN);
99
136
  if (!match) {
100
137
  return undefined;
101
138
  }
102
139
  return {
103
140
  field: (match[1] ?? "").toLowerCase(),
104
- value: stripMarkdown(match[2] ?? ""),
141
+ value: stripMarkdownSyntax(match[2] ?? ""),
105
142
  };
106
143
  }
107
144
  function isStableEnglishCandidate(value) {
@@ -147,6 +184,9 @@ function collectCandidates(line) {
147
184
  }
148
185
  const explicitField = fieldValue(line);
149
186
  const explicitFieldValue = explicitField?.value;
187
+ if (explicitField && TECH_TOKEN_FIELDS.has(explicitField.field)) {
188
+ candidates.push(...collectTechnicalTokens(explicitField.value));
189
+ }
150
190
  if (/^[\p{Script=Han}]{2,8}$/u.test(text) && isStableChineseCandidate(text)) {
151
191
  candidates.push(text);
152
192
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "libp2p-mesh",
3
- "version": "2026.6.15",
3
+ "version": "2026.6.17",
4
4
  "description": "OpenClaw libp2p P2P mesh network plugin for cross-instance agent communication",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,6 +16,7 @@ const TEMPLATE_PATTERN =
16
16
  /\b(?:todo|tbd|n\/a|none|unknown|your name|add notes here|template placeholder|placeholder)\b/i;
17
17
  const EXPLICIT_LIST_SEPARATOR_PATTERN = /[,,、;;|/]/;
18
18
  const ENGLISH_TAG_PATTERN = /^(?:[A-Za-z][A-Za-z0-9]*(?:\.[A-Za-z0-9]+)?|libp2p|node\.js)$/i;
19
+ const TECH_TOKEN_PATTERN = /\b(?:[A-Z][A-Z0-9]{1,}|[A-Za-z]*[0-9][A-Za-z0-9]*|libp2p|node\.js)\b/g;
19
20
  const CHINESE_TAG_PATTERN = /[\p{Script=Han}]{2,8}/gu;
20
21
  const CHINESE_CONTEXT_PATTERNS = [
21
22
  /(?:在|来自|加入|参与|负责)([\p{Script=Han}]{2,8})(?:做|写|用|项目|团队|实验室|方向)?/gu,
@@ -23,6 +24,16 @@ const CHINESE_CONTEXT_PATTERNS = [
23
24
  ];
24
25
  const CHINESE_SENTENCE_WORD_PATTERN =
25
26
  /(?:今天|明天|昨天|今晚|晚上|早上|上午|下午|八点|同步|一下|进展|开会|讨论|安排|提醒|需要|已经|可以|应该|我们|你们|他们)/u;
27
+ const CHINESE_STOP_WORDS = new Set([
28
+ "关于",
29
+ "正在",
30
+ "当前",
31
+ "相关",
32
+ "工作",
33
+ "项目",
34
+ "网络",
35
+ "专注",
36
+ ]);
26
37
  const COMMON_WORDS = new Set([
27
38
  "and",
28
39
  "also",
@@ -51,6 +62,17 @@ const ENGLISH_TAG_FIELDS = new Set([
51
62
  "interest",
52
63
  "interests",
53
64
  ]);
65
+ const TECH_TOKEN_FIELDS = new Set([
66
+ "notes",
67
+ "note",
68
+ "context",
69
+ "project",
70
+ "projects",
71
+ "skill",
72
+ "skills",
73
+ "interest",
74
+ "interests",
75
+ ]);
54
76
 
55
77
  export type UserMdAttributeSource = {
56
78
  path?: string;
@@ -79,11 +101,15 @@ function isTemplateText(value: string): boolean {
79
101
  }
80
102
 
81
103
  function stripMarkdown(line: string): string {
104
+ return stripMarkdownSyntax(line).replace(FIELD_PREFIX_PATTERN, "").trim();
105
+ }
106
+
107
+ function stripMarkdownSyntax(line: string): string {
82
108
  return line
83
- .replace(FIELD_PREFIX_PATTERN, "")
84
109
  .replace(/`([^`]+)`/g, "$1")
85
110
  .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
86
111
  .replace(/[*_~#>]/g, " ")
112
+ .replace(/\s+/g, " ")
87
113
  .trim();
88
114
  }
89
115
 
@@ -104,10 +130,24 @@ function trimChineseCandidate(value: string): string {
104
130
  function isStableChineseCandidate(value: string): boolean {
105
131
  return (
106
132
  /^[\p{Script=Han}]{2,8}$/u.test(value) &&
133
+ !CHINESE_STOP_WORDS.has(value) &&
107
134
  !CHINESE_SENTENCE_WORD_PATTERN.test(value)
108
135
  );
109
136
  }
110
137
 
138
+ function collectTechnicalTokens(value: string): string[] {
139
+ const tokens: string[] = [];
140
+
141
+ for (const match of value.matchAll(TECH_TOKEN_PATTERN)) {
142
+ const token = trimCandidate(match[0] ?? "");
143
+ if (isStableEnglishCandidate(token)) {
144
+ tokens.push(token);
145
+ }
146
+ }
147
+
148
+ return tokens;
149
+ }
150
+
111
151
  function collectChineseCandidates(value: string): string[] {
112
152
  const candidates: string[] = [];
113
153
 
@@ -126,14 +166,15 @@ function looksLikeSentence(value: string): boolean {
126
166
  }
127
167
 
128
168
  function fieldValue(line: string): { field: string; value: string } | undefined {
129
- const match = line.match(FIELD_LINE_PATTERN);
169
+ const normalized = stripMarkdownSyntax(line);
170
+ const match = normalized.match(FIELD_LINE_PATTERN);
130
171
  if (!match) {
131
172
  return undefined;
132
173
  }
133
174
 
134
175
  return {
135
176
  field: (match[1] ?? "").toLowerCase(),
136
- value: stripMarkdown(match[2] ?? ""),
177
+ value: stripMarkdownSyntax(match[2] ?? ""),
137
178
  };
138
179
  }
139
180
 
@@ -191,6 +232,10 @@ function collectCandidates(line: string): string[] {
191
232
  const explicitField = fieldValue(line);
192
233
  const explicitFieldValue = explicitField?.value;
193
234
 
235
+ if (explicitField && TECH_TOKEN_FIELDS.has(explicitField.field)) {
236
+ candidates.push(...collectTechnicalTokens(explicitField.value));
237
+ }
238
+
194
239
  if (/^[\p{Script=Han}]{2,8}$/u.test(text) && isStableChineseCandidate(text)) {
195
240
  candidates.push(text);
196
241
  }